免费注册 查看新帖 |

Chinaunix

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

[进程管理] 请问:段地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-14 10:47 |只看该作者 |倒序浏览
我看资料说:
进程的代码段和数据段的虚拟空间是地址是重叠的,
起始地址都是0x00000000,段长度也一样。
那它们在设置时,是如何定义段描述符的?
因为数据段和代码段的属性是不同的,在段描述符
中不能同时定义,即使可以定义,两个段重叠,
不会冲突吗?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-01-14 12:45 |只看该作者
netdoger 发表于 2014-01-14 10:47
我看资料说:
进程的代码段和数据段的虚拟空间是地址是重叠的,
起始地址都是0x00000000,段长度也一样。
...

Linux中没有使用分段机制,所有段的基址都是0,权限肯定有差别,所有段分布于线性地址空间中的不同区域,不会有冲突。

论坛徽章:
0
3 [报告]
发表于 2014-01-14 14:34 |只看该作者
humjb_1983 发表于 2014-01-14 12:45
Linux中没有使用分段机制,所有段的基址都是0,权限肯定有差别,所有段分布于线性地址空间中的不同区域, ...

那在函数调用时,压栈要不要压段选择子?
另外你说:所有段分布于线性地址空间中的不同区域,那么能不能知道具体分布,
比如:代码段分布地址在哪?数据段分布在哪?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-01-14 14:59 |只看该作者
netdoger 发表于 2014-01-14 14:34
那在函数调用时,压栈要不要压段选择子?
另外你说:所有段分布于线性地址空间中的不同区域,那么能不能 ...

压栈时应该不会压“段选择子”吧,这个没啥意义~
内存分布,以我的环境中的init进程为例:
[root@localhost ~]# cat /proc/1/maps
00400000-00409000 r-xp 00000000 fd:00 41877855                           /sbin/init
00609000-0060a000 rw-p 00009000 fd:00 41877855                           /sbin/init
00989000-009aa000 rw-p 00989000 00:00 0                                  [heap]
3786600000-378661c000 r-xp 00000000 fd:00 21004609                       /lib64/ld-2.5.so
其中,可根据权限判断第1段(r-xp)应该是代码段,第二段应该是数据段。

论坛徽章:
0
5 [报告]
发表于 2014-01-14 16:17 |只看该作者
那么是不是任何进程,它的代码段和数据段的开始地址都是相同的?

论坛徽章:
0
6 [报告]
发表于 2014-01-14 23:32 |只看该作者
本帖最后由 程序员王柏生 于 2014-01-14 23:50 编辑

回复 1# netdoger

1. 关于段的地址从0开始分配的问题,你了解一下内存的平坦模式(flat model),就了解了。记得“情景分析”那本书中谈到这是什么Linux采用的技巧,根本不是这么回事,这是Intel 处理器为了避开自己的段机制的一种内存模型而已。很多BIOS、Bootloader(如 GRUB)都采用x86的这种模式,如果有兴趣可以翻翻代码。

2. 程序编译链接时,链接器会顺次安排好代码、数据的地址,所以不会发生地址冲突的问题。

3. 代码段的起始地址一般是相同的,这是IBM最先使用的一个地址,后来大家就都沿用下来了。至于后面的数据段,显然要顺次接在代码段之后。实际上,代码和数据运行时地址,或者说虚拟地址,各个程序是否相同不重要、而且它们也没有任何关系,最后它们被MMU映射到哪块物理内存,这才是关键。

   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-01-15 12:56 |只看该作者
netdoger 发表于 2014-01-14 16:17
那么是不是任何进程,它的代码段和数据段的开始地址都是相同的?

如之前所说,代码段和数据段基址都是0,每个进程的各段的具体开始地址(偏移量)不一定相同,跟编译相关。由于每个进程的虚拟地址空间都是独立的、隔离的,所以即使相同也不会有任何影响,换句话说,各进程的地址空间分布是没有关系的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP