免费注册 查看新帖 |

Chinaunix

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

用户态进程空间相互独立的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-01 11:43 |只看该作者 |倒序浏览
以下讨论都基于用户态,假设有进程A 进程B工作在linux用户态下,

现象:
进程A中有一局部变量var, 且其逻辑地址为(0xbfae7cd0),A启动后一直运行,不退出.
同时进程B中强制转换该地址为int * ptr = (int *)(0xbfae7cd0);
随后取该变量中的值, value = * ptr;
则进程B会中止运行,并打印 "Segmentation fault".

问题:
为何进程B中无法访问这个在A中已经映射到全局页表中的逻辑地址 ??

ULK中提到,linux中由于对所有进程采用了同样的"用户态代码段"和
"用户态数据段",那么是不是就意味着,所有用户态的进程在执行时间的代码段选择符CS
和数据段选择符DS都是一样的 ?? 并且都可以访问0~3G的线性地址空间 ??
由于页目录和页表是所有进程共用的,那么当进程A将变量var所在页框对应的页表项
初始化后, B拿到这个逻辑地址,岂不是也一样可以访问这个变量单元了 ??

真是想糊涂了,请大家指路,谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-03-01 12:27 |只看该作者
原帖由 eastage 于 2008-3-1 11:43 发表
以下讨论都基于用户态,假设有进程A 进程B工作在linux用户态下,

现象:
进程A中有一局部变量var, 且其逻辑地址为(0xbfae7cd0),A启动后一直运行,不退出.
同时进程B中强制转换该地址为int * ptr = (int *)(0xb ...

各进程有自己的页表,页表相互独立。
CS、DS每进程有一套,进程切换的时候载入寄存器

论坛徽章:
0
3 [报告]
发表于 2008-03-01 22:43 |只看该作者
原帖由 eastage 于 2008-3-1 11:43 发表
以下讨论都基于用户态,假设有进程A 进程B工作在linux用户态下,

现象:
进程A中有一局部变量var, 且其逻辑地址为(0xbfae7cd0),A启动后一直运行,不退出.
同时进程B中强制转换该地址为int * ptr = (int *)(0xb ...



LINUX采用分页机制来进行内存管理,只是在X86结构下出于CPU兼容性的考虑要进行段映射,在很多体系结构下是直接使用分页机制而无须进行段影射的。所以说在系统正常启动以后内存管理采用分页方式,每个进程有单独的页表,在进程切换时要进行页表的切换。每个进程虚拟地址空间3G以上部分是内核直接映射的地址区间,这部分的虚拟地址对于每个进程是相同的。你的例子是两个用户进程,可直接操作的内存空间是虚拟地址3G以下的范围,各进程是不同的。

[ 本帖最后由 dengcainiao 于 2008-3-1 22:45 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP