实验基础 02段描述符表与段选择子

1.段选择子

这个图就是讲解cpu如何去利用段寄存器,index GDT or LDT中的索引值,RPL:请求特权级,用于权限检查的  TI:决定查哪个表 LDT:1 GDT:0
内核实验02中我们得到了一些段寄存器的值

现进行拆分解析:
0x33
‭0000000000110 0 11‬
Index: 6 TI: 0 RPL:3
ring3层,GDT表的第5项
0x10
0000000000010 0 00
Index:2 TI:0 RPL:0
ring0层,GDT表的第2项
0x2b
0000000000101 0 11
Index:5 TI:0 RPL:3
ring3层,GDT表的第5项
0x53
0000000001010 0 11
Index:10 TI:0 RPL:3
ring3层,GDT表的第10项
2.段描述符

这里不做过多解释,windbg通过r gdtr找到gdt表,对上述遇到的GDT段直接进行讲解

技巧:
先看P位(决定段的有效性)如:0020fb00中的第四位: f>=8,P位为1,段在内存中存在,若P位为0,则段是不存在的 如 00000000中的0<8,段不存在
再看S位  (判断是属于什么段,系统段,数据段or代码段,本节尚未遇到系统段,以后进行讲解)
如果代码段或者数据段接着看Type位,然后查看下表 (进一步是属于确定数据段还是代码段)

至于基址和界限,在win7x64下,看了Intel白皮书,我也没完全吃透,先不做演示。

演示:
0x33
index: 0x6
0020fb00`00000000
P:1,段存在 S:1代码或者数据  Type:1011 Code Execute/Read,accessed   G:1 byte units  DPL:11 特权级3
由于是代码段,所以考虑查看L位
L:1 this code segment are executed in 64-bit mode.

0x10
index:0x2
00209b00`00000000
P:段存在  S:代码或者数据 Type:1011 Code Execute/Read,accessed  G:0 byte units DPL:00 特权级0
由于是代码段,所以考虑查看L位
L:1 this code segment are executed in 64-bit mode.

0x2b
index: 0x5
00cff300`0000ffff
P:1,段存在  S:1代码或者数据  Type:0011 Data Read/Write,accessed    G:1 4KB units  DPL:11 特权级3

0x53
index:0xA
ff40f3fe`00003c00
P:段存在  S:1代码或者数据 Type:0011 Data Read/Write,accessed  G:0 byte units DPL:11 特权级3

Ok 和XueTr工具查出来的一样,我估计他GDT数量也是根据gdtl的长度,遍历GDT的P位统计得出来的。

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称