保护模式下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 |