当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED);
时,对于进程之间的碎片物理内存(已分配)的相同区域正在分配虚拟内存页(PTE)。即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗?
但mmap ()
需要在fork ()
之前完成。如果我们已经有两个工作流程(即fork ()
之后),那么我们需要为mmap()
使用文件。哪些函数用于在两个已经建立的进程之间复制PTE机制以创建共享内存?
我可以用PTE / SGL(scatter-gather-list)指示已经分配的物理内存片段,以便在其他进程中使用linux-kernel创建适当的PTE,以及如何操作?
我想了解mmap()
在较低级别的工作原理。
答案 0 :(得分:1)
当我们在Linux中使用函数
mmap (,,, MAP_ANON | MAP_SHARED);
时,那么 对于碎片物理内存的相同区域(已分配) 进程之间分配虚拟内存页面(PTE)。
请重述问题/陈述,上述内容没有意义。
即将这些PTE从一个进程的页表复制到页面 另一个过程的表(具有相同的片段序列) 物理地址分配内存),这是真的吗?
不,这不是真的。
建立新映射时,内核首先会查找 对于进程的虚拟地址空间中足够大的未使用的地址范围。然后它修改相应的页表条目以指示该地址范围有效,但不存在物理页。
当您尝试访问该范围内的地址时,会生成页面错误。内核查看其数据结构并确定访问是有效的。然后它分配一个 新鲜的物理页面,修改页面条目以建立之间的映射 虚拟地址和物理地址,并将页面标记为存在。从...返回 页面错误异常,重新启动违规指令,这次成功执行。
但是mmap()需要在fork()之前完成。如果我们已经有了 两个工作进程(即fork()之后),然后我们需要使用一个文件 mmap()。哪些函数用于复制PTE之间的机制 两个已经建立的进程来创建共享内存?
如果在mmap
之后执行fork
,则两个进程将创建并初始化
页表条目完全相互独立。但是,当你mmap
一个文件时,
内核不会简单地分配一个免费的物理页面 - 它会分配一个页面,
用文件中的数据填充它,并将页面放在页面/缓冲区缓存中。什么时候
进程mmaps相同的文件,内核在页面缓存中查找,找到物理
页面,它对应于同一文件和所需的文件偏移并指向PTE
到那个页面。现在,将有两个完全独立创建的PTE,它只指向同一个物理页面。
我可以使用指示片段的PTE / SGL(scatter-gather-list) 物理内存已被分配以创建适当的 PTE在其他过程中使用linux-kernel,怎么做呢?
重申这一点,目前尚不清楚你在问什么。
我想了解mmap()在较低级别的工作原理。
我会推荐一本操作系统手册,一章介绍虚拟内存管理, 像Operating System Concepts by Silberschatz el al.
这样的东西