为什么 IF 条件会检查是否在 str
页面的开头找到了指向的虚拟地址?
int main () {
char *str ;
str = (char*) malloc (sizeof(char)*4);
if ( ((int)str) & 0x00000FFF) != 0) return 0; // ensure the VA is ..
// at the start of a page
strcpy ( str ,"1234567890") ;
printf ("str=%s", str ) ;
return 0;
}
要获得一些页面对齐的指针(指向一些新分配的虚拟地址空间的新段),请使用mmap(2)(或posix_memalign(3) ....)
要查找页面的大小(通常但不总是 4Kbytes),请使用getpagesize(2)或最好使用sysconf(3)和
_SC_PAGE_SIZE
. 因此,如果指针不适合int
(这很可能,更喜欢intptr_t
)或者页面大小不是 4K,那么您的代码就是错误的。另请参见proc(5)
cat /proc/1234/maps
,例如使用和/或使用pmap(1)命令查询 pid 1234 进程的虚拟地址空间。顺便说一句malloc(3)通常不返回页面对齐的指针(所以你
str
经常不能满足测试( ((int)str) & 0x00000FFF) != 0)
......)