确保虚拟地址位于页面的开头

确保虚拟地址位于页面的开头

为什么 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)...)

相关内容