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

超过896MB的线性地址对应于高存储区ZONE_HIGHMEM。 所以页面分配器function在这个区域不起作用,因为它们给出ZONE_NORMAL和ZONE_DMA中直接映射的页面帧的线性地址。

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

  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-coreel/What-is-the-difference-between-high-memory-and-normal-memory

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