保护模式下GDT或LDT的简介

2019-11-20 14:25:00
赵勤松
原创
1693
摘要:简单介绍保护模式下的段地址访问过程

保护模式下,新增加了两个段寄存器GDTR( 全局性的段描述表寄存器)与LDTR( 局部性的段描述表寄存器),分别指向内存中的一个段描述表起始地址,下面将以GDT为参考进行展开。

GDTR是一个48位的段寄存器,低16位为段描述表所占内存大小,高32位为内存地址,16位长度最大数值为65536,即64K大小,又因为一个描述项占8个字节,因此可索引的描述项一共为8192个。

接下来我们看一下段描述项的定义:

B31-B24,B23-B16,B15-B0三部分组成32位内存基地址。 

L19-L16,L15-L0二部分组成20位内存大小。

G为表段的长度单位,0表示字节,1表示4KB。

D为地址类型,0为16位地址,1为32位地址,在PUSH和POP指令中,0为使用SP,1为使用ESP。

A为软件可使用位。

P为存在位,为0时表示不在内存中,此时CPU会产生一个中断,触发缓存加载操作,为1时表示内存有效。

DPL为特权位,访问本段需要的权限,从00-11,段寄存器RPL小于等于DPL时可访问。

S为描述项类型,0为系统段,如段描述表等,1为代码段或数据段。

Type为段的类型,与上面的S标志位一起使用。

0位主要用于标识段描述项是否被载入,该描述项被加载到GDTR时,会将此位设为1。

3位为0时,2位为0表示一般的数据段,为1表示堆栈;3位为1时,2位为0表示只能被同级代码段访问,为1表示可从低特权跳转过来执行。

如此奇怪的描述项结构,其实是因为Intel一开始是想使用24位地址,后来才省悟到要用32位地址,但当时286(24位地址总线)已经发售了(描述项也使用4个字节,31-24位做为保留),只能通过这种打补丁的方式来完成32位地址的扩充,明白了这点,能更好地理解描述项的结构。


相应的,各个段寄存器的定义如下:

Index为段描述表的索引值,占13个位,因此可以访问8192个段描述项,这与段寄存器的设定是完全符合的。

TI为段寄存器类别,0为使用GDTR,1为使用LDTR。

RPL为特权级别,00为最高级,11为最低级。


文章分类
联系我们
联系人: powereye
Email: zqs@someapp.cn
QQ: 1134846
微信: powereye