免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenzhanyiczy

虚拟地址问题求助!!高手进!! [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-11-08 16:09 |显示全部楼层
superfight   大哥呢?

论坛徽章:
0
发表于 2009-11-08 16:24 |显示全部楼层
原帖由 chenzhanyiczy 于 2009-11-8 15:49 发表
”text和bss使用相同的段:  呢么text和bss的基地址一样     偏移不一样“
偏移量为什么不可以一样呢?应该可以一样啊,因为根据每个段都可以分别映射至0-3G的线性地址空间啊

不是每个段都可以映射3G线性地址空间~ 而是只有一个段映射3G地址空间~ 而多个进程通过内核来共享一个段~ 等于又多了一层映射~
多个段映射的时候就只能分拆了~ 像linux0.11 每个段映射64MB线性地址空间~

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-11-08 16:31 |显示全部楼层
是bss和text段合起来用3GB吧~

分开用3GB是很久以前的事情了~  
目前在x86上面linux只使用了2个全局描述符~  1个供内核 1个供用户~
很早的时候在x86上确实是bss用一个局部描述符,text用一个局部描述符~ 这样bss和text的地址就可以重复了~

但大哥你之前说的“分开用3GB是很久以前的事情了~  ”是什么意思?

现在讨论的是前提是老早的linux情况

论坛徽章:
0
发表于 2009-11-08 16:32 |显示全部楼层
还是先整理一下~  现在说的段有2层~
1.data,text,bss段,这是编译器管理的段,和实际的硬件段管理无关,可以分开映射硬件的段,也可以通过管理只映射到硬件的一个段上
2.硬件管理的段,这个段是用于映射线性地址空间的
linux0.11是将data和text段分别映射到了不同的硬件段上
现在的linux是通过自己的内存管理将多个进程的data和text映射到了同一个段上,至于如何进行映射,还有待研究~

论坛徽章:
0
发表于 2009-11-08 16:39 |显示全部楼层
原帖由 chenzhanyiczy 于 2009-11-8 16:31 发表
分开用3GB是很久以前的事情了~  

这里我有解释错误~  是对于硬件来说,每个段可以有4G的逻辑地址空间,但是无论有多少逻辑地址空间,都只能使用4G线性地址空间
所以如果使用多个段的话,就只能分拆线性地址空间,使用2个段就是每个段2G,使用4个段就是每个段1G~
我当时想说的是分开使用3G逻辑地址空间~ 并不是指线性地址~  不好意思~ 可能当时思路也不是很顺,没解释好~

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-11-08 21:57 |显示全部楼层
原帖由 superfight 于 2009-11-8 16:39 发表

这里我有解释错误~  是对于硬件来说,每个段可以有4G的逻辑地址空间,但是无论有多少逻辑地址空间,都只能使用4G线性地址空间
所以如果使用多个段的话,就只能分拆线性地址空间,使用2个段就是每个段2G,使用4个段 ...



有点晕。。。
text段用了1G的线性地址空间,那么bss段就不能再映射到该1G的线性地址空间了?
也就是说,所有段都公用4G的线性地址空间,而不是每个段都可以分别对应0-3G的线性地址空间,对吗?

在以前的linux也是这样的吗?


如果都是的话,那么每个段可以有4G的逻辑地址空间好像就没什么用?因为每个段不可能用到全部的4G逻辑地址空间

论坛徽章:
0
发表于 2009-11-08 22:29 |显示全部楼层
原帖由 chenzhanyiczy 于 2009-11-8 21:57 发表

有点晕。。。
text段用了1G的线性地址空间,那么bss段就不能再映射到该1G的线性地址空间了?
也就是说,所有段都公用4G的线性地址空间,而不是每个段都可以分别对应0-3G的线性地址空间,对吗?

在以 ...


对的~ linux0.11是每个段只有64MB的线性地址空间~  然后用64个段来使用4G的线性地址空间,所以最大只支持64个进程~
现在的linux只使用2个段,一个段为内核空间,使用1G的线性地址空间,一个段为用户空间,使用3G的线性地址空间~  然后多进程共享这一个段

设计成每个段都有4G逻辑地址是为了灵活配置吧~

[ 本帖最后由 superfight 于 2009-11-8 22:33 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-11-08 22:51 |显示全部楼层
原帖由 superfight 于 2009-11-8 22:29 发表 对的~ linux0.11是每个段只有64MB的线性地址空间~  然后用64个段来使用4G的线性地址空间,所以最大只支持64个进程~现在的linux只使用2个段,一个段为内核空间,使用1G的线性地址空间,一个段为用户空间,使用3 ...
一切的一切都是来自赵炯 Linux 内核完全剖析 的这段描述:段限长定义了在虚拟地址空间中段的大小。段基址和段限长定义了段所映射的线性地址范围或区域。段内0到limit的地址范围对应线性地址中范围Base到Base+Limit。偏移量大于段限长的虚拟地址是无意义的,如果使用则会导致异常。另外,若访问一个段并没有得到段属性许可则也会导致异常。例如,如果你试图写一个只读的段,那么80386就会产生一个异常。另外,多个段映射到线性地址中的范围可以部分重叠或覆盖,甚至完全重叠,如图4-6所示。在本书介绍的Linux 0.1x系统中,一个任务的代码段和数据段的段限长相同,并被映射到线性地址完全相同而重叠的区域上。 粗体这句话太难理解了

[ 本帖最后由 chenzhanyiczy 于 2009-11-8 22:56 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-11-08 23:01 |显示全部楼层
superfight 大哥,你知道赵炯这句话粗体部分是什么意思吗?

论坛徽章:
0
发表于 2009-11-08 23:02 |显示全部楼层
原帖由 chenzhanyiczy 于 2009-11-8 22:51 发表
一切的一切都是来自赵炯 Linux 内核完全剖析 的这段描述:段限长定义了在虚拟地址空间中段的大小。段基址和段限长定义了段所映射的线性地址范围或区域。段内0到limit的地址范围对应线性地址中范围Base到Base+Lim ...


对的~ 可以重叠~ 只要所需要的数据都是一样的话~
例如子进程的创建~ 可以设计成使用一个段来映射父进程的段~
这样就不用开销大量的内存~ 但一旦有自己的数据~ 不能再共享的时候,就要分开了~

[ 本帖最后由 superfight 于 2009-11-8 23:03 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP