Linux 调用mmap后文件的路径名在哪里?
运行最后一条语句时,出现页面错误。内核中的错误处理程序将在物理内存中分配一个页面,并将4K字节从文件复制到该页面,然后修改页面条目。读取Linux 调用mmap后文件的路径名在哪里?,linux,mmap,pagefile,Linux,Mmap,Pagefile,运行最后一条语句时,出现页面错误。内核中的错误处理程序将在物理内存中分配一个页面,并将4K字节从文件复制到该页面,然后修改页面条目。读取*p的指令将再次成功执行 但是错误处理程序如何知道与页面关联的文件名和路径呢。文件名(或fd)存储在哪里?以及文件中的偏移量 如果进程数据段中的一个页面被调出(我想是调出到一个调出文件中),该怎么办?当以后需要交换页面时,内核如何知道从何处进行复制?处理程序不知道文件名或路径,因为它不使用这些文件名或路径(您可以知道,因为即使在创建映射后从文件系统中删除了文件,
*p
的指令将再次成功执行
但是错误处理程序如何知道与页面关联的文件名和路径呢。文件名(或fd
)存储在哪里?以及文件中的偏移量
如果进程数据段中的一个页面被调出(我想是调出到一个调出文件中),该怎么办?当以后需要交换页面时,内核如何知道从何处进行复制?处理程序不知道文件名或路径,因为它不使用这些文件名或路径(您可以知道,因为即使在创建映射后从文件系统中删除了文件,映射仍然可以正常工作;在关闭所有打开的文件描述符和内存映射之前,文件内容仍然有效) 它也不使用
fd
;您可以在mmap
调用之后立即关闭传递给mmap
的fd
,映射仍然有效(对于打开的文件句柄,在某些具有低ulimit
s的系统上,这实际上是必要的;您可以一次映射10000个文件,但如果fds的ulimit
为1000,则无法为所有文件保持打开的fd
s)
发生的情况是,在mmap
时间,操作系统的虚拟内存管理器设置了一组虚拟内存表,基本上说“此内存由以下磁盘扇区支持”。在检索已写入交换文件且必须读回的数据时,它使用了非常类似的过程。唯一的区别在于内存和磁盘同步的程度,到特定磁盘扇区的映射是静态的还是动态的(即使是“真实的”)在文件中,磁盘扇区可能会随着您的运行而改变,例如,在写入即写拷贝文件系统时),内存是必须写入(交换)还是可以在内存压力下删除(mmap
-ed文件,不带脏页),等等
由于CPU和操作系统的不同,虚拟内存地址转换涉及多个层次,因此确切的机制也不同,但基本思想是,在
mmap
ing之后,您将绕过目录结构,以忽略名称和路径等内容的方式与底层磁盘扇区进行交互。处理程序不会这样做知道文件名或路径,因为它不使用这些名称或路径(您可以知道,因为即使在创建映射后从文件系统中删除了文件,映射仍然可以正常工作;在关闭所有打开的文件描述符和内存映射之前,文件内容仍然有效)
它也不使用fd
;您可以在mmap
调用之后立即关闭传递给mmap
的fd
,映射仍然有效(对于打开的文件句柄,在某些具有低ulimit
s的系统上,这实际上是必要的;您可以一次映射10000个文件,但如果fds的ulimit
为1000,则无法为所有文件保持打开的fd
s)
发生的情况是,在mmap
时间,操作系统的虚拟内存管理器设置了一组虚拟内存表,基本上说“此内存由以下磁盘扇区支持”。在检索已写入交换文件且必须读回的数据时,它使用了非常类似的过程。唯一的区别在于内存和磁盘同步的程度,到特定磁盘扇区的映射是静态的还是动态的(即使是“真实的”)在文件中,磁盘扇区可能会随着您的运行而改变,例如,在写入即写拷贝文件系统时),内存是必须写入(交换)还是可以在内存压力下删除(mmap
-ed文件,不带脏页),等等
由于CPU和操作系统的不同,虚拟内存地址转换涉及多个层次,因此确切的机制也不同,但基本思想是,在
mmap
ing之后,您将绕过目录结构,以忽略名称和路径等内容的方式与底层磁盘扇区进行交互。谢谢,ShadowRanger、 在那种情况下,我在这条线索上错了,不是吗?我以为我找到了答案。谢谢你,暗影游侠。在那种情况下,我在这条线索上错了,不是吗?我以为我找到了答案。
char *p = (char*) mmap(...);
....; /* check if p is not -1 */
a = *p;