为什么 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;
}
答案1
获取一些页面对齐的指针(指向您的一些新分配的新段)虚拟地址空间), 使用映射(2)(或者posix_memalign(3)....)
要查找页面的大小(通常但并非总是 4Kbytes),请使用获取页面大小(2)或者最好是系统配置(3)和_SC_PAGE_SIZE
。因此,如果指针不适合int
(这很可能是首选intptr_t
)或者页面大小不是 4K,则您的代码是错误的。
也可以看看过程(5),例如查询 pid 1234 的进程的虚拟地址空间和cat /proc/1234/maps
/或使用映射(1)命令。
顺便提一句分配(3)通常不会返回页面对齐的指针(因此您str
通常无法满足测试( ((int)str) & 0x00000FFF) != 0)
...)