Mmap分配多个页面

时间:2017-09-18 09:11:15

标签: c linux memory-management kernel

所以我在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给了我不止一页吗?

1 个答案:

答案 0 :(得分:3)

  

我的理解是,行p [5000] = 3应该生成页面错误

不,将p解引用到未分配的内存是未定义的行为:它并不意味着您的程序必须是段错误。

例如,p[5000]仍然可以访问您的进程拥有的内存,因此不会发生段错误。

  

代码有效。那么mmap会给我多个页面吗?

不,你没有得到段错误的事实并不意味着代码是正确的。

来自mmap的手册页:

  

length参数指定映射的长度。