Chinaunix

标题: 请问关于CPU的虚拟地址空间和虚拟内存 [打印本页]

作者: 新警察    时间: 2009-09-08 00:43
标题: 请问关于CPU的虚拟地址空间和虚拟内存
书上说386的虚拟地址空间是64TB。但是我怀疑,虚拟内存真的能超过4GB吗?〔这里认为CPU地址线是32根,不考虑36根地址线的pentium pro〕

关于为windows系统设置虚拟内存,理论上,虚拟内存设置为100GB比设置为10GB效果更好吗?或者说,如果有了4GB的物理内存,是不是就再也不会用到硬盘充当虚拟内存了?
64TB只是48位*地址空间*?而*虚拟内存*最大值应该还是4GB?
高手表走,谢谢先
作者: lyhongfeng    时间: 2009-09-08 01:22
不能这样算,你还是先看看其保护模式再说
作者: 新警察    时间: 2009-09-08 06:56
老大,我说的就是保护模式啊。
我是自学的,看书怎么也看不明白,很痛苦,才来麻烦你们的,谢谢
作者: 新警察    时间: 2009-09-08 07:15
我在网上查了,有两种说法,一种是说,可以用硬盘把虚拟内存扩展到64TB;另一种说法是,最大4GB,扩展到4GB以上,超出的部分不会起作用的,如果有4GB的内存,OS就不可能用到硬盘作为虚拟内存了。
到底哪种说法是对的啊,跪求!!
作者: emmoblin    时间: 2009-09-08 09:27
32位的cpu只能寻址4G空间,如果要高于4G就需要通过physical address extension(简称PAE)技术实现,扩展为36个地址位来支持64G内存

参考:
http://hi.baidu.com/odawn/blog/item/012767318c490110eac4af6f.html
作者: 新警察    时间: 2009-09-08 09:33
谢谢楼上,我说的是虚拟内存,不是物理内存啊,
64TB意味着什么呢?是不是理论上可以用64TB的硬盘把虚拟内存扩大到64TB?我在网上查了,有两种相反的说法啊
作者: ecloud    时间: 2009-09-08 10:14
原帖由 新警察 于 2009-9-8 09:33 发表
谢谢楼上,我说的是虚拟内存,不是物理内存啊,
64TB意味着什么呢?是不是理论上可以用64TB的硬盘把虚拟内存扩大到64TB?我在网上查了,有两种相反的说法啊

是的,你可以这么理解
不过究竟可以用多少虚拟内存还取决于操作系统
64TB只是CPU最大的寻址上限,很多操作系统可能达不到这个上限

另外,至于你的有4GB物理内存还需不需要虚拟内存的问题,这一方面取决于应用程序,比如大型的图像处理程序,用10GB内存都不是奇怪的事情。另外也取决于操作系统的换页机制,有的操作系统即便是你有100G的物理内存,也会把物理内存的页面不定期的换到swap里面去
作者: unixlinuxsys    时间: 2009-09-08 10:24
64TB只是CPU最大的寻址上限
是理论值

有4GB物理内存,基本用不倒虚拟内存
作者: 新警察    时间: 2009-09-08 10:33
谢谢。
是不是如果真的有64TB虚拟内存,就意味着CPU必须有48根地址线,才能完全利用虚拟内存?
是不是对于32位CPU〔比如有36根地址线的pentium pro〕,如果没有开启PAE技术,那么,在已经有了4GB物理内存的情况下,用硬盘充当虚拟内存没有效果,因为OS不能寻址4GB以上的内存?是这样吗?
作者: JohnBull    时间: 2009-09-08 12:01
原帖由 新警察 于 2009-9-8 10:33 发表
谢谢。
是不是如果真的有64TB虚拟内存,就意味着CPU必须有48根地址线,才能完全利用虚拟内存?
是不是对于32位CPU〔比如有36根地址线的pentium pro〕,如果没有开启PAE技术,那么,在已经有了4GB物理内存的情 ...


可以看看X86的页表结构

x86的页表结构决定了它最大可以表达多大的物理地址空间
平坦内存模式和32位线性地址空间决定了进程的4G空间限制
CPU管脚决定了使用“内存条”的限制
OS的文件系统决定了交换分区的限制
四者其实没什么必然关系
作者: mingyanguo    时间: 2009-09-08 12:17
原帖由 新警察 于 2009-9-7 08:43 发表
书上说386的虚拟地址空间是64TB。但是我怀疑,虚拟内存真的能超过4GB吗?〔这里认为CPU地址线是32根,不考虑36根地址线的pentium pro〕

关于为windows系统设置虚拟内存,理论上,虚拟内存设置为100GB比设置为 ...

看乱七八糟的书不如看intel手册,实话实说,我看不出这个64TB是怎么算出来的。 64T = 2^46 = 2^(32 + 10 + 4)
作者: wheel    时间: 2009-09-08 12:38
标题: 回复 #10 JohnBull 的帖子
再补充一个。。内核的位数决定于可最大使用的内存。和交换分区无关
作者: cjaizss    时间: 2009-09-08 13:04
64T怎么算的?很好奇.
"是不是如果真的有64TB虚拟内存,就意味着CPU必须有48根地址线,才能完全利用虚拟内存?"
不是,物理上(并行接口)和虚拟存储上(CPU行为)是有区别的两回事
作者: vxasm    时间: 2009-09-08 14:50
原帖由 新警察 于 2009-9-8 00:43 发表
书上说386的虚拟地址空间是64TB。但是我怀疑,虚拟内存真的能超过4GB吗?〔这里认为CPU地址线是32根,不考虑36根地址线的pentium pro〕

关于为windows系统设置虚拟内存,理论上,虚拟内存设置为100GB比设置为 ...


因为386中的段由描述符来描述,而每个段最大可达4G,并且系统中又有全局描述符表和局部描述符表各一张,所以最大的虚拟地址空间是:4GB×8096×2=64TB。

因此说,64TB是整个系统中可描述的最大虚拟空间,而4GB是每个任务可访问的最大虚拟空间,注意不要搞混了。
作者: YaoFei    时间: 2009-09-08 15:21
14楼正解。

虚拟内存是每个进程可以看到的逻辑地址范围,不考虑段描述符映射关系的时候可以吧段地址的位数加上每个段长度的32位看成是 48位地址空间,也就是所谓的 64T。

这个只有逻辑意义,跟硬盘上的交换空间还不是一回事。

在硬件上,段地址通过描述符表加上偏移量成为线性地址,也只有32位。

可惜x86上没有哪个操作系统用段式内存管理,只玩分页,所以虚拟地址空间只考虑32位。
作者: vxasm    时间: 2009-09-08 16:03
原帖由 vxasm 于 2009-9-8 14:50 发表


因为386中的段由描述符来描述,而每个段最大可达4G,并且系统中又有全局描述符表和局部描述符表各一张,所以最大的虚拟地址空间是:4GB×8096×2=64TB。

因此说,64TB是整个系统中可描述的最大虚拟空间 ...


感谢慷慨大方的cjaizss,呵呵。
作者: mik    时间: 2009-09-08 23:18


to vxasm:

很明显,你的解释是错误的,张冠李戴,牵强附会!

你这个:4GB×8096×2=64TB 的想法是怎么得来的?

首先:

1、descriptor table 可以容纳、可寻址的 descrptor 数量是 8192(0 ~ 8191)个

从下面两方面限制得出来:

(1) selector 结构的 selector.SI = 0 ~ 8191,即 selector 最大可寻址 8192 个 descriptor

(2) GDTR.limit 和 LDTR.limit 最大 limit 是 0xFFFF,每个 descriptor 为 8 bytes
     因此:GDT / LDT 的最大可容纳 descriptor 为 8192 个 descriptor


2、GDT 只有一张,但 LDT 可以有多张


所以,你这个计算式子是怎么得来的?




其次:关于“64TB是整个系统中可描述的最大虚拟空间” 这个理论也是莫名奇妙

如果:segment descriptor 所描述的内存段 segment base 设为 0xffffffff,而 segment limit 设为 4G

那么:充其量 descriptor 所描述的范围最大为 0xffffffff + 0xffffffff = 8G 空间,何为 64TB 空间
作者: mik    时间: 2009-09-08 23:22
LZ:

我赞成 mingyanguo   的看法,好好的看一看 intel 和 AMD 的文档


至于,你在书上看到的 64TB 虚拟地址空间,是在哪本书看?

把那一段贴出来,不是书上有误,就是你理解有误
作者: mingyanguo    时间: 2009-09-09 03:57
原帖由 mik 于 2009-9-8 07:22 发表
LZ:

我赞成 mingyanguo   的看法,好好的看一看 intel 和 AMD 的文档


至于,你在书上看到的 64TB 虚拟地址空间,是在哪本书看?

把那一段贴出来,不是书上有误,就是你理解有误


我估计书上这种说法的来源,就是上面同学解释的,每个段的容量x段的数量。每个段的描述区间都在[0, 4G)之间,不知道把这些区间加在一起算什么。反过来说,一共就这么大的区间,你在里面放多少个段也不会把区间变大。
作者: slippp    时间: 2009-09-09 11:43
14楼的解释很牵强,无论怎么分段,都是会映射到相应的线性地址,线性地址不是独立的空间。我看了那么多手册没见过64T的说法。
作者: 新警察    时间: 2009-09-09 12:48
我的看法,linux最大进程数是4090,就算每个进程都疯狂使用进程,用到4GB(把分给系统的一半也算上),那么也用不掉全部虚拟内存,只能用掉1/4。
4090*4GB和64TB
还是很困惑啊
作者: vxasm    时间: 2009-09-09 13:37
原帖由 mik 于 2009-9-8 23:18 发表


to vxasm:

很明显,你的解释是错误的,张冠李戴,牵强附会!

你这个:4GB×8096×2=64TB 的想法是怎么得来的?

首先:

1、descriptor table 可以容纳、可寻址的 descrptor 数 ...


汗,我前面说“全局描述符表和局部描述符表各一张”是打错字了,我所说的意思是:全局描述符表和局部描述符表最大都可容纳8096个描述符,而每个描述符又可描述4G空间,所以最大虚拟地址空间是:4GB×8096×2=64TB。

另外说明下:

1 mik说的2点都没错;

2 64TB只是理论上386可描述的最大虚拟地址空间,和实际应用挂不上钩,在实际操作系统中也找不到此理论的实践;
作者: 新警察    时间: 2009-09-09 13:54
我找到的资料:
Red Hat Enterprise Linux 2.1 支持最大32个swap分区, 单个最大2GB, 总共最大64GB.
我想这里的64GB也就是开启了PAE之后能寻址的内存范围吧。只是不知道有的说为大型应用划分200GB交换分区是为什么啊

[ 本帖最后由 新警察 于 2009-9-9 13:56 编辑 ]
作者: 新警察    时间: 2009-09-09 13:59
google到的:

Red Hat Enterprise Linux 3 以及更新的版本支持更大的swap分区, 单个分区的大小将取决于该系统的最大文件大小的限制和swap分区的块设备的限制。Red Hat Enterprise Linux 3 的block设备限制是1TB,所以限制是 1TB.更大的swap空间也是可以实现的,一个很大的swap分区会影响系统的性能, 更好的选择是使用多个磁盘分区存放swap. 可以降低单个磁盘的压力。
作者: mik    时间: 2009-09-09 20:10
原帖由 vxasm 于 2009-9-9 13:37 发表


汗,我前面说“全局描述符表和局部描述符表各一张”是打错字了,我所说的意思是:全局描述符表和局部描述符表最大都可容纳8096个描述符,而每个描述符又可描述4G空间,所以最大虚拟地址空间是:4GB×8096× ...

不吐不行

8096 是怎么来的?

>> 2 64TB只是理论上386可描述的最大虚拟地址空间,和实际应用挂不上钩,在实际操作系统中也找不到此理论的实践;

拜托不要继续误导人家


解释一下什么叫做”最大虚拟地址空间”?

好,退一步来说:按你的说法是:所有可描述的地址空间总和??  那也远远不止 64T 这个数量
作者: lixinwei1985@si    时间: 2009-09-11 13:15
LS 真恶心
不关对错至少在vxasm说出的自己观点而且描述清楚
你还不吐不行。。。还远不止64T 你给说个能有多少 你当自己是神阿
作者: mik    时间: 2009-09-12 11:10
原帖由 lixinwei1985@si 于 2009-9-11 13:15 发表
LS 真恶心
不关对错至少在vxasm说出的自己观点而且描述清楚
你还不吐不行。。。还远不止64T 你给说个能有多少 你当自己是神阿


你有没有看贴的?

我在17楼已经讲得很清楚,有理有据,议事论事。

他哪里描述清楚了?

不看贴,别乱放P
作者: bluehumor    时间: 2009-09-12 22:20
没怎么细看各位的分析,觉得这个问题好像并没有什么实际意义。


随手翻了两本自己手头上的中文的关于保护模式的书。

杨季文的《80x86汇编语言程序设计教程》有这句“虚拟存储器的地址(逻辑地址)由指示描述符的选择子和段内偏移两部分构成,这样的地址集合成为虚拟地址空间。80386支持的虚拟地址空间可达64T字节。”

周明德主编的《保护方式下的80386及其编程》写到“线性地址空间具有与物理地址空间同样的结构。和二维虚拟地址空间相对比,线性空间与物理空间都是一维空间。虚拟地址空间包含的段数,最大可到16K个,每个段可以有4G字节的容量,从而构成64兆兆(2^46)字节容量的虚拟地址空间。而线性地址空间及物理地址空间的容量都是4G字节。”

顺便说一下,杨的这本书保护模式文字部分基本上是摘自周的这本书上的,而周这本书93年出的,据某人说是翻译的80386总设计师写的《Programming the 80386》

[ 本帖最后由 bluehumor 于 2009-9-12 22:21 编辑 ]
作者: lixinwei1985@si    时间: 2009-09-14 08:55
原帖由 mik 于 2009-9-12 11:10 发表


你有没有看贴的?

我在17楼已经讲得很清楚,有理有据,议事论事。

他哪里描述清楚了?

不看贴,别乱放P


至少比你说的清楚多了
vxasm 说的 4GB×8096×2=64TB 要比你的 0xffffffff + 0xffffffff = 8G 更有道理

借用你话
你这个:0xffffffff + 0xffffffff = 8G 的想法是怎么得来的?
作者: mik    时间: 2009-09-14 21:11
原帖由 lixinwei1985@si 于 2009-9-14 08:55 发表


至少比你说的清楚多了
vxasm 说的 4GB×8096×2=64TB 要比你的 0xffffffff + 0xffffffff = 8G 更有道理

借用你话
你这个:0xffffffff + 0xffffffff = 8G 的想法是怎么得来的?


你看不懂就算,看多点资料才来为别人辨解

我不屑回答你,你爱咋认为就咋认为。
作者: accessory    时间: 2009-09-15 00:22
建议LZ先找本OS的书,好好看看虚拟地址和虚拟内存的区别。比如 <<Operating Systems: Internals and Design Principles>> 一书中的第7,第8章。

自学就要看经典的书,学会自己思考。

下面是我自己简单的解释:
虚拟地址的产生是由于INTEL CPU硬件决定的。它的含义是,在INTEL CPU保护模式下,指令使用的地址都是虚拟地址。都需要经过CPU的MMU(内存管理器)翻译过之后,才是真正的物理地址。这个也可以说和CPU的寻址能力有关。比如有32 BIT 地址线的CPU,  36 BIT 地址线的CPU等。即使现在的 64 BIT CPU,也没有把所有的64BIT 地址线都做上去,因为基本用不到那么多。

虚拟内存主要是由操作系统来控制的。CPU硬件也提供一些必要的支持。虚拟内存的大小和CPU寻址能力没有必然的关系。所谓虚拟内存,也就是“假的”内存。也就是把硬盘上的文件当作内存。为啥要这样呢?因为有的程序需要很大的内存(比如8G),但是机器上的物理内存没那么大(比如只有1G)。那么这时设计OS的人有2个选择,选择1,直接告诉程序,你没法运行。升级硬件吧。 选择2,用硬盘(可以很大)上的一个或者几个文件来代替物理内存,暂时保存些数据。这样的好处是程序还可以跑,但是会比较慢。因为硬盘的存取速度比真正的内存慢很多。

所以说不管你的虚拟内存,WINDOWS OR LINUX SWAP可以设置的多大,最理想的情况是不到万不得已不要用它。

罗嗦了半天,希望能对后面看贴的人有点用。如果有不对的地方 ,也欢迎大家指出。
作者: accessory    时间: 2009-09-15 00:37
关于 VXASM 和 MIK 2位之间的讨论。我觉得是这样的:
VXASM 企图找到 64 TB的来源。但是他(有意或者无意)忽略了一个地方。那就是LDT 可以有多张。多张之间可以不一样。 只有当所有的LDT都一样的时候,才能算出 64 TB. 如果 LDT 不一样,那么就不止 64 TB了。

关于MIK, 这个 0xffffffff + 0xffffffff = 8G 含义是清楚的,那就是 0XFFFFFFFF = 4G (其实是4G-1).      4G+4G =8G.
但是为啥要用到这个公式呢?每个段的基地址都可以不一样啊。假如CPU有足够多的地址线,同时机器上插了足够多的物理内存。那么每个段都可以映射到不同的地方。所以会超出 8G。

另外,讨论归讨论。就事论事嘛。没必要又是吐啊 ,又是不屑啊的。 谁也不是天生什么都懂的。我也不是,如果以上解释有不对的地方,欢迎指正。
作者: mingyanguo    时间: 2009-09-15 00:51
原帖由 bluehumor 于 2009-9-12 06:20 发表
没怎么细看各位的分析,觉得这个问题好像并没有什么实际意义。


随手翻了两本自己手头上的中文的关于保护模式的书。

杨季文的《80x86汇编语言程序设计教程》有这句“虚拟存储器的地址(逻辑地址)由指示 ...

这应该是个来源,这两本书似乎流传很广。
回到主题说,纠缠这种字眼没什么意思,要了解CPU的原理,不是去考试做填空选择题。知道虚拟地址->线性地址->物理地址基本上就够了。像64T这种问题基本上是看你自己怎么定义概念了,没什么用。
作者: mik    时间: 2009-09-15 00:57
原帖由 accessory 于 2009-9-15 00:37 发表
关于 VXASM 和 MIK 2位之间的讨论。我觉得是这样的:
VXASM 企图找到 64 TB的来源。但是他(有意或者无意)忽略了一个地方。那就是LDT 可以有多张。多张之间可以不一样。 只有当所有的LDT都一样的时候,才能算 ...


我之所以对 vxasm  吐,是因为我前面指出他 3 个的错误,他还继续他的理论。
1、8096 这个数之错
2、2 个 descriptor- table 之错
3、64TB 之错

为了64TB,强硬找个式子!


至于说 8G,完全是根据他的 64TB 理论,而说出“顶多也就是 8G "
作者: 新警察    时间: 2009-09-15 01:01
谢谢accessory,我在图书馆里没有找到那本书,可以推荐一本中文版的关于os的、能解释虚拟地址与虚拟内存之间区别的经典书吗?
英语的也可以,但是不好找啊。
作者: mik    时间: 2009-09-15 01:04
vxasm 最大错误是:把虚拟内存搞成了虚拟地址空间

如果就虚拟内存,来解释:那么 64TB 这个概念就勉强可以接受


另外,这里不涉及物理内存,扯上物理内存(地址)就超出范围
作者: 新警察    时间: 2009-09-15 01:08
我这里就有周明德的这本书,以前对比过programming the 80386这本书,简直就是整篇整篇的复制呀,哎,
作者: changsha    时间: 2009-09-15 19:48
怎么没人能说清楚?
作者: rawa9999    时间: 2009-09-15 20:14
不是那样的,精简指令计算机就是运用简化的指令描述大地址空间和处理大位数数据,intel&AMD生产的是PC用的通用处理器,不需要大数运算,不需要解决NP问题,只要需要32位计算机可以控制大内存,但是你买回家的处理器不行,你可以自己设计处理器。
作者: accessory    时间: 2009-09-15 23:17
原帖由 新警察 于 2009-9-15 01:01 发表
谢谢accessory,我在图书馆里没有找到那本书,可以推荐一本中文版的关于os的、能解释虚拟地址与虚拟内存之间区别的经典书吗?
英语的也可以,但是不好找啊。


那本书有翻译成中文的。中文名是:操作系统:精髓与设计原理(第5版)。下面是一个连接: http://www.amazon.cn/%E6%93%8D%E ... 96%AF/dp/B00114AMBQ

或者看下面这本,也是翻译的。不过我没看过
http://www.china-pub.com/2033
作者: lixinwei1985@si    时间: 2009-09-16 08:47
。。。

[ 本帖最后由 lixinwei1985@si 于 2009-9-16 08:58 编辑 ]
作者: shenbo7    时间: 2009-09-17 11:45
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T

硬件地址寻址空间,是和CPU的管脚数有关;
作者: emperor    时间: 2009-09-20 13:35
嗯,好帖子,只有一人说对了。。。。。。
作者: newIT666    时间: 2009-09-20 20:42
原帖由 shenbo7 于 2009-9-17 11:45 发表
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长 ...


   高人.
作者: rawa9999    时间: 2009-09-20 22:16
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。这是386一个专门用来寻找虚拟内存的寄存器。32位基地址是物理内存的地址,16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示该内存分页的特权级别。最大内存索引虚拟内存2^14*4G=64T
--------
分析:由于GDTR是48bit寄存器,CPU通用寄存器是32bit(还有16bit)所以一个指令周期根本不能处理这个48bit的寄存器,需要很多指令操作这个寄存器。欢迎讨论。
作者: rawa9999    时间: 2009-09-20 22:48
386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器,两部分数据分别由两种类型的通用寄存器处理。直接寻址就是一个指令周期能读入和写出的地址。GDTR寄存器仅仅代表了一种能力,可以软实现。
作者: mik    时间: 2009-09-20 23:25
这贴没有再讨论的必要了。


这么多人都把“虚拟地址空间”和“虚拟内存”搞混淆!


virtual address   --------------------->  linear(or physical) ----------------> physical address
(logic address)       (segmentation)                                             (paging)




1、  寄存器,包括: GDTR、LDTR、IDTR & TR, Segment(selector) registers
   数据结构,包括:GDT、LDT、IDT & TSS
  以及由此产生的各种寻址手段 -------- 段式管理范畴
------------------------------------------------------------------------------
  这些都是 segmentation (段式管理)阶段,在 segmentation 阶段没有真正意义的 虚拟内存 的概念。

  在 segmentation 阶段负责将 virtual address(有时称为逻辑地址) 转化为 linear address (无分页时是物理地址)


     在 segmentation 阶段只有地址空间的概念,整个地址空间就是 4G,无论在这个空间里怎么分割,整个空间还是 4G



2、 只有在 paging 管理下才有真正意义的 虚拟内存,通过分页可以将不存在的物理内存,虚拟成内存使用。

  可以将只有 4G 内存的机器上,通过 paging 使用超过 4G 内存。这才叫做 虚拟内存

  通过 paging 机制的,换页等手段可以实现


  在 分段机制 下能做到这一点吗? 分段机制下能访问超过 4G 的内存空间吗? 




3、 通过 GDT / LDT 来讨论 64TB 虚拟内存,地址空间等  ------ 那都是瞎谈

  不管是什么经典的教材,既使是老外的教材,我不认为他这些的说法是正确的
作者: mik    时间: 2009-09-20 23:45
原帖由 rawa9999 于 2009-9-20 22:16 发表
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。这是386一个专门用来寻找虚拟内存的寄存器。32位基地址是物理内存的地址,16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示 ...


不说不知道,一说就漏馅。

大哥,你好好读读 intel / amd 的手册吧!


1、现在的 GDTR 都是 80 位(64+16)

2、GDTR.base 放的是 linear address ,不是物理内存地址。(如果你硬要说是物理地址,那可以:在无分页下)


3、 >> 16位段限存储虚拟内存页文件的索引编号,16位其中有两位表示该内存分页的特权级别。
      
        啥东东,明明是 segment,说成 page


4、需要较多的时钟周期,并不是因为你说的这个原因,而是因为需要权限,它需要做更多的检测 check 工作

  这是所有 system instruction 的通病,所有 system instruction 类都需要做更多的工作。
作者: mik    时间: 2009-09-21 00:03
原帖由 rawa9999 于 2009-9-20 22:48 发表
386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器,两部分数据分别由两种类型的通用寄存器处理。直接寻址就是一个指令周期能读入和写出的地址。GDTR寄存器仅仅代表了一种能力,可以 ...

 
>>> 386的GDTR寄存器选择48bit是因为386是一个32位寄存器和16位寄存器混合的处理器

    在 386 下,GDTR 是 48 bit,是因为需求,需要 32 位 base address 和 16 位 limit。是经过考虑才设计成这样的

  选择 16 位的 limit 是因为,通过 selector 只能找到 8192(13 位) 个 descriptors,

    8192 * 8 = 10000(64K)(0 ~ 8191)选择范围是 0 ~ FFFF (16 位 limit)



>>> 386 是 32 位寄存器和 16 位寄存器混合的处理器。

  头一次听这样说,386 就是 32 位处理器,怎么说成的 32 和 16 混合的处理器,使用 32 位还是 16位处理器,

  那是指令操作数大小上的选择。


      照你这样说:64 位的 x64 处理器,那是三者的混合体??
作者: xiehui888    时间: 2011-04-26 13:02
关于X86的保护模式困扰我快一年了,好不容易找到这么好的帖子,mik (AMD fusion) 说的很清晰了,在内存中的那些描述符 是(表示)假的内存即虚拟内存地址 , 而每个描述符的这个地址可以表示4GB的虚拟空间,基本上是虚拟地址------》逻辑地址----》线性地址-----》物理地址
作者: xiehui888    时间: 2011-04-26 13:03
打错了 每个描述符的limit里面表示的地址是4GB假的内存
作者: Cindinx    时间: 2011-05-04 16:17
书上说386的虚拟地址空间是64TB。但是我怀疑,虚拟内存真的能超过4GB吗?〔这里认为CPU地址线是32根,不考虑 ...
新警察 发表于 2009-09-08 00:43



    64TB指的是所有進程的4GB空間的總和




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2