- 论坛徽章:
- 0
|
原帖由 rawa99999 于 2009-9-25 16:44 发表 ![]()
段描述符--80386下的段具有三个属性:段基址,段界限,段属
性,通常描述段的称作段描述符(Segment Descriptor)
段描述符表--存放段描述符(Segment Descriptor)的表 GDT IDT LDT
段选择子--用来查找段描述符表中的段描述符(Segment Descriptor)
段选择子的结构:
15___________________2bit__1bit_____0bit
INDEX(13bit) TI(1bit) RPL(2bit)
其中RPL(请求特权级--Requested Privilege Level)2位,
TI(TABLE INDICATOR)1位
INDEX(索引)13位
64T的解释:
在整个系统中全局段描述符表GDT和中断描述符表只有一张,局部段描述符
表LDT可以由若干张,每个段描述符表都形成一个特殊的16位数据段(段限
--段的大小),由于段选择子中索引(INDEX)的限制这样的GDT和LDT中都最
多最多可以有2^13=8192个段描述符。
LDT的描述符和IDT的描述符都存放在GDT中,注意GDT中还可以存放段描述符,
这三者长度都是64bit长,都存放在GDT中,所以更正一下GDT存放段描述符的
数量是8192-LDT表的数量-1(IDT表)的结果。这一点很重要。
为了好理解讨论一个极端情况只有一个LDT,并且这个任务需要64TB内存,系
统首先加载GDT(在物理内存的某个位置),然后生成LDT,分配虚拟内存,由于需求
很大所以分配了最大的段数8192个4G空间=32T,不够,又请求使用GDT分配段最大
段数8190(8192-1个LDT-1个IDT)个4G空间约为32T(1TB=1000GB所以少了8G忽
略不计)这样系统共分配了64TB的虚拟内存。
---------------------------------
这件事使我联想起两件事,我去龙芯论坛了。 ...
看一看,短短的一段话,错误之多,可服了你
>> 段描述符表--存放段描述符(Segment Descriptor)的表 GDT IDT LDT
(1)段描述符表 ----> 应使用“描述符表”一词,
(2)IDT 不能存放 segment descriptors
>> 段选择子--用来查找段描述符表中的段描述符(Segment Descriptor)
也能说错误,不严谨,应使用“选择子”一词
>> 每个段描述符表都形成一个特殊的16位数据段
描述混乱,limit 在 descriptor table register 的 limit 里
>> LDT的描述符和IDT的描述符都存放在GDT中
不存在 IDT 描述符,IDT 是从内存中获取
>> 所以更正一下GDT存放段描述符的数量是8192-LDT表的数量-1(IDT表)的结果
还更正一下
(1) GDT 可存放 segment descriptor 和 system descriptor(LDT/TSS)以及 call gate descriptor
(2) 哪来的 IDT 表 ??
(3) NULL selector 去哪了?
>> 并且这个任务需要64TB内存,系统首先加载GDT(在物理内存的某个位置),
(1) GDT 是放在 CPU 的线性地址空间,不是物理内存
>> 然后生成LDT,分配虚拟内存,由于需求很大所以分配了最大的段数8192个4G空间=32T
(1)LDT 从 GDT 处加载
(2)LDT 的加载和 32T 有什么关系 ???
>> 又请求使用GDT分配段最大
段数8190(8192-1个LDT-1个IDT)个4G空间约为32T(1TB=1000GB所以少了8G忽
略不计)这样系统共分配了64TB的虚拟内存。
(1)8190:犯前面所说错误
(2)1TB = 1024 GB
你怎么就老绕着 64T 想不开
1、告诉你吧,GDT 最多能容纳多少 segment descriptor(按你假设只有一个 LDT 的情形) ??
答案是: 8192 - 1(NULL selector) - 1(TSS selector)- 1(LDT selector)= 8189 个
2、假设全都用上 8189 个 segment descriptor,情况是怎样?
第1个 data segment descriptor 的 base 是 0,limit = 4G
第2个 data segment descriptor 的 base 是 0x40000000, limit = 3G(只能设为 3G)
第3个 data segment descriptor 的 base 是 0x80000000, limit = 2G(只能设为 2G)
第4个 data segment descriptor 的 base 是 0xC0000000, limit = 1G(只能设为 1G)
第5个 data segment descriptor 的 base 是 0x00000000, limit = 4G
第6个 code segment descriptor 的 base 是 0x00000000, limit = 4G
以此类推 ... ...
这些 segment descriptor 的空间绝大多数都是重叠在一起。全都在 4G 的线性空间之内
这些 segment 经过分段管理后,全部转为 4G 的线性地址的某一个地址。
你怎么就那么的想不开呢? |
|