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

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

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

我可以使用PTE / SGL(分散 – 收集列表)指示已经分配的物理内存片段,通过使用linux-kernel在其他进程中创建适当的PTE,以及如何做到这一点?

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

当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED); 然后,对于进程之间的碎片物理内存(分配)的相同区域,分配虚拟内存页(PTE)。

请重申问题/陈述,上面没有意义。

即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗?

不,这不是真的。

建立新映射时,内核首先在进程的虚拟地址空间中查找足够大的未使用的地址范围。 然后,它修改相应的页表条目以指示该地址范围有效,但不存在物理页。

当您尝试访问该范围内的地址时,会生成页面错误。 内核查看其数据结构并确定访问是有效的。 然后,它分配一个新的物理页面,修改页面条目以建立虚拟地址和物理地址之间的映射,并将页面标记为存在。 从页面错误exception返回后,重新启动违规指令并且此时间成功执行。

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

如果在fork之后执行mmap ,则两个进程将完全独立于彼此创建和初始化页表条目。 但是,当你mmap一个文件时,内核不会只分配一个免费的物理页面 – 它将分配一个页面,用文件中的数据填充它并将页面放在页面/缓冲区缓存中。 当第二个进程mmaps同一个文件时,内核在页面缓存中查找,找到物理页面,该页面对应于同一文件和所需的文件偏移量,并将PTE指向该页面。 现在,将有两个完全独立创建的PTE,它只指向同一个物理页面。

我可以使用PTE / SGL(分散 – 收集列表)指示已经分配的物理内存片段,通过使用linux-kernel在其他进程中创建适当的PTE,以及如何做到这一点?

重申这一点,目前尚不清楚你在问什么。

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

我会推荐一本操作系统手册,一章关于虚拟内存管理,比如Silberschatz等人的操作系统概念。

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 +高尔文%2C +和+加涅