【问题标题】:Where is the pathname of the file after mmap is called?调用 mmap 后文件的路径名在哪里?
【发布时间】:2016-08-04 11:07:16
【问题描述】:
char *p = (char*) mmap(...);
....; /* check if p is not -1 */
a = *p;

在运行最后一条语句时,发生页面错误。内核中的故障处理程序将在物理内存中分配一个页面并将文件中的 4K 字节复制到该页面中,然后修改页面条目。读取*p的指令将再次执行,这次成功。

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

如果进程的数据段中的一个页面被换出(我猜是交换文件)怎么办?当页面需要稍后换入时,内核如何知道从哪里复制?

【问题讨论】:

    标签: linux mmap pagefile


    【解决方案1】:

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

    它也不使用fd;您可以在mmap 调用之后立即将close 传递给mmapfd,并且映射仍然有效(这实际上在某些ulimits 较低的系统上对于打开文件句柄是必要的;您可以一次映射 10,000 个文件,但如果 fds 的 ulimit 为 1000,则您无法为所有文件打开 fds。

    发生的情况是,在mmap 时间,操作系统的虚拟内存管理器设置了一堆虚拟内存表,基本上说“此内存由以下磁盘扇区支持”。在检索已写入交换文件且必须读回的数据时,它使用非常相似的过程。唯一的区别在于内存和磁盘同步的积极程度,到特定磁盘扇区的映射是静态的还是动态的(尽管即使对于“真实”文件,磁盘扇区也可能在您运行时发生变化,例如,写入时写入时复制文件系统时),内存是否必须写入(交换)或可以简单地删除(mmap -ed 文件没有脏页)在内存压力等下。

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

    【讨论】:

    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多