【问题标题】:How does linux kernel save struct_task in dynamic memory?linux内核如何将struct_task保存在动态内存中?
【发布时间】:2017-10-28 00:07:09
【问题描述】:

当我阅读understanding the linux kernel时,我得到了这句话

进程描述符存储在动态内存中。

据我所知,对于 32 位计算机系统:

内核在最高虚拟地址中保留了近 128MB High Memory 用于寻址动态物理地址。

我的问题是:虽然高端内存可以寻址所有物理地址,但它只能一次最多寻址128MB。内核数据结构太大,可能超过 128MB。如果内核想要重新映射一些高端内存,那么保存在高端内存中的一些数据结构的虚拟地址可能是无效的。内核如何在动态物理内存中保存超过 128MB 的内核数据结构。

虽然我已经努力表达清楚并遵守本网站的规则,但我仍然可能做错了一些事情。如果有的话我很抱歉。

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    “内核数据结构太多以至于可能超过 128MB”是什么意思?意思是?没有“内核数据结构”。内核分配了一些东西,但它们是几页长的顶部。特别是没有大于 128MB 的“单一对象”。

    如果某些东西在物理上真的很大(比如有一个文件完全读入 RAM 并且需要 512MB),内核只会根据需要映射和取消映射物理页面。特别是不需要同时完全映射文件,部分临时映射到的虚拟地址是没有意义的。

    还请注意,今天 x86_64 提供 128TB 的地址空间,因此没有此类恶作剧。

    【讨论】:

    • 非常感谢,我认为进程描述符struct_as等数据是内核数据结构。会不会有这么多进程,所有进程描述符都超过128MB?
    • 我不明白这有多重要。您确定您了解其余内存的用途吗?
    • 说实话,我不确定我是否理解。抱歉,我上次回复中有错字,我找不到重新编辑它的方法。 struct_as 应该是 struct_task。让我尝试另一种表达方式。我假设所有进程描述符都超过 128MB。结果,内核无法访问所有这些进程描述符。有时,内核使用它的一些高内存来访问这些进程描述符中的一些。当它要访问剩余进程描述符时,它如何知道剩余进程描述符保存在哪里,高端内存应该映射哪些物理页?
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 2013-11-06
    • 2020-07-07
    • 2014-10-06
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多