免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2009-09-28 13:29 |只看该作者
chenda0.03 说的对,allocate_mm只是分配struct mm_struct这个控制结构体,并不分配实际的地址空间。
其次,在brk系统调用中所分配的只是一个虚拟地址空间,没有真正分配物理内存。这时用户如果访问这个地址会引起缺页异常,真正分配物理内存的操作是在handle_mm_fault中做的。至于映射的过程,就是填写pte的过程了
最后,__get_free_page返回的地址一定是内核地址空间的地址。它会首先从物理内存中取得一个物理页,如果该页不在高端内存则直接返回它对应的线性映射的地址,否则会在高端内存映射中找到它的地址并且返回

论坛徽章:
0
12 [报告]
发表于 2009-09-28 14:48 |只看该作者
楼上的意思是__get_free_page返回的地址一定是内核地址空间的地址, 那么用户的进程地址不是0-3g的马,既然返回的是3-4g的  那怎么可以说是用户空间的线形地址呢

论坛徽章:
0
13 [报告]
发表于 2009-09-28 14:49 |只看该作者
我知道进程地址空间是0-4g 但是每次都是返回3g-4g的 什么时候能得到0-3g的呢

论坛徽章:
0
14 [报告]
发表于 2009-09-28 14:57 |只看该作者

回复 #13 nqdgj2007 的帖子

给用户空间分配页面不使用__get_free_pages()...
是在handle_mm_fault中用alloc_pages完成的。
然后再将其物理地址和属性填写入对应的页表项就分配好了

论坛徽章:
0
15 [报告]
发表于 2009-09-28 15:19 |只看该作者
alloc_pages 和 __get_free_pages() 最后调用的函数都是一样的阿  我没有看到__get_free_pages()中有映射的过程阿
应该是在paging_init中都映射好的吧  那么alloc_pages 分配的也应该映射好的阿

论坛徽章:
0
16 [报告]
发表于 2009-09-28 15:52 |只看该作者
分配页面的过程不是你想的那样:用户空间需要内存了,告诉内核,内核获得一个物理页,然后把他映射到用户空间的某个虚拟地址,再把这个地址返回给用户
    应该是这样:用户空间需要内存,告诉内核,内核仅仅找到一个还没有使用的虚拟地址,然后告诉用户,我已经分配好了,你可以用了,但是物理内存实际还没有就位。如果用户这时候真的使用这个地址,那么会产生缺页异常(因为页表中对应的表项为空),而缺页异常的地址会自动通过CR2寄存器传给内核,这时内核才不情愿的找到一个物理页,把它的物理地址+页属性组合成页表项,填入缺页的表项。也就是说,这个要映射到的虚拟地址其实是用户告诉内核的,而不是内核映射完之后告诉用户的。
    __get_free_pages()确实没有映射过程。实际分配页的时候物理地址映射到虚拟地址的过程就是将表项填充的过程。这个要映射到的虚拟地址是通过表项在页表中的位置体现出来的。而不是通过page->virtual获得的,page->virtual根本就不是用户空间的地址。
    另外alloc_pages和__get_free_pages是有区别的,给用户空间分配物理页只能用前者。
语言表达能力有限,只能说到这个地步了,好好想想虚拟地址转换成物理地址的过程应该就能明白了。。。

论坛徽章:
0
17 [报告]
发表于 2009-09-28 16:14 |只看该作者
恩 我知道 这个要映射到的虚拟地址是通过表项在页表中的位置体现出来的  但是我总对__get_free_pages中的返回
return (unsigned long) page_address(page);这个线形地址所疑惑 楼上的意思就是说这个地址其实最后还是不用的

论坛徽章:
0
18 [报告]
发表于 2009-09-28 16:59 |只看该作者
原帖由 nqdgj2007 于 2009-9-28 16:14 发表
恩 我知道 这个要映射到的虚拟地址是通过表项在页表中的位置体现出来的  但是我总对__get_free_pages中的返回
return (unsigned long) page_address(page);这个线形地址所疑惑 楼上的意思就是说这个地址其实最 ...


恩,这个返回地址不是给用户空间的,是内核需要访问这些页的时候用的。

论坛徽章:
0
19 [报告]
发表于 2009-09-28 17:29 |只看该作者
原帖由 peimichael 于 2009-9-28 15:52 发表
分配页面的过程不是你想的那样:用户空间需要内存了,告诉内核,内核获得一个物理页,然后把他映射到用户空间的某个虚拟地址,再把这个地址返回给用户
    应该是这样:用户空间需要内存,告诉内核,内核仅仅找 ...

讲的很好。

论坛徽章:
0
20 [报告]
发表于 2009-09-28 17:37 |只看该作者
恩 谢谢你讲的那么详细
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP