gpt4 book ai didi

linux - 调用 mmap 后文件的路径名在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:47 24 4
gpt4 key购买 nike

char *p = (char*) mmap(...);
....; /* check if p is not -1 */
a = *p;

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

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

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

最佳答案

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

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

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

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

关于linux - 调用 mmap 后文件的路径名在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38765651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com