为什么我们在 linux 中有内存区域?

Why do we have memory zones in linux?

我是在 page 上阅读这篇文章的:

Because of hardware limitations, the kernel cannot treat all pages as identical. Some pages, because of their physical address in memory, cannot be used for certain tasks. Because of this limitation, the kernel divides pages into different zones.

我想知道那些硬件限制。有人可以解释一下这些硬件限制并举个例子吗?还有,intel 有软件指南解释这个吗?

此外,我读到虚拟内存分为两部分,1GB 用于内核 space 和 3GB 用于用户 space。为什么我们把所有进程的virtualspace中的1GBspace给kernel?它如何映射到实际的物理页面?有人可以给我指点一个干净的文字来解释这个吗?

提前致谢。

硬件限制主要与旧设备有关。例如,您有 ZONE_DMA,它来自 0 - 16MB。这是例如较旧的 ISA 设备需要,这些设备无法在 16MB 限制以上进行寻址。然后你有 ZONE_NORMAL,其中大部分内核操作发生并永久寻址到内核地址 space.

1GB3GB 拆分很简单。你在这里有虚拟地址,所以对于你的应用程序,内存地址总是从 0x00000000 开始,保留的是内核内容的第 1 GB。这样做的原因很简单:您有内核模式和用户模式。在内核模式下,您可以使用系统调用。如果你不想将内核内存映射到你的虚拟地址 space,你将不得不进行上下文切换以将你困在内核模式中(上下文切换:将当前上下文保存到内存,从内存加载另一个上下文 ->耗时)。但是由于内核模式操作可以在同一个虚拟地址 space 中进行,因此您不需要切换上下文,例如,分配新内存或执行任何其他系统调用。

关于你的第二个问题,关于用户 space 中处理器的 1GB 内核映射

当然映射内核是为了节省时间,因为没有开关。 1 GB 用于内核功能,因此如果内核为其功能映射新内存,内核就可以做到这一点。任何关于 Unix 的书都可以为您提供详细信息