gpt4 book ai didi

memory-management - 什么数据结构使用 1GB Linux 内核空间中的 128MB?

转载 作者:行者123 更新时间:2023-12-02 17:57:11 25 4
gpt4 key购买 nike

在我读过的几乎所有有关 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 article ,但没有找到相关的具体信息。

最佳答案

关于页表,确实,MMU 不会关心页表本身是否没有映射到虚拟地址空间中 - 出于地址转换的目的,那没关系。但是当内核需要修改页表时,它们确实需要映射到虚拟地址空间中 - 并且内核不能只是“及时”映射它们,因为它需要修改页表本身来做到这一点。这是一个先有鸡还是先有蛋的问题,这意味着页表需要始终保持映射状态。

内核代码也存在类似的问题。对于要执行的代码,它必须映射到虚拟地址空间中 - 如果执行页表修改的代码本身不存在,我们就会遇到类似的先有鸡还是先有蛋的问题。鉴于此,更容易始终保留整个内核代码的映射,以及内核模式堆栈和由代码访问的任何内核数据结构,您不希望可能出现页面错误。此类数据结构的一个重要示例是 struct page 结构数组,代表每个物理内存页。

关于memory-management - 什么数据结构使用 1GB Linux 内核空间中的 128MB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11550132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com