![确保虚拟地址位于页面的开头](https://linux22.com/image/128006/%E7%A1%AE%E4%BF%9D%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%E4%BD%8D%E4%BA%8E%E9%A1%B5%E9%9D%A2%E7%9A%84%E5%BC%80%E5%A4%B4.png)
为什么 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)
...)