免费注册 查看新帖 |

Chinaunix

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

一个关于进程地址空间的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-27 22:09 |只看该作者 |倒序浏览
在一个进程地址空间分配中 最后是通过mm = allocate_mm();来分配的
#define allocate_mm()        (kmem_cache_alloc(mm_cachep, GFP_KERNEL))
是在内核空间采用slab来分配的
但是用户进程的地址空间是4G的也可以在用户空间啊  这个是怎么回事啊

还有__get_free_page是不是只能分配内核空间的物理内存
这个函数最后返回的是page的线形地址,等于说之前就已经映射好了的
而用户进程需要的物理内存 是动态映射的阿

论坛徽章:
0
2 [报告]
发表于 2009-09-27 23:23 |只看该作者
使用4G是虚拟内存的作用,
slab只是一种加速内存分配的机制。

这两个是两个概念

论坛徽章:
0
3 [报告]
发表于 2009-09-27 23:30 |只看该作者
楼上能不能说的详细一点 slab不是内核空间分配的马

论坛徽章:
0
4 [报告]
发表于 2009-09-27 23:34 |只看该作者
还有__get_free_page的问题能不能也说得详细点

论坛徽章:
0
5 [报告]
发表于 2009-09-28 09:23 |只看该作者
原帖由 nqdgj2007 于 2009-9-27 22:09 发表
在一个进程地址空间分配中 最后是通过mm = allocate_mm();来分配的
#define allocate_mm()        (kmem_cache_alloc(mm_cachep, GFP_KERNEL))
是在内核空间采用slab来分配的
但是用户进程的地址空间是4G的也可以在用户空间啊  这个是怎么回事啊

还有__get_free_page是不是只能分配内核空间的物理内存
这个函数最后返回的是page的线形地址,等于说之前就已经映射好了的
而用户进程需要的物理内存 是动态映射的阿


首先要弄清楚内核空间和用户空间的区别
虽然内核数据、代码段跟用户数据、代码段都是从0到4GB,但实际上内核只使用3GB以上线性地址,用户进程只使用3GB以下线性地址。
准确地说,是用户空间跟内核空间共同组成了整个线性空间,只不过用户空间要切换,内核空间是不变的(高端内存特殊)。也就是说,内核空间归所有进程共享,因为进程也有内核态。

你说的allocate_mm()是内核创建进程时使用的一个函数,它用来分配mm_struct结构,此结构用来管理进程的用户空间,注意它只是一个内核结构,不是返回给用户使用的内存空间。

再说说slab,这是内核用来管理内存碎片的机制,只要不是整页分配的内存都由它来管理。用户态发出的内存分配请求最终也需要内核来分配,因为内核管理着整个内存,但是这时候,因为是用户的请求,内核分配出来的内存不会自己使用,而是将其物理地址映射到用户空间的一个线性地址,然后返回给用户。

“__get_free_page是不是只能分配内核空间的物理内存”
物理内存没有内核或者用户之分,只不过只有内核才有权去管理页表,有了页表才能正确访问到物理地址。用户无法申请也没有必要知道物理地址,内核会将物理地址映射好了返回给用户。

论坛徽章:
0
6 [报告]
发表于 2009-09-28 09:56 |只看该作者
>>>>>只不过用户空间要切换,内核空间是不变的(高端内存特殊)。
我觉得对于高端内存,内核空间也是不变的.

论坛徽章:
0
7 [报告]
发表于 2009-09-28 10:26 |只看该作者
那就等于__get_free_page返回给用户的是线形地址,如果这些是事先映射好的 , 这个映射过程在哪里实现的?
既然是内核实现映射好的 那么返回给用户的应该也是内核的线形地址阿(3-4G),那么用户空间的线形地址又是怎么回事呢

论坛徽章:
0
8 [报告]
发表于 2009-09-28 10:29 |只看该作者
"因为是用户的请求,内核分配出来的内存不会自己使用,而是将其物理地址映射到用户空间的一个线性地址,然后返回给用户。"
这个 将其物理地址映射到用户空间的一个线性地址 过程在哪里

论坛徽章:
0
9 [报告]
发表于 2009-09-28 12:15 |只看该作者
原帖由 epegasus 于 2009-9-28 09:56 发表
>>>>>只不过用户空间要切换,内核空间是不变的(高端内存特殊)。
我觉得对于高端内存,内核空间也是不变的.


恩,我知道兄台的意思是3GB以上都归内核所有,一个时间内只有唯一一套
而我的意思是高端内存的映射关系是不固定的

论坛徽章:
0
10 [报告]
发表于 2009-09-28 12:19 |只看该作者
原帖由 nqdgj2007 于 2009-9-28 10:29 发表
"因为是用户的请求,内核分配出来的内存不会自己使用,而是将其物理地址映射到用户空间的一个线性地址,然后返回给用户。"
这个 将其物理地址映射到用户空间的一个线性地址 过程在哪里


没仔细研究过,呵呵
这是堆的处理机制,我只研究过栈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP