2013-11-20 18 views
6

在mmap()的手册页:为什么文件中MMAP启动时偏移()必须是多页面大小的

它的原型是:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); 

和说明:

The mmap() function asks to map 'length' bytes starting at offset 'offset' 
from the file (or other object) specified by the file descriptor fd into 
memory, preferably at address 'start'. 

Sepcifically ,最后一个参数:

'offset' should be a multiple of the page size as returned by getpagesize(2). 

从我的练习中,offset必须是页面大小的倍数,例如我的Linux上的4096,否则,mmap()将返回Invalid argument,offset用于文件偏移,为什么它必须是虚拟内存系统页面大小的倍数?

谢谢,

回答

4

简单的答案:使其快速。更复杂的答案是:无论何时在映射内存中的某个位置访问内存时,操作系统都必须确保该位置填充了文件的内容。但操作系统只能检测您是否访问内存页 - 而不是单个位置。它的功能是在文件和内存页面的偏移量之间创建一个简单的关系,并且每当访问内存页面时,都会加载文件的该部分。为了快速进行这些计算,它会限制您从某些偏移开始。

+1

“操作系统必须确保这个位置充满文件的内容,但操作系统只能检测您是否访问内存页面 - 而不是单个位置。”你能在这里更简单明了吗?无法吸收。谢谢! –

+0

@GauravMinocha操作系统只能检测到整个页面正在被读取(在本例中为4096字节),而不是单个字节地址(RAM中的每个单字节内存都可以被寻址)。因此,文件的整个页面一次加载。 – jwbensley

-2

所有进程的内存都是虚拟的。
“虚拟内存”是映射到物理RAM的硬盘上的空间。

在硬盘上,数据存储在称为 磁道的薄同心圆段中。

操作系统要求以线性连续的方式查看空间。
HDD制造商在整个90年代都采用了这种模式。

HDD上最小的可分配单元是一个扇区, 它是512字节大......半千字节。

从操作系统的角度来看,Windows上的NTFS为HDD上最小的可分配单元提供了4096字节的默认值。

这将是一个由四个扇区组成的群集......一个页面的大小。

来源:http://ntfs.com/hard-disk-basics.htm

一个页面通常是4096个字节大,因为英特尔的x86 MMU地图数据存储...

通过一系列的表格,二要准确。它们是分页 目录和分页表。两个表都包含1024 4byte 条目,使它们每个4kb。

在页表中,每个条目指向的物理地址是 ,然后映射到通过计算目录内的偏移量 和表内的偏移量找到的虚拟地址。

请注意,这意味着页面可以比4096更大,
但它是最小可能的单元尺寸为MMU!

来源:http://wiki.osdev.org/Paging#MMU

结论:
大小由那些谁编程/设计的操作系统确定。它可以是4096字节的任何倍数。

相关问题