免费注册 查看新帖 |

Chinaunix

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

linux虚拟地址空间疑惑 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-09-17 14:13 |只看该作者
原帖由 思一克 于 2007-9-17 14:03 发表
MMU 是CPU内的物理单元。page fault是CPU外的程序。上面说的交换,影射都是内河的问题。对用户程序来说或许还勉强。

总之,交换出去的如果MMU还可以计算出物理页,那么人用脑子也能计算(根据页表)。但人是 ...


嗯,你这样说应该更准确一些。
我的着眼点是,page fault是转换是地址转换的一个中间过程。如果把page fault排除在MMU转换地址的过程外,缺页的时候当然不能通过虚拟地址得到物理地址。

论坛徽章:
0
32 [报告]
发表于 2007-09-17 14:14 |只看该作者
我知道你完全明白。不过是为了解释LZ的问题那样说的。

原帖由 zx_wing 于 2007-9-17 14:13 发表


嗯,你这样说应该更准确一些。
我的着眼点是,page fault是转换是地址转换的一个中间过程。如果把page fault排除在MMU转换地址的过程外,缺页的时候当然不能通过虚拟地址得到物理地址。

论坛徽章:
0
33 [报告]
发表于 2007-09-17 14:17 |只看该作者
原帖由 思一克 于 2007-9-17 14:14 发表
我知道你完全明白。不过是为了解释LZ的问题那样说的。


呵呵,希望我们没把lz说晕

论坛徽章:
0
34 [报告]
发表于 2007-09-17 14:28 |只看该作者
还有,前面说的关于交换的还有进一步澄清的需要:

1)物理页面永远没有被交换出去的问题。交换出的是物理页中的内容。物理页相当于容器,内容是容器中的东西。这两者区别是本质的。为什么要交换出,因为容器不够用了。要滕出给别人使用。

2)交换回来的也不是物理页(容器),而是内容,并且又随便找了个其它的容器(物理地址当然变了),将内容放入 。再告诉使用人,你的虚拟地址对应是这个容器。

论坛徽章:
0
35 [报告]
发表于 2007-09-17 14:38 |只看该作者
原帖由 思一克 于 2007-9-17 14:28 发表
还有,前面说的关于交换的还有进一步澄清的需要:

1)物理页面永远没有被交换出去的问题。交换出的是物理页中的内容。物理页相当于容器,内容是容器中的东西。这两者区别是本质的。为什么要交换出,因为容器 ...

agree

论坛徽章:
0
36 [报告]
发表于 2007-09-17 19:28 |只看该作者
原帖由 zx_wing 于 2007-9-17 14:17 发表

呵呵,希望我们没把lz说晕


^_^,幸亏我坐在椅子上,晕了后没受伤,可以继续听二位的精彩阐述

多谢各位的纠正!

还有,前面说的关于交换的还有进一步澄清的需要:

1)物理页面永远没有被交换出去的问题。交换出的是物理页中的内容。物理页相当于容器,内容是容器中的东西。这两者区别是本质的。为什么要交换出,因为容器不够用了。要滕出给别人使用。

2)交换回来的也不是物理页(容器),而是内容,并且又随便找了个其它的容器(物理地址当然变了),将内容放入 。再告诉使用人,你的虚拟地址对应是这个容器。


这个澄清,真及时啊,多谢多谢!


太惭愧了,一直以为自己对这些概念是似懂非懂的,今日才知以前完全没有搞清楚

不过还有个问题,^_^,启用swap时,页表中指向的某个物理页面,其内容在交换文件中,跟用户空间通过mmap把打开的某个磁盘文件映射到进程虚拟空间,以及execve函数调用的加载器加载程序的过程只是把这个程序的各个段映射到进程虚拟空间中,这三个情景有什么区别和联系了?

[ 本帖最后由 augustusqing 于 2007-9-17 19:31 编辑 ]

论坛徽章:
0
37 [报告]
发表于 2007-09-17 21:33 |只看该作者
原帖由 augustusqing 于 2007-9-17 19:28 发表


^_^,幸亏我坐在椅子上,晕了后没受伤,可以继续听二位的精彩阐述

多谢各位的纠正!



这个澄清,真及时啊,多谢多谢!


太惭愧了,一直以为自己对这些概念是似懂非懂的,今日才知以前完全没有 ...

它们有几分相似。mmap主要是在内存里开一块buffer,把buffer和硬盘上的文件对应起来,buffer的首地址对应文件0偏移处,首地址+1对应文件的1字节偏移处……以此类推。这样你可以像操作内存一样操作文件,例如用memcpy。内核会帮你完成buffer到文件的同步。
当然,上面只是个简化的表示,实际上这个buffer应该叫做page cahce,它是用radix树的形式组成的,并且对于share和private这两种的不同模式的mmap,同步机制又有所不同。
我建议lz阅读《understanding linux kernel》16章2节,里面有详细的描述,我就不多打字了,实在太多了

至于加载器把程序load到地址空间的固定地址,你可以简单的认为它是把文件的内容读出来拷贝到固定的虚拟地址,只不过用了mmap这种操作文件的方式,有点类似于mmap中的private方式。

[ 本帖最后由 zx_wing 于 2007-9-17 21:35 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2007-09-17 21:52 |只看该作者
原帖由 zx_wing 于 2007-9-17 14:13 发表


嗯,你这样说应该更准确一些。
我的着眼点是,page fault是转换是地址转换的一个中间过程。如果把page fault排除在MMU转换地址的过程外,缺页的时候当然不能通过虚拟地址得到物理地址。


zx_wing 说得很不错。

但:
>> page fault是转换是地址转换的一个中间过程
不认同这一点, 偶认为 page fault 不能算是地址转换的一个中间过程,虚拟地址会按照既有的规则进行转换得出物理页面。在实际的访问物理页面操作时,发现页不在物理存储上就会导至 page fault 异常的发生。

论坛徽章:
0
39 [报告]
发表于 2007-09-17 21:57 |只看该作者
我曾经阅读过<<Linux Kernle Develepment>>中关于页缓存的章节,了解过相关的,这里主要是疑惑这块buffer和进程的关系,是否要修改进程的页表表项,来指向这块buffer了?这块buffer的首地址,是处于进程虚拟地址空间中吧
曾经实现过设备驱动的mmap功能,内核为用户进程新建一个vm_area_struct结构,而驱动要做的就是让这个vm_area_struct映射到设备内存,用remap_page_range()实现的,没有分析过这个函数的具体实现,现在手头也没有分析的环境,估计应该是修改进程页表,指向设备内存

还有就是加载器加载程序的过程,CSAPP上说是把这个程序的各个段映射到进程虚拟空间中,应该也是为进程建立一些vm_area_struct,每个vm_area_struct指向程序的一个段,再修改进程页表中相应表目,使其指向哪里了?指向这个可执行程序的page cache的page?

晕,好像这里又把磁盘文件的页缓存page cache的关系扯进来了,会更晕了


《understanding linux kernel》确实也经典,多谢推荐。

论坛徽章:
0
40 [报告]
发表于 2007-09-17 22:03 |只看该作者
至于加载器把程序load到地址空间的固定地址,你可以简单的认为它是把文件的内容读出来拷贝到固定的虚拟地址,只不过用了mmap这种操作文件的方式,有点类似于mmap中的private方式。

我感觉加载器加载程序的方式应该跟驱动实现mmap映射的过程是同本质的,就是疑惑的,进程怎么跟这个磁盘文件联系起来的,怎么指向这个磁盘文件内容的,指向的是这个文件的page cache吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP