免费注册 查看新帖 |

Chinaunix

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

high_memory可以被进程使用吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-08-29 16:43 |只看该作者
用事实来说明楼上观点
[root@TM-0166 ~]# cat /proc/meminfo
MemTotal:       506876 kB
MemFree:         23076 kB
Buffers:         98364 kB
Cached:         180292 kB
SwapCached:          0 kB
Active:         237456 kB
Inactive:       189880 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       506876 kB
LowFree:         23076 kB

论坛徽章:
0
12 [报告]
发表于 2011-08-30 09:46 |只看该作者
High Memory是指物理内存中高于896MB的内存。
如果物理内存只有512M,那肯定系统中是不存在High Memory的。

论坛徽章:
0
13 [报告]
发表于 2011-08-30 10:13 |只看该作者
为什么会有High Memory这个说法呢?
是因为在32为的系统中,进程的内存空间的大小为4G。
而Linux把这个4G的空间分为了两部分,即用户空间和内核空间,
一般的分配是,0-3G为用户地址空间,3G-4G为内核地址空间。
在Linux Kernel中的内存地址映射机制中,从地址0开始到最多
896M的内存是被映射到了3G-3G + 896M 的内核线性空间中。
可是如果系统中有多余896M的内存,那么kernel就无法直接使用
这些内存,因为没有进行映射。所以将高于896M的“物理内存”
称之为High Memory。
可是如果Kernel需要使用High Memory怎么办呢?
解决方法是Kernel在他的线性空间的896M-1G的预留一部分线性地址
空间用来专门进行High Memory到Low Memory的映射。

而所谓的vmalloc是用来分配非连续的物理内存的。
物理内存的分配是和high memory的存在与否没有关系的。
它的做用只是用来将非连续的物理内存空间映射到连续的线性地址空间。
在Kernel的896M-1G的线性地址空间中,出来一部分用来进行
High Memory到Low Memory的映射只外,还有一部分线性地址空间
是用来进行非连续的物理地址的映射的。

物理页面的分配遵循一个优先级的原则,即分配的时候是从哪个ZONE进行
分配的,这个是可以配置的。
例如 : ZONE_HIGHMEM -》 ZONE_NORMAL -》ZONE_DMA
意思是如果要在这个系统的物理内存中分配页面,则先从ZONE_HIGHMEM开始,
其次是ZONE_NORMAL,最后才是ZONE_DMA。

论坛徽章:
0
14 [报告]
发表于 2011-08-30 10:29 |只看该作者
我不太明白楼主的内核和进程共享是什么意思。

vmalloc的结果是将不连续的物理页面映射到了线性地址中的
kernel部分的连续的地址空间中。所以只有线程处于内核态的
时候才能访问。
如下图中的vmalloc Address Space部分。

论坛徽章:
0
15 [报告]
发表于 2011-08-30 16:01 |只看该作者
我是楼主,谢谢楼上的诸位的回答,

我之所以在这个问题上纠结是因为我没有弄清楚“high memory"到底是线性地址空间中的概念还是物理地址空间中的概念。

那么答案是,“high memory"是线性地址空间中的概念。即vmalooc()返回的地址落在"high memory"的区间中。
但这个概念又与物理地址空间到底有多大息息相关。即,kernel的逻辑地址空间只能直接映射物理地址空间中的0~896M的部分。
所以如果要让kernel能够使用到>896m的物理地址空间,就引入了"high memory"的概念。
但vmalloc()调用后分配出来的的物理地址是不是处于>896M的物理地址空间中,却是不一定的。因为物理地址分配是随机的。

果然比较绕,汉语如此精细还是不能完全反映这个过程。累!

同时,原提问中的:”进程在向内核请求分配内存时也有可能分配到这块物理内存?“,
这个问题,我现在觉得不妥,答案应该是:

进程运行在用户态时,heap, stack对应的物理内存,有可能落在>896M的区域,也有可能不,因为page frame分配的随机性。
而进程运行在内核态时,分两种情况:
1 vmalloc()分配出来的page frame可以落在物理地址空间的任意位置,但虚拟地址落在虚拟地址空间中的>896处。
2 kmalloc()&__get_free_page()分配出来的page frame可以落在物理地址空间的任意位置,但虚拟地址落在虚拟地址空间中3G~3G+896M的位置。

如果我理解的不对,欢迎拍砖。

论坛徽章:
0
16 [报告]
发表于 2011-08-30 19:55 |只看该作者
看来我们都白忙活了。
High Memory是物理地址空间中的概念。
楼主该好好补下基础知识了。

论坛徽章:
0
17 [报告]
发表于 2011-08-31 10:29 |只看该作者
好吧。。。应该说high memory跟物理地址空间,线性地址空间都有关系。

论坛徽章:
0
18 [报告]
发表于 2011-08-31 10:53 |只看该作者
High Memory,中文名称高端内存。
是指一个系统如果配备有大于896MB的物理内存。
则Linux Kernel将这个系统的物理内存中高于896MB
的那部分物理内存称之为High Memory,即高端内存。
vmalloc和High Memory没有必然的联系,不要将这
两个东西放在一起理解。
建议楼主去看一下vmalloc的概念。

论坛徽章:
0
19 [报告]
发表于 2011-08-31 11:29 |只看该作者
http://bbs.chinaunix.net/thread-1938084-1-1.html
这个贴子我觉得写得不错,里面说到:
high_memory是“具体物理内存的上限对应的虚拟地址”,

是的,high memory单纯做名词解释来说,当然是你说的“一个系统如果配备有大于896MB的物理内存。
则Linux Kernel将这个系统的物理内存中高于896MB
的那部分物理内存称之为High Memory,即高端内存。”

但要理解为什么要有high memory,以及high memory起什么作用,就得联系“非连续映射"这个概念,就跟vmalloc有关系了。当然,high memory还包括”永久映射“

论坛徽章:
0
20 [报告]
发表于 2011-08-31 12:22 |只看该作者
但我还有一个问题就是,当内存很大,比如4G的时候。
还用128m的线性地址空间去映射是不是太小了。

比如某进程在内核态用vmalloc()申请内存超过128m的时候,会不会因为用于映射的线性地址空间不够而失败呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP