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 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。
选择符的索引部分由13 个比特位表示,加上区分GDT 和LDT 的1 个比特位;
因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长 ...
:lol: 高人.
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 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
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 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
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位处理器,
那是指令操作数大小上的选择。
:em06:照你这样说:64 位的 x64 处理器,那是三者的混合体??
xiehui888
发表于 2011-04-26 13:02
关于X86的保护模式困扰我快一年了,好不容易找到这么好的帖子,mik (AMD fusion) 说的很清晰了,在内存中的那些描述符 是(表示)假的内存即虚拟内存地址 , 而每个描述符的这个地址可以表示4GB的虚拟空间,基本上是虚拟地址------》逻辑地址----》线性地址-----》物理地址