加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

内存管理 – 哪些数据结构使用128MB的1GB Linux内核空间?

发布时间:2020-12-30 15:50:54 所属栏目:Linux 来源:网络整理
导读:在我读过的关于 Linux内核中的HIGHMEM的几乎所有书籍和文章中,他们都说在使用3:1拆分时,并非所有1GB都可用于内核进行映射.通常是896MB左右,其余用于内核数据结构,内存映射,页表等. 我的问题是,这些数据结构究竟是什么?页表通常通过页表地址寄存器访问,对

在我读过的关于 Linux内核中的HIGHMEM的几乎所有书籍和文章中,他们都说在使用3:1拆分时,并非所有1GB都可用于内核进行映射.通常是896MB左右,其余用于内核数据结构,内存映射,页表等.

我的问题是,这些数据结构究竟是什么?页表通常通过页表地址寄存器访问,对吧?并且页表的基地址通常存储为物理地址.现在为什么需要为整个表预留一个虚拟地址空间?

同样,我读到了占用空间的内核代码本身.这与虚拟地址空间有什么关系?它不是存储代码所消耗的物理内存吗?

最后,这些数据结构为什么要保留128MB空间?为什么它们不能像所需的那样在整个1GB地址空间中使用,就像内核中的任何其他普通数据结构一样?

我已经完成了LDD3,专业Linux内核架构以及堆栈溢出(例如:Why Linux Kernel ZONE_NORMAL is limited to 896 MB?)和旧版LWN article的几个帖子,但没有找到相同的具体信息.

解决方法

关于页表,MMU不关心页表本身是否未映射到虚拟地址空间 – 为了地址转换的目的,这是可以的.但是当内核需要修改页面表时,它们确实需要映射到虚拟地址空间 – 而内核不能只是“及时”映射它们,因为它需要修改页面表本身来做那.这是一个鸡与蛋的问题,这意味着页表需要始终保持映射状态.

内核代码存在类似的问题.对于要执行的代码,它必须映射到虚拟地址空间 – 如果执行页表修改的代码本身不存在,我们就会遇到类似的鸡与蛋问题.有了这个,就可以更容易地将整个内核代码映射到内部,同时内核模式堆栈和任何内核数据结构都可以通过代码进行访问,而不希望出现页面错误.这种数据结构的一个大例子是结构页面结构数组,代表每个物理内存页面.

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!