免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-19 03:52 |只看该作者 |倒序浏览
看到最近high_memory的帖子比较多,我也想问一个问题:


assume: x86, 2.6.3x, 物理内存1G,
则由896+8M开始的一块128M的物理内存,linux称为high_memory.

那么这一块128M内存,是不是由内核和进程共享的?
即内核通过vmalloc()可以分配到这块物理内存,
而进程在向内核请求分配内存时也有可能分配到这块物理内存?
还是说内核是"排它"性的,仅仅由vmalloc()使用?

再assume: x86, 2.6.3x物理内存512m
此时没有high_memory.这种情况下内核的vmalloc()在哪部分的物理内存中

去分配呢?

论坛徽章:
0
2 [报告]
发表于 2011-08-19 09:15 |只看该作者
本帖最后由 rqzrqh 于 2011-08-19 09:18 编辑

vmalloc中,分配被映射的物理页的函数为alloc_page,分配参数为GFP_KERNEL | GFP_HIGHMEN

论坛徽章:
0
3 [报告]
发表于 2011-08-19 09:50 |只看该作者
本帖最后由 luoyan_xy 于 2011-08-19 10:28 编辑

high memory是指所有高于896MB的物理内存。

          而用于vmalloc分配的128MB区间,则是指 3G+896MB+8MB开始的128MB,也就是说 通过vmalloc分配的物理页映射的虚拟地址位于这个空间内,其获取的物理页还是由内核统一管理的,并不是说vmalloc只能分配物理内存区间为896MB+8MB开始的128MB的区间。


         不知道说的对不对。。。

论坛徽章:
0
4 [报告]
发表于 2011-08-19 14:27 |只看该作者
同意ls同学的看法

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2011-08-19 15:02 |只看该作者
偶凭印象回答下。有错还请指正

assume: x86, 2.6.3x, 物理内存1G,
则由896+8M开始的一块128M的物理内存,linux称为high_memory.

那么这一块128M内存,是不是由内核和进程共享的?
这段物理内存最终是被谁用并不确定,内核和进程都可能用它。

即内核通过vmalloc()可以分配到这块物理内存,
而进程在向内核请求分配内存时也有可能分配到这块物理内存?

还是说内核是"排它"性的,仅仅由vmalloc()使用?

再assume: x86, 2.6.3x物理内存512m
此时没有high_memory.这种情况下内核的vmalloc()在哪部分的物理内存中
那么就不存在物理内存的high_memory。这时候,分配得到的页还是ZONE_NORMAL或者ZONE_DMA的页。

论坛徽章:
0
6 [报告]
发表于 2011-08-19 15:24 |只看该作者
回复 5# amarant


>assume: x86, 2.6.3x, 物理内存1G,
>则由896+8M开始的一块128M的物理内存,linux称为high_memory.

>那么这一块128M内存,是不是由内核和进程共享的?
>这段物理内存最终是被谁用并不确定,内核和进程都可能用它。

>即内核通过vmalloc()可以分配到这块物理内存,
>而进程在向内核请求分配内存时也有可能分配到这块物理内存?
>嗯
>还是说内核是"排它"性的,仅仅由vmalloc()使用?

我猜还有其他可以用。
如果只能是vmalloc分配并使用,那么即使建立映射后,进程岂不是总要执行系统调用变成内核权限才能访问高端物理地址?(vmap可以再次映射已分配的高端物理页,但是返回的地址还是在线性地址内)
ioremap的用法不清楚,也许ioremap可以映射通过vmalloc获得的高端物理地址到用户地址空间,也许是能直接映射高端物理地址。

>再assume: x86, 2.6.3x物理内存512m
>此时没有high_memory.这种情况下内核的vmalloc()在哪部分的物理内存中
>那么就不存在物理内存的high_memory。这时候,分配得到的页还是ZONE_NORMAL或者ZONE_DMA的页。

此时就没有页描述来对应high_memory。
vmalloc建立映射时,被映射的高端物理地址是通过alloc_page分配的,而且参数是GFP_KERNEL | GFP_HIGHMEM,现在没有highmen,于是使用通用的GFP_KERNEL,GFP_KERNEL
应该是优先分配在NORMAL区域,然后是DMA区域。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
7 [报告]
发表于 2011-08-19 15:48 |只看该作者
本帖最后由 amarant 于 2011-08-22 10:38 编辑

回复 6# rqzrqh


    我很赞同~  分配物理页用的是alloc_pages,跟虚拟地址在用户空间还是内核空间没什么关系~

论坛徽章:
0
8 [报告]
发表于 2011-08-25 16:28 |只看该作者
我觉得LZ首先要搞明白线性地址和物理地址的区别,所谓的896M是指线性地址,跟物理地址没有关系,就算物理内存只有512M,高端内存任然存在。内核对于物理内存使用页框的数据结构来管理,每4K为一个页框,对于1G的物理内存就有1GB/4KB=262144个页框. vmalloc从当前空闲页框的列表里找到所需的页框数,然后映射到高端内存(也就是896M以上)的某一段地址上去,至于所分配的物理页框位于物理内存的什么地方是随机的。
用户态进程不能直接分配物理内存,只能通过系统调用来分配虚拟内存,当需要实际操作时才分配物理内存,至于分配什么物理内存也是随机的,跟高端内存没有任何关系。

论坛徽章:
0
9 [报告]
发表于 2011-08-25 17:56 |只看该作者

论坛徽章:
0
10 [报告]
发表于 2011-08-27 22:29 |只看该作者
回复 8# keilchu


    算物理内存只有512M,高端内存  应该是不存在的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP