在我读过的有关Linux内核中HIGHMEM的书籍和文章中,它们都说在使用3:1分割时,并非所有1GB的空间都可用于内核映射。通常只有约896MB可以用于内核数据结构、内存映射、页表等。
我的问题是,这些数据结构究竟是什么?页表通常通过页表地址寄存器访问,对吗?而页表的基址通常被存储为物理地址。那么为什么需要为整个表保留一个虚拟地址空间呢?
同样地,我也了解到内核代码本身占据空间。这与虚拟地址空间有什么关系?难道不是物理内存用于存储代码吗?
最后,为什么这些数据结构必须要保留128MB的空间呢?为什么不能像内核中的其他正常数据结构一样,根据需要从整个1GB地址空间中使用?
我已经阅读了《Linux设备驱动程序》第三版、《专业Linux内核架构》以及这里的几篇文章(例如:为什么Linux内核ZONE_NORMAL限制为896 MB?)和旧版LWN文章,但没有找到具体的信息。
我的问题是,这些数据结构究竟是什么?页表通常通过页表地址寄存器访问,对吗?而页表的基址通常被存储为物理地址。那么为什么需要为整个表保留一个虚拟地址空间呢?
同样地,我也了解到内核代码本身占据空间。这与虚拟地址空间有什么关系?难道不是物理内存用于存储代码吗?
最后,为什么这些数据结构必须要保留128MB的空间呢?为什么不能像内核中的其他正常数据结构一样,根据需要从整个1GB地址空间中使用?
我已经阅读了《Linux设备驱动程序》第三版、《专业Linux内核架构》以及这里的几篇文章(例如:为什么Linux内核ZONE_NORMAL限制为896 MB?)和旧版LWN文章,但没有找到具体的信息。
vmalloc
。正如你所说,所有内容都通过虚拟地址访问。那么为什么要浪费任何虚拟地址呢? - codetwiddler