在我读过的几乎所有关于 Linux 内核中的 HIGHMEM 的书籍和文章中,他们都说在使用 3:1 拆分时,并非所有 1GB 都可用于内核进行映射。通常它是 896MB 左右,其余的用于内核数据结构、内存映射、页表等。
我的问题是,这些数据结构到底是什么?页表通常是通过页表地址寄存器访问的,对吧?页表的基地址通常存储为物理地址。现在为什么需要为整个表保留一个虚拟地址空间?
同样,我读到内核代码本身占用空间。这与虚拟地址空间有什么关系?这不是存储代码所消耗的物理内存吗?
最后,这些数据结构为什么要预留 128MB 的空间呢?为什么不能根据需要在整个 1GB 地址空间中使用它们,就像内核中的任何其他普通数据结构一样?
我已经阅读了 LDD3、Professional Linux Kernel Architecture 和 stack-overflow 上的几篇文章(例如:Why Linux Kernel ZONE_NORMAL is limited to 896 MB?)和一篇较早的 LWN文章,但没有找到相关的具体信息。