1、段描述符
*p = 1 段描述符有效,p = 0 段描述符无效,(高4位也就是第二个字节的最高位>=0x8)
2、段描述符与段寄存器的关系
struct SegMent
{
WORD Selector; // 段选择子 16位 可见
WORD Attributes; // 段属性 16位 不可见 只有少数几个属性位是有效的
DWORD Base // 段起始地址 32位 不可见 仅对于FS和GS有效
DWORD Limit // 段大小 32位 不可见 仅对于FS和GS有效
}
*DWORD Base = Base 32:24 + Base 23:16 + Base 15:0
*DWORD Limit = Limit19:16 + Limit15:0
也就是Limit 19:16 + Segment 15:0 = 20现在才20位 DWORD Limit 一共是32位,剩下12位从哪里来这就引出了我们今天要提的另外一个属性,G位如果G位为0在前面补12个0,如果G位为1在后面补12个1
00 cf 93 00`00 00 ff ff高32字节=0000 0000 1100 1111 1001 0011 0000 0000
G位为1,后面补12个1(G位置 = 高四个字节中第三个字节的最高位)
所以可以看到Limit的值大小是由G位决定的
*GDT描述符分为两大类,分别是“系统段描述符” “数据或代码段的描述符”
**s = 1 代码段或者数据段描述符,s = 0 系统段描述符
s位也就是高4字节中第二个字节的第12位
0x12345678 中的5
3、Type域
*也就是高四字节中的第二个字节的低4位
第11位为0:段描述符为数据段描述符
第11位为1:段描述符为代码段描述符
A位:若该代码段/数据段未被访问过,则值为0,否则为1
W位:若为1,表示该段可写
E位:若为0,则向上拓展,若为1,则向下拓展