我是否可以通过一个进程指示物理内存碎片的PTE在其他进程中创建适当的PTE?

时间:2013-12-01 19:50:39

标签: c linux memory-management linux-kernel posix

当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED);时,对于进程之间的碎片物理内存(已分配)的相同区域正在分配虚拟内存页(PTE)。即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗?

mmap ()需要在fork ()之前完成。如果我们已经有两个工作流程(即fork ()之后),那么我们需要为mmap()使用文件。哪些函数用于在两个已经建立的进程之间复制PTE机制以创建共享内存?

我可以用PTE / SGL(scatter-gather-list)指示已经分配的物理内存片段,以便在其他进程中使用linux-kernel创建适当的PTE,以及如何操作?

我想了解mmap()在较低级别的工作原理。

1 个答案:

答案 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.

这样的东西

http://www.amazon.co.uk/Operating-System-Concepts-Abraham-Silberschatz/dp/1118112733/ref=sr_1_5?ie=UTF8&qid=1386065707&sr=8-5&keywords=Operating+System+Concepts%2C+by+Silberschatz%2C+Galvin%2C+and+Gagne

相关问题