linux - 内核虚拟地址空间中的高内存映射

标签 linux memory-management linux-kernel virtual-memory

超过896MB的线性地址对应High memory region ZONE_HIGHMEM。 因此页面分配器函数不会在这个区域上工作,因为它们给出了 ZONE_NORMAL 和 ZONE_DMA 中直接映射的页面框架的线性地址。

我对 Undertanding linux Kernel 中指定的这些行感到困惑:

  1. 当他们说“在 64 位硬件平台中 ZONE_HIGHMEM 总是空的”时,他们是什么意思。

  2. 这条突出显示的语句是什么意思:“高内存页框的分配仅通过 alloc_pages() 函数完成。这些函数不返回线性地址,因为它们不存在。而是函数返回第一个分配的页框的页描述符的线性地址。这些线性地址始终存在,因为所有页描述符在内核初始化期间都在低内存中分配一次并永远存在。”

这些页面描述符是什么?896MB是否已经拥有整个RAM的所有页面描述符。

最佳答案

  1. x86-32 内核需要高内存才能访问超过 1G 的物理内存,因为不可能在 32 位地址空间和内核/用户中永久映射超过 2^{32} 个地址拆分为1G/3G。 x86-64 内核没有这样的限制,因为物理可寻址内存的数量(当前为 256T)适合其 64 位地址空间,因此可以始终被永久映射。 高内存是一个黑客。理想情况下你不需要它。实际上,x86-64 的重点是能够直接寻址您可能需要的所有内存。采取 来自 https://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory

  2. 我认为页面描述符的意思是struct page。并考虑 struct page 的大小。是的,所有这些都可以存储在 ZONE_NORMAL

关于linux - 内核虚拟地址空间中的高内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444440/

相关文章:

linux - egrep 正则表达式 bash 脚本中的数字变量

linux - Blender 不在工作空间中显示对象。

linux - UDP 连接被拒绝

c++ - C++中的内存管理问题

c++ - 多维 std::vector (C++) 的内存分配

c - 我如何获得 linux 内核服务中断所花费的时间

linux - 显示父目录中文件的内容

c++ - 每个类重载 new(),而不是全局重载

tcp - 现代 Linux 机器可以拥有的理论最大开放 TCP 连接数是多少

c++ - 套接字和文件推荐的缓冲区大小