【发布时间】:2012-01-25 09:48:21
【问题描述】:
我有一个疑问,当每个进程都有自己的单独页表时,为什么需要系统范围的页表?此外,如果页表将虚拟地址映射到物理地址,那么我认为两个进程可能映射到相同的物理地址,因为所有进程都具有相同的虚拟地址空间。这是真的吗?
【问题讨论】:
标签: c linux unix operating-system
我有一个疑问,当每个进程都有自己的单独页表时,为什么需要系统范围的页表?此外,如果页表将虚拟地址映射到物理地址,那么我认为两个进程可能映射到相同的物理地址,因为所有进程都具有相同的虚拟地址空间。这是真的吗?
【问题讨论】:
标签: c linux unix operating-system
关于第二部分,将虚拟地址映射到相同的物理地址,对于库代码和应用程序代码的不同实例,确实是这样做的。代码被授予只读访问权限,并且相同的虚拟地址映射到相同的物理地址。这样,就不需要在物理内存中拥有相同代码的多个副本,所有这些都假设 ASLR 未启用。
现在关于数据部分,像 Linux 这样的现代操作系统使用按需分页,即只有在访问(读取或写入)时才将页面带到物理内存。此时,内核可以确保为该页面分配一个唯一的物理地址。我不知道系统范围页表的目的是什么。
【讨论】:
内核将使用系统范围的页表,在大多数系统中,它总是映射到内存中。 (通常 32 位系统会将低 2-3 GB 的虚拟地址空间分配给用户进程,将高 1-2 GB 分配给内核。)使内核映射在所有进程中通用意味着您没有当您从用户态输入系统调用时,担心确保您将要运行的内核代码被映射。
【讨论】: