所以我在x86-64 linux上,当我尝试mmap
一个字节时,我得到多个页面。这就是我的想法:当我分配一个字节时,我应该能够在那之后访问PAGE_SIZE
个字节。分页是如何工作的,对吧?我确认我系统上的PAGE_SIZE
是4096.但是,以下代码不会出现段错误:
#include <sys/mman.h>
#include <stdio.h>
int main()
{
char *p = mmap(0, 1, PROT_READ|PROT_WRITE, MAP_PRIVATE
|MAP_ANONYMOUS, -1, 0);
p[5000] = 3;
}
5000有一些大于PAGE_SIZE
的任意值。我的理解是,行p[5000] = 3
应该生成页面错误,页面错误处理程序应该意识到页面不属于我。但它并没有发生。代码有效。那么mmap
给了我不止一页吗?
答案 0 :(得分:3)
我的理解是,行p [5000] = 3应该生成页面错误
不,将p
解引用到未分配的内存是未定义的行为:它并不意味着您的程序必须是段错误。
例如,p[5000]
仍然可以访问您的进程拥有的内存,因此不会发生段错误。
代码有效。那么mmap会给我多个页面吗?
不,你没有得到段错误的事实并不意味着代码是正确的。
来自mmap
的手册页:
length参数指定映射的长度。