为什么mmap()中的文件起始偏移量必须是页面大小的倍数

时间:2013-11-20 10:33:14

标签: offset mmap page-size

在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'.

顺便提一下,对于最后一个论点:

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

根据我的实践,offset必须是页面大小的倍数,例如,我的Linux上为4096,否则,mmap()将返回Invalid argumentoffset是文件偏移量,为什么它必须是虚拟内存系统页面大小的倍数?

谢谢,

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:-3)

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

  

在硬盘上,数据存储在称为薄的同心带中   轨道。

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

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

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

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

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

一个页面通常是4096字节大,因为英特尔的x86 MMU映射内存......

  

通过一系列表格,准确地说是两个。他们是传呼   目录和分页表。两个表都包含1024 4byte   条目,每个4kb。

     

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

请注意,这意味着 的页面可能大于4096,
但它是MMU的最小可能的单位大小!

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

<强>结论:
大小由编程/设计操作系统的人决定。它可以是4096字节的任意倍数。

相关问题