免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 16146 | 回复: 51
打印 上一主题 下一主题

高端内存 [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-23 23:15 |只看该作者 |倒序浏览
5可用积分
网上大部分的解析:

高端内存:是指物理地址大于 896M 的内存。对于这样的内存,无法在“内核直接映射空间”进行映射。
内核直接映射空间最多只能从3G到4G,只能直接映射1G物理内存,对于大于 1G 的物理内存,无能为力。因此,内核为了访问大于1G的物理内存,就必须留出一点空间<128M=1024-896>用于映射大于1G的物理内存。


但我还是不理解这个高端内存有什么作用?

如果采用高端内存,线性地址空间3G-3G+896只能直接映射0-896M物理内存,剩下的3G+896M-4G=128M的线性地址空间用来高端内存映射,但这128M的线性地址空间不是只能映射128M的物理内存吗?岂不是在高端内存的时候,3G-4G也只能映射1G的物理内存?

最佳答案

查看完整内容

回复 39# chenzhanyiczy 我怕我讲错。我理解的大概流程就是,每个device都有自己的资源对吧,比如它们都有很多寄存器,如果是显卡的话肯定还会有framebuffer,在PCI体系中,这些设备的资源都是映射到4G的memory space中的(就是cpu用普通的mov指令就可以读写了,暂时忘掉微机原理中讲的in,out指令吧,它们访问的都是64M的I/O space)。所以设备们都有一些config寄存器,里面会标明它们的资源的“长度”有多长,比如寄存器就有1 ...

论坛徽章:
0
2 [报告]
发表于 2010-03-23 23:15 |只看该作者
回复 39# chenzhanyiczy


    我怕我讲错。我理解的大概流程就是,每个device都有自己的资源对吧,比如它们都有很多寄存器,如果是显卡的话肯定还会有framebuffer,在PCI体系中,这些设备的资源都是映射到4G的memory space中的(就是cpu用普通的mov指令就可以读写了,暂时忘掉微机原理中讲的in,out指令吧,它们访问的都是64M的I/O space)。所以设备们都有一些config寄存器,里面会标明它们的资源的“长度”有多长,比如寄存器就有1M,framebuffer有8M等。设备们访问它们各自的资源自然都用0作为起始地址就可以访问了,但是cpu要访问的话就需要知道它们在4G的物理地址空间中的start address(必定不能有冲突)。那么由BIOS\NB\OS\BUS DRIVER协作起来用一套算法就是分别为这些设备们配置这个在4G的物理地址空间中的start address,要求就是不能有冲突。这个配置过程在OS的DEVICE PROBE时来做。在这之前BIOS也会在POST时做一次,但是貌是OS不会理睬BIOS配置的结果,会自己重新配置一趟。

论坛徽章:
0
3 [报告]
发表于 2010-03-24 08:46 |只看该作者
俺的理解是扩大内核访问物理内存的范围。
如果不预留128M的线性地址空间,把物理内存的第一个1G直接映射到3G-4G,这样内核就只能使用物理内存的0-1G了。预留了128M的窗口,可以透过这个窗口访问896M以后的所有物理内存,虽然不能在同一时刻做到使用896M以后的内存,但是有了这个窗口就具备了一种能力。
用户空间有3G线性地址空间,没有高端内存的概念。内核空间只有1G,所以留了个窗口来使用4G物理内存。
欢迎拍砖

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2010-03-24 09:15 |只看该作者
回复 2# re_load


    这128M的线性地址空间能访问多少物理内存

论坛徽章:
0
5 [报告]
发表于 2010-03-24 09:21 |只看该作者
回复 3# chenzhanyiczy


    128M线性地址空间在同一时刻最多映射128M物理内存。128M物理内存容纳的32768个页框可以分散在896M以后的所有的物理内存中。

论坛徽章:
0
6 [报告]
发表于 2010-03-24 10:58 |只看该作者
首先,为什么内核只使用3~4G的地址空间、用户只使用0~3G? 为什么不能都使用0~4G呢? 如果都使用0~4G,显然不存在高端内存的问题,因为整个物理地址空间都已经被内核映射了。

而让用户只使用0~3G、内核只使用3~4G,这样就使得用户和内核使用的地址空间不重合,于是当执行上下文在用户态和内核态之间切换时(用户进程在内核态和用户态间切换、用户进程与内核线程之间的切换),就不需要更切换地址空间(更新页表)。这样做效率更高。

但是现在,内核只有3~4G的空间,对于物理内存的0~1G。如果物理内存超过1G,超出的部分是没法被内核所映射的。除非内核打破“只使用3~4G的约定”、或者依赖于用户空间的映射(这个显然不靠谱)。
那么,如果内核真想访问到1G以外的物理内存怎么办呢(尽管这种需求不是很多)?所以,最后128M的内核空间被切出来,用来映射超过896M以上的物理内存。

这128M的空间只能映射128M的物理内存,但是具体映射到哪里,这是动态的(可以修改的)。
尽管用128M来映射最大3G+128M的空间,不可能面面俱到。但是使用高端内存的需求并不是那么普遍,这128M也基本上够用了……

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
7 [报告]
发表于 2010-03-24 11:09 |只看该作者
回复  chenzhanyiczy


    128M线性地址空间在同一时刻最多映射128M物理内存。128M物理内存容纳的3276 ...
re_load 发表于 2010-03-24 09:21



   
是啊,既然128M只能映射128M的物理内存,也就是说内核地址空间所能映射的物理内存是不变的(即1G)

那么,何必不把3G-4G直接映射到0-1G的物理内存上(而不是只是896M),只要规定物理内存的0-1G都是给内核空间用的就行了

即896M-1G(128M)的物理内存保护起来给内核空间用,用户空间用不了

我就不明白,内核空间能映射的物理内存是不变的(1G),无论是否使用了高端内存,那么何必要搞出高端内存来,这不是整的更加复杂?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
8 [报告]
发表于 2010-03-24 11:10 |只看该作者
回复 5# kouu


麻烦看看我上面说的这个疑问   
谢谢

论坛徽章:
0
9 [报告]
发表于 2010-03-24 11:16 |只看该作者
是啊,既然128M只能映射128M的物理内存,也就是说内核地址空间所能映射的物理内存是不变的(即1G)

那么,何必不把3G-4G直接映射到0-1G的物理内存上(而不是只是896M),只要规定物理内存的0-1G都是给内核空间用的就行了

即896M-1G(128M)的物理内存保护起来给内核空间用,用户空间用不了

我就不明白,内核空间能映射的物理内存是不变的(1G),无论是否使用了高端内存,那么何必要搞出高端内存来,这不是整的更加复杂?


如果某些情况必须使用896M后的物理内存呢。
kernel提供这种机制就可以应对了,怎么使用是使用者的问题了,用完了释放掉映射,再使用再重新映射,都是可以的嘛。

论坛徽章:
0
10 [报告]
发表于 2010-03-24 11:23 |只看该作者
首先,为什么内核只使用3~4G的地址空间、用户只使用0~3G? 为什么不能都使用0~4G呢? 如果都使用0~4G,显然不存在高端内存的问题,因为整个物理地址空间都已经被内核映射了。

而让用户只使用0~3G、内核只使用3~4G,这样就使得用户和内核使用的地址空间不重合,于是当执行上下文在用户态和内核态之间切换时(用户进程在内核态和用户态间切换、用户进程与内核线程之间的切换),就不需要更切换地址空间(更新页表)。这样做效率更高。


进程线性空间的规划师可以4/4 2/2 1/3的,这些都是可以配置的并非只能3/1。
进程切换不会更新页表,更新一下寄存器,刷新一下TLB就OK了,对于4G的线性空间来说页表就那么大小了,用户空间和内核空间的布局不会影响到切换效率
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP