免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
51 [报告]
发表于 2007-09-18 14:08 |只看该作者
1) 加载程序不是修改“页表中固定虚拟地址对应的页表项”;而是将这些页表项单纯的清0,同时设置vma_area。
page_fault中发现页表项为0,会根据( vm_file -> f_dentry -> d_inode,vm_pgoff( 既vm_start的文件内偏移) + ( 异常地址 - vm_start ) >> PAGESIZE_BITS ),在pagecache中搜索得目标page。
同时,page_fault根据vm_flag确定是共享还是私有,决定页表项是直接影射目标page,还是复制一个内容与目标page一模一样的匿名page,影射到匿名page上。

2)page在何时添加至pagecache,与page_fault没有必然联系。
当然,在1)中,搜索pagecache寻找目标page时,可能page还不在pagecache中,page_fault会在pagecache中添加这个page,但这只是情况之一。

3)各个段是否只读由文件中的elf32_phdr [] 数组决定,但这不是关键,关键是所有的段,除了bss及堆栈以外,全部都是私有影射。
这样,写代码段,还是写已初始化数据段,都完全有可能,但是写的不是pagecache中的页,而是对照pagecache中的页,复制的一个匿名页。


另外,复制的匿名页迟早会被kswapd进程扫描到,将其转变为有名页( swapcache,swap_entry)。
( swapcache,swap_entry) 代表了swapcache中的一个page,这个page对应着交换设备上的一个磁盘页,这个磁盘页,就是虚拟内存。

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


^_^,终于看到你说"不错"了,多谢多谢,^_^

加载程序的时候,文件的代码节、数据节在文件中都有偏移offset,加载程序只是修改页表中固定虚拟地址对应的页表项,指向这个文件的页缓存的相应的偏移offset, ...

是的,lz和塑料袋兄说的都是一个意思,即linux中的demanding page机制,所谓用时分配。

>>2,你的意思是所有vm_area对应的空间都不能写?只能读?
>>写驱动时,比如LCD,frame buffer结构,为显存分配一个vm_area,再mmap到用户空间,用户当然有写权限啊

塑料袋兄这里的意思是kernel通过vm_area这个数据结构来控制某段内存的读写权限。并非所有的vm_area对应的内存段都不可写。
kernel通过两个手段,一是在页表中设权限,一是vm_area的权限来管理内存。一些很有趣的事情可以通过操作它们发生,例如页标志某个页可写,但vm_area结构中又标识这个页可写,那么内核就知道该copy on write了……扯远了,说到vm_area顺便提两句而已。

[ 本帖最后由 zx_wing 于 2007-9-18 14:20 编辑 ]

论坛徽章:
0
53 [报告]
发表于 2007-09-18 14:17 |只看该作者
LZ和塑料袋的考虑是正确的。

加载一个程序OS没有专门分配内存,在把二进制代码拷贝过去再运行。也是用mmap的原理。然后缺页。不同的段有不同的权限。

加载一个程序同时也LOAD了.so, 这些在物理页都有address space (PAGE CAHCE)

UNIX的东西非常妙。其它系统未必一定如此。




原帖由 zx_wing 于 2007-9-18 12:49 发表

lz总结的不错。但我不认为加载程序的时候,代码位于文件的的page cache中。这是不合常理的。操作系统应该专门为程序分配内存,再把二进制代码拷贝过去。否则,当程序运行时,它本身的目标文件被读写修改了,会 ...

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
54 [报告]
发表于 2007-09-18 14:22 |只看该作者
ELF文件中,有两个比较关键的结构,elf32_hdr,elf32_phdr [  ]

elf32_hdr肯定位于文件的开始,记载着
1)  elf32_phdr [  ]由文件偏移多少开始,共多少个元素。
2)  本文件的entry_point,既返回到用户空间后,由哪个地址开始执行。

每个elf32_phdr中记载着一个段,关键内容包含
p_offset:   本段在文件中的偏移
p_filesz:    本段长度
p_vaddr:   本段要求影射到进程[ 0,3G] 间的哪个地址
p_flag  :    本段 读?写?执行?



我不是所有vma_area都不能写的意思,deny_write_access是不能通过sys_write写。

论坛徽章:
0
55 [报告]
发表于 2007-09-18 14:30 |只看该作者
这下又有头绪了
我的疑惑:
1),加载器加载程序时,虚拟地址到二进制文件的对应关系记录在vm_file这里,页表项是清零的
2),二进制文件的代码和数据确实要读入到该文件的page cache中,但进程的页表项指向的有两种,页缓存中物理页面,或者复制的与页缓存中物理页一样内容的一个匿名页
3),对于二进制文件,其elf32_phdr [] 数组中会规定其代码、数据段不可写
而如果是映射普通文本文件,如其各个段可写,就会根据映射的类型,是共享映射,写的就是这个文件的页缓存中页,其它也共享这个文件的进程就也看得到,而如果是私有映射,就是写时拷贝,写的是根据页缓存中页复制出来的页匿名页,或者说改写的是自己进程空间的页面,其它进程看不到

请问有没有误解您的话了?

论坛徽章:
0
56 [报告]
发表于 2007-09-18 14:36 |只看该作者
原帖由 zx_wing 于 2007-9-18 14:13 发表
塑料袋兄这里的意思是kernel通过vm_area这个数据结构来控制某段内存的读写权限。并非所有的vm_area对应的内存段都不可写。
kernel通过两个手段,一是在页表中设权限,一是vm_area的权限来管理内存。一些很有趣的事情可以通过操作它们发生,例如页标志某个页可写,但 vm_area结构中又标识这个页可写,那么内核就知道该copy on write了……扯远了,说到vm_area顺便提两句而已。


不要怕扯远啊,^_^,”例如页标志某个页可写,但 vm_area结构中又标识这个页可写“,这里是页标志不可写,vm_area中可写的笔误吧,写某个虚拟地址时,是先查看vm_area,再通过MMU检查pte吧,才会引起缺页异常或者页保护异常吧

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
57 [报告]
发表于 2007-09-18 14:41 |只看该作者
没有

补充
1)vm_file只是记录了一半。对应关系就是( mapping,index),vm_file -> f_dentry -> d_inode -> i_mapping,可以得到mapping;而index需要通过vm_start,vm_pgoff来得到

3)数据段推测应该是可写,将来影射为 私有可读写

论坛徽章:
0
58 [报告]
发表于 2007-09-18 14:44 |只看该作者
原帖由 思一克 于 2007-9-18 14:17 发表
LZ和塑料袋的考虑是正确的。

UNIX的东西非常妙。其它系统未必一定如此。


^_^,为什么很大论坛都说UNIX是永远的UNIX,晕哦

论坛徽章:
0
59 [报告]
发表于 2007-09-18 15:03 |只看该作者
原帖由 augustusqing 于 2007-9-18 14:36 发表


不要怕扯远啊,^_^,”例如页标志某个页可写,但 vm_area结构中又标识这个页可写“,这里是页标志不可写,vm_area中可写的笔误吧,写某个虚拟地址时,是先查看vm_area,再通过MMU检查pte吧,才会引起缺页异 ...

呵呵,是笔误,多谢提醒。

论坛徽章:
0
60 [报告]
发表于 2007-09-18 15:29 |只看该作者
原帖由 塑料袋 于 2007-9-18 14:41 发表
没有

补充
1)vm_file只是记录了一半。对应关系就是( mapping,index),vm_file -> f_dentry -> d_inode -> i_mapping,可以得到mapping;而index需要通过vm_start,vm_pgoff来得到

3)数据段推测应该是可写,将来影射为 私有可读写


至此,暂时没有"断层"和疑惑了,再次多谢各位!(抱拳)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP