2016-08-04 36 views
1
char *p = (char*) mmap(...); 
....; /* check if p is not -1 */ 
a = *p; 

运行最后一条语句时,发生页面错误。内核中的错误处理程序将在物理内存中分配页面,并将4K字节从文件复制到该页面中,然后修改页面条目。读取*p的指令将在此次成功执行。调用mmap后文件的路径名称在哪里?

但是,错误处理程序如何知道与页面相关的文件名和路径。文件名(或fd)在哪里存储?和文件中的偏移量。

如果一个进程的数据段中的一个页面被换出(我想是一个交换文件)会怎么样?内核如何知道从何时开始复制页面以后需要交换页面?

回答

0

处理程序不知道文件名或路径,因为它不使用这些文件(可以告诉,因为即使在创建映射后从文件系统中删除该文件,映射也会继续工作得很好;文件内容保持有效,直到所有打开的文件描述符和内存映射关闭)。

它不使用fd; closefd在调用mmap之后立即传递给mmap,映射仍然有效(对于打开的文件句柄,这在某些系统中是必需的,对于低的ulimit;您可以一次映射10,000个文件,但是您如果fds的ulimit为1000,则不能对所有人持有开放fd s)。

发生什么事情是,在mmap时间,操作系统的虚拟内存管理器设置了一堆虚拟内存表,这些虚拟内存表基本上表示“该内存由以下磁盘扇区支持”。它在检索已写入交换文件并且必须重新读入的数据时使用了非常类似的过程。唯一的区别在于内存和磁盘同步化程度如何,映射到特定磁盘扇区是静态还是动态(尽管即使对于“真实”文件,磁盘扇区也可能随着运行而改变,例如,当写入写时复制文件系统时),存储器是必须被写入(交换)还是可以简单地被丢弃(mmap -ed文件没有脏页)在内存压力下等

有几层虚拟内存地址转换涉及CPU和操作系统的不同,所以确切的机制有所不同,但基本思想是在mmap ing之后,您正绕过目录结构并以忽略名称和路径之类的方式与底层磁盘扇区进行交互。

+0

谢谢ShadowRanger。在这种情况下,我在这个线程中错了,是不是? http://stackoverflow.com/questions/38850533/how-does-the-page-fault-handler-know-where-to-get-the-4k-bytes/38975619#38975619我以为我找到了答案。 – xiaokaoy

相关问题