在Linux中,每个进程都有一个页表,用于将用户地址空间映射到物理页面帧。
每个进程的页表是否包含映射到内核地址空间的条目?
如果是,则所有进程的页表将一个内核映像映射到同一地址。这意味着所有表都包含相同的内核地址条目。浪费了吗?
答案 0 :(得分:1)
是的,有点儿。顶级页表是按进程的,但它可以包含内核地址空间的单个条目(在64位体系结构上或在32位上的几个)。然后,此条目将指向在每个进程之间共享的公共“子”页表。这些条目也将标记为“全局”,以便硬件在上下文切换中保留TLB中的虚拟到物理转换。
每个进程都需要内核空间条目,因为内核代码可以在任何进程中随时执行。例如,任何中断或系统调用将在执行适当的处理程序时立即尝试访问内核地址。如果当前进程的地址空间中没有映射,则无法访问内核代码。
通过让每个进程共享内核地址的公共“子”页表,内核不必复制内存中的条目和浪费空间。对内核内存使用情况的任何更新只需要修改一个页表而不是每个进程。
答案 1 :(得分:0)
所有用户进程都必须共享同一个内核,因此它们需要部分页表来寻址内核空间。这是通过复制内核页表条目来完成的。所以是的,每个进程都包含映射到内核空间的条目。