免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: peimichael
打印 上一主题 下一主题

请教一个一直很疑惑的问题,又是关于高端内存 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-10 14:44 |只看该作者
呵呵,估计scutant老大快对我无语了,

所谓“管理”大于1G的内存是为内核管理还是为用户空间管理?
如果意思是内核自己需要大于1G的地址空间的话我就理解了,
如果不是这个意思,那么我看了上面的文章觉得老大还是没明白我的意思。
想在内核空间里访问大于1G的内存确实需要高端内存这种机制,这一点我明白。
但一般来说内核管理页面并不需要访问页面的内容,而只需要操作一些数据结构

就拿用户向内核要内存这件事来说吧,内核只需要操作页表和mem_map数组不就行了,
似乎并不需要把它“映射”到内核空间吧,
因为这内存是给用户的,内核通过操作页表把它映射到线性地址的0-3G这一块就算完成任务
而就算查找空闲的物理内存也不需要把内存映射到内核空间啊。

打个比方,我要管理40个人,可是我的办公室只能装10个人,其中8个人都是本办公室的管理人员(对应于896M的线性映射的内核空间),另外两个空位就用于动态管理(对应于128M的高端内存),我需要对谁发号施令就叫他进来,下完了命令再让他出去,这样我就用两个空位管理了剩下的32个人,
但是我的意思就是,这两个空位也不需要,因为我的办公室虽然装不下40个人,但是装得下40个人的电话号码(struct page结构和页表等),如果有部门向我要人(用户空间向内核要内存),我只要用电话喊人过去就行了(只需要操作页表),而不需要把人叫进来,因此我的办公室只需要能装下本办公室的人就行了(内核空间大小只需要能装下内核的代码和数据)。

假如说我办公室所需的办公人员大于10个(内核本身的代码和数据所需的地址空间大于1G),那确实需要空两个位子出来轮流进来办公。如果不是这种情况,那么对于非本办公室的人,我大可不必为了管理他们而空两个位子(也就是不必为了管理用户空间的页面而预留高端内存),因为我有电话号码。另外,如果确实需要跟某个非办公室的人面谈,我可以走出办公室找他(就是直接访问用户空间),不用把他喊进办公室。

不知道这个比喻是否恰当
先谢谢老大的耐心解答

论坛徽章:
0
12 [报告]
发表于 2009-03-10 15:08 |只看该作者
原帖由 peimichael 于 2009-3-10 14:44 发表
呵呵,估计scutant老大快对我无语了,

所谓“管理”大于1G的内存是为内核管理还是为用户空间管理?
如果意思是内核自己需要大于1G的地址空间的话我就理解了,
如果不是这个意思,那么我看了上面的 ...


我明白你的意思了, 你是说其实内核不需要像现在这样弄个什么高端内存的管理方式, 实际上用mem_map数组就可以对所有的内存进行管理了. 也就不需要那种高端内存的映射方式了.

论坛徽章:
0
13 [报告]
发表于 2009-03-10 15:44 |只看该作者

回复 #12 scutan 的帖子

对,我就是这个意思

如果内核本身的数据和代码超过1G,使用高端内存我可以理解
但是如果是为了帮助用户空间管理内存,我觉得完全不需要这么个东西,只要有那些页表和数据结构就可以了

不知道这个怎么解释?

论坛徽章:
0
14 [报告]
发表于 2009-03-10 17:31 |只看该作者
似乎并不需要把它“映射”到内核空间吧


这里的“映射”我的理解是和内核前896M地址空间相对应的一个概念,内核地址的前896M虚拟地址空间对应的物理地址的分配算法是固定好的,就是直接减去 PAGE_OFFSET。
而这个“映射”就是说这部分内核地址没有固定的公式能直接得到物理地址,必须查表才能确定。

当然从CPU来说,所有的物理地址都存放在页表里,但从设计角度来说,就是用户进程地址的0-3G空间对应的物理地址要查表,内核3G- 3896M地址空间对应的物理地址可以通过公式算出来,3896M-4G的地址对应的物理地址也要查表才能确定(映射)

[ 本帖最后由 Aryang 于 2009-3-10 18:01 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-03-10 18:28 |只看该作者
原帖由 peimichael 于 2009-3-10 15:44 发表
对,我就是这个意思

如果内核本身的数据和代码超过1G,使用高端内存我可以理解
但是如果是为了帮助用户空间管理内存,我觉得完全不需要这么个东西,只要有那些页表和数据结构就可以了

不知道这个怎么解释?


对于内核来说, 不仅仅是为了给用户态的程序提供服务, 它也会为内核本身分配空间.
比如说物理内存有4G. 此时在物理地址3G的地方分配了一个页面, 就要建立起内核页表与该物理地址之间的映射关系. 此时对于内核空间来说只有1G的空间大小, 而且3G-3G+896M都与物理地址的前896M一一对应. 你如果将那个映射关系放到前896M去就会破坏那个线性映射的关系. 所以说对于内核, 就拿了128M的线性地址空间来对896M以上的物理内存机动处理. 我个人觉得这是一个设计的问题, 内核中已经有了一个前提, 即3G-3G+896M与物理地址896M之前的地址一一对应的前提. 所以如果打破这个前提的话, 会使得整体的解决方案更加复杂.

上面也是我的个人所见, 如果有错误, 也请指出. :wink:

论坛徽章:
0
16 [报告]
发表于 2009-03-10 18:49 |只看该作者
嗯,有道理,这下算是明白了。

不知道这种情况是不是也算,就是ARM之类采用统一编址的CPU需要端口映射的时候
如果1G地址空间已经被ram占满了,那么就无法从内核空间访问这些端口了
也是这个道理把?

太谢谢scutant啦。还有另外几位兄弟,一起学习,一起进步

论坛徽章:
0
17 [报告]
发表于 2009-03-10 19:17 |只看该作者
原帖由 peimichael 于 2009-3-10 18:49 发表
嗯,有道理,这下算是明白了。

不知道这种情况是不是也算,就是ARM之类采用统一编址的CPU需要端口映射的时候
如果1G地址空间已经被ram占满了,那么就无法从内核空间访问这些端口了
也是这个道理把?

太 ...


呵呵, 不客气哈. 不过ARM这块我就不太清楚了.

论坛徽章:
0
18 [报告]
发表于 2009-03-11 09:01 |只看该作者
原帖由 scutan 于 2009-3-10 18:28 发表


对于内核来说, 不仅仅是为了给用户态的程序提供服务, 它也会为内核本身分配空间.
比如说物理内存有4G. 此时在物理地址3G的地方分配了一个页面, 就要建立起内核页表与该物理地址之间的映射关系. 此时对于内 ...


这么说高端内存在Linux内核里是为了解决32位x86上1G内核空间不够的问题了?

也就是说,内核的虚拟地址空间开辟一个小的窗口,需要时动态把物理内存映射到这个窗口,不需要时再解除这种映射。

实际上,这种需求在PAE模式下更需要,毕竟64G物理内存和4G虚拟地址空间之间的gap比较大。

论坛徽章:
0
19 [报告]
发表于 2009-03-11 09:07 |只看该作者
原帖由 Solaris12 于 2009-3-11 09:01 发表


这么说高端内存在Linux内核里是为了解决32位x86上1G内核空间不够的问题了?

也就是说,内核的虚拟地址空间开辟一个小的窗口,需要时动态把物理内存映射到这个窗口,不需要时再解除这种映射。

实际上, ...


嗯. 之前没有说完整, 高端内存映射同时也是为了满足对PAE的需求. :wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP