在 RAM 超过 896 MB 的 32 位系统中,由于内核虚拟地址和非连续映射,显然需要更改内核地址的映射。
但这在 64 位中是如何处理的呢?由于RAM总是可以完全映射到地址空间中,因此主内核页表需要在初始化时设置一次,然后就永远不会改变,因为映射永远不会改变。那么,用户页表中的这个内核区域永远不需要更新?
顺便说一句,有人很好地解释了用户进程页表如何在 32 位中更新?正如人们常说的那样,主内核页表不直接使用,而仅用作参考。是否为每个进程复制了用户页表中的内核区域条目?
答案1
在 RAM 超过 896 MB 的 32 位系统中,由于内核虚拟地址和非连续映射,很明显需要更改内核地址的映射。
是的,这被称为高内存。
但这在 64 位中是如何处理的呢?由于RAM总是可以完全映射到地址空间中,因此主内核页表需要在初始化时设置一次,然后就永远不会改变,因为映射永远不会改变。那么,用户页表中的这个内核区域永远不需要更新?
是的。
顺便说一句,有人很好地解释了用户进程页表如何在 32 位中更新?正如人们常说的那样,主内核页表不直接使用,而仅用作参考。是否为每个进程复制了用户页表中的内核区域条目?
在上面链接的 highmem 文档中,它说 highmem 映射只需要操作“内核的页表”。
“页表”实际上是一种树结构。例如,参见《四级页表》[LWN.net,2004]。顶层是单页(4096 字节)。映射内核范围的条目在所有进程中设置为相同的值,因此是共享的。临时映射发生在树的较低级别,因此它们只需要修改共享内核页表内部,而不需要单独修改每个进程页表。
至少,这是我的总体概述。我没有所有的话。