浏览代码

memblock alignment

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7882 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 年之前
父节点
当前提交
278a9e73b0
共有 1 个文件被更改,包括 7 次插入5 次删除
  1. 7 5
      source/Generic.Unix.AMD64.Machine.Mod

+ 7 - 5
source/Generic.Unix.AMD64.Machine.Mod

@@ -177,11 +177,12 @@ VAR
 
 	(* expand heap by allocating a new memory block *)
 	PROCEDURE ExpandHeap*( dummy: LONGINT; size: SIZE; VAR memoryBlock: MemoryBlock; VAR beginBlockAdr, endBlockAdr: ADDRESS );
-	VAR mBlock: MemoryBlock;  alloc, s: SIZE;  a, adr: ADDRESS; 
+	VAR mBlock: MemoryBlock;  alloc, s, alignOffset: SIZE;  a, adr: ADDRESS; 
 	BEGIN 
 		IF size < (MemBlockSize - (2*BlockSize))  THEN  alloc := MemBlockSize  
 		ELSE  alloc := size + (2*BlockSize);
-		END;  
+		END; 
+		alloc := alloc + StaticBlockSize; 
 		INC( alloc, (-alloc) MOD Unix.PageSize );
 		
 		IF Unix.posix_memalign( adr, Unix.PageSize, alloc ) # 0 THEN
@@ -192,16 +193,17 @@ VAR
 			IF Unix.mprotect( adr, alloc, 7 (* READ WRITE EXEC *) ) # 0 THEN
 				Unix.Perror( "Machine.ExpandHeap: mprotect" )
 			END;
+			alignOffset := (-adr) MOD StaticBlockSize;
 			
 			mBlock := S.VAL( MemoryBlock, adr );  
 			mBlock.next := NIL;  
 			mBlock.startAdr := adr;
 			mBlock.size := alloc;  
-			mBlock.beginBlockAdr := adr + BlockSize - AddrSize;  
+			mBlock.beginBlockAdr := adr + BlockSize +alignOffset;  
 			
-			ASSERT( (mBlock.beginBlockAdr + AddrSize) MOD BlockSize = 0 );  
+			ASSERT( mBlock.beginBlockAdr MOD BlockSize = 0 );  
 
-			s := adr + alloc - mBlock.beginBlockAdr - BlockSize; 
+			s := adr + alloc - mBlock.beginBlockAdr;
 			DEC( s, s MOD BlockSize );  
 			ASSERT( s >= size );  
 			mBlock.endBlockAdr := mBlock.beginBlockAdr + s;