2011-12-14 128 views
13

假设我使用/ dev/zero为mmap分配一个大内存(40MB),如下所示。使用/ dev/zero的mmap

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0); 

我不解的是,内核将初始化回忆到零页面被带入物理内存(我想现代的Linux内核使用按需分页)。因此,例如,当第一页被触摸并因此进入物理内存时,内核将其全部4096个字节初始化为零,然后当第二页被触摸时,它执行相同的操作,等等。

我的理解是否正确?

+2

简短的回答:是 – hirschhornsalz 2011-12-14 16:29:59

+0

只要触摸手段写,是的。否则,如果你只是从一个零页面读取,实际上只有一个零页面,在首次写入时将会被COW处理。 – ninjalj 2011-12-14 21:25:20

回答

11

是的,如果您第一次触摸它们,那么只有更多的页面才会生效。

顺便说一句,有这个标志MAP_ANONYMOUS,你可以在这种情况下使用,不需要打开/dev/null上的文件描述符。