内核逻辑地址

内核逻辑地址

当用于加载/存储指令时,内核逻辑地址是否经过MMU? MMU 处理内核逻辑地址与内核虚拟地址是否不同?请给出同样的理由。

如果MMU以类似的方式处理这两种地址,那么内核逻辑地址的优点是什么?

将内存分为High内存和Low内存有什么好处?

答案1

加载/存储指令只能寻址虚拟内存。它们都经过MMU。 MMU 始终使用当前页表来转换地址。

Linux 在 32 位 CPU 上仅将内存分为“低”和“高”。 32 位虚拟地址标识 4GB 不同位置之一。为了访问超过 4GB 的不同物理内存位置,我们必须使用临时虚拟映射。

看官方文档:linux-5.0/文档/vm/highmem.rst

一般建议是,在 32 位计算机上不要使用超过 8GiB - 尽管更多可能适合您和您的工作负载,但您几乎只能靠自己 - 不要指望内核开发人员会真正关心是否事情分崩离析。

旁白:“内核逻辑地址”是指指向低内存永久映射内部的一种虚拟地址。该术语由一本特定的 Linux 书籍使用。它不会在那本书的上下文之外使用。

问题:永久映射非常大的物理内存区域(即“低内存”)的“优点”是什么?

答:这意味着大多数 Linux 内核代码可以避免处理“高内存”的额外复杂性和性能开销。即需要创建临时映射。考虑到高内存仅与过时的 32 位 CPU 相关,这一点尤其重要。

大多数内核代码可以在低内存中分配。大多数内核代码不需要大量 RAM。例外的是Linux允许页面缓存分配在高端内存中。因此,涉及页面缓存的内核代码需要意识到这一点。

甚至套接字(网络)缓冲区也不支持 highmem。例子:https://www.airship.com/blog/linux-kernel-tuning-for-c500k/

相关内容