免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
发表于 2009-11-12 00:12 |显示全部楼层
Linux 不使用分段模式。  虽然说分段模式是x86必须要经过的一个映射, 但是Linux将段基址设为0,段界限为4G来为所有的进程设置了相同的线性地址范围
通过这种方式,Linux巧妙地在x86上绕过了分段模式。
    Linux真正关心的是分页模式。线性地址通过分页模式将线性地址映射到真正的物理地址。
    每个进程都有自己的页目录,从而可以使用相同的线性地址来映射不同的物理地址。

    在x86上,  由于Linux将段基址设为0,则实际上程序产生的段+偏移地址 实际上就是 偏移地址。 也就是说偏移地址就是线性地址
    代码段、数据段、堆栈段占用不同的线性地址,最终映射到不同的物理地址上面。

论坛徽章:
0
发表于 2009-11-12 00:27 |显示全部楼层
原帖由 deepsec 于 2009-11-12 00:12 发表
Linux 不使用分段模式。  虽然说分段模式是x86必须要经过的一个映射, 但是Linux将段基址设为0,段界限为4G来为所有的进程设置了相同的线性地址范围
通过这种方式,Linux巧妙地在x86上绕过了分段模式。
     ...

你理解的层次还不够高

linux 是不使用“分段管理的设计思想”,而不是不使用“分段模式”


分段机制是一个物理上,所有 OS 都必须使用,不能绕过,即使 x64 体系也不能完全跳过


你好好领会吧

论坛徽章:
0
发表于 2009-11-12 12:05 |显示全部楼层
赵博士书的第四章,保护模式,介绍得很好。
翻了翻一本72年的古董操作系统译著,谈的是unix之前的知识,寄存器、分段、分页等知识好多和现在x86的一样啊,毕竟x86也是ibm这个体系出来的东西。

论坛徽章:
0
发表于 2009-11-12 12:13 |显示全部楼层
“段模式”是不可避免的,所谓的“纯页模式”只是将整个线性地址当做一个整段,没有什么方法可以真正绕过“段模式”,因为这是由CPU内存访问机制所规定的。
----见“Linux 0.11内存管理”文章
http://www.oldlinux.org/Linux.ol ... x011-Mem-YuanYi.pdf

论坛徽章:
0
发表于 2009-11-12 12:55 |显示全部楼层
原帖由 gw2004 于 2009-11-10 09:48 发表
对于一个进程来说,代码段(text),数据段位于同一个虚拟空间中(0-3G用户空间)。现在还没有一个进程能够占用这么大的虚址空间,其实他们只用很小一部分。如果很大的进程,可以使用64位机。所有的进程用户空间 ...


Windows用户进程好象是2G空间,另外2G留给了操作系统。只有Data Center版的Windows Server才有3G留给用户进程。
不过这是Windows2000系列的OS的内存布局。
现在内存太便宜了,Windows是否重新布局了,我暂时没有资料证实。

论坛徽章:
0
发表于 2009-11-12 13:43 |显示全部楼层

回复 #52 mik 的帖子

版主发表评论还是要仔细看看我的贴子嘛,
原文如下:
    Linux 不使用分段模式。  “虽然说分段模式是x86必须要经过的一个映射”, 但是Linux将段基址设为0,段界限为4G来为所有的进程设置了相同的线性地址范围,通过这种方式,Linux巧妙地在x86上绕过了分段模式。

    我已经说了  分段模式是x86必须要经过的一个映射,  这是物理上必须要经过的。 不知道版主从我的上文哪一处看出来说Linux从物理上绕过了。  我说的意思是: "Linux真正的结果是根本不使用分段模式,但是x86又必须要经过这个分段映射, 所以Linux采用将段基址设为0,段界限为4G来巧妙的绕过了分段模式"

论坛徽章:
0
发表于 2009-11-13 10:14 |显示全部楼层
原帖由 billypeng 于 2009-11-12 12:55 发表


Windows用户进程好象是2G空间,另外2G留给了操作系统。只有Data Center版的Windows Server才有3G留给用户进程。
不过这是Windows2000系列的OS的内存布局。
现在内存太便宜了,Windows是否重新布局了, ...

我说的是默认情况,无论linux还是windows都可以更改的

论坛徽章:
0
发表于 2009-11-14 14:21 |显示全部楼层

看来加强学习。

看来加强学习。

   看不懂。。

论坛徽章:
0
发表于 2009-11-14 16:49 |显示全部楼层
原帖由 deepsec 于 2009-11-12 00:12 发表
Linux 不使用分段模式。  虽然说分段模式是x86必须要经过的一个映射, 但是Linux将段基址设为0,段界限为4G来为所有的进程设置了相同的线性地址范围
通过这种方式,Linux巧妙地在x86上绕过了分段模式。
     ...


不是Linux巧妙绕过分段模式,而是Intel有意提供这样的方便。当初Intel为解决16位寄存器下更大的访问地址空间,花了很大的精力。

8086采用段寄存器和偏移寄存器,解决了20位地址,1MB空间。

很快1MB不够了,采用EMS方式扩展内存,但EMS需要把不同的物理地址内存映射到相同的逻辑地址,降低了处理效率。

80286 采用基地址 + 偏移的方式,使访问内存达到16MB。

但80386出来以后,就发现这些解决方式成了多余,386直接可以访问4GB内存。但为了和286兼容,386的基地址实现的方式为从286的方式的扩展。但Intel还提供了很多方便,使得80386提供了远远超过OS实现所需要的功能,所以Linux可以轻易舍弃那些没有必要的功能,从而简化OS的设计。

只要看看i386的基地址的设置,就会看出这些痕迹,事实上在i386上,基地址32为要分为三段来设置。

论坛徽章:
0
发表于 2009-11-15 12:49 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP