Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 调用mmap后文件的路径名在哪里?_Linux_Mmap_Pagefile - Fatal编程技术网

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

Linux 调用mmap后文件的路径名在哪里?,linux,mmap,pagefile,Linux,Mmap,Pagefile,运行最后一条语句时,出现页面错误。内核中的错误处理程序将在物理内存中分配一个页面,并将4K字节从文件复制到该页面,然后修改页面条目。读取*p的指令将再次成功执行 但是错误处理程序如何知道与页面关联的文件名和路径呢。文件名(或fd)存储在哪里?以及文件中的偏移量 如果进程数据段中的一个页面被调出(我想是调出到一个调出文件中),该怎么办?当以后需要交换页面时,内核如何知道从何处进行复制?处理程序不知道文件名或路径,因为它不使用这些文件名或路径(您可以知道,因为即使在创建映射后从文件系统中删除了文件,

运行最后一条语句时,出现页面错误。内核中的错误处理程序将在物理内存中分配一个页面,并将4K字节从文件复制到该页面,然后修改页面条目。读取
*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;