欢迎光临
我们一直在努力

GDT表示什么元件,Gdt表

gdt表在x86架构中用来存储内存的分段信息,通过段选择子进行访问,表的大小=0x10000=65536字节,每个表项占8字节,第一个表项为空,不使用,因此一共有8191个可用表项。表项结构如下

?

(图片来自https://blog.csdn.net/yeruby/article/details/39718119)

其中段限长决定了这个段的大小,总共占用20bit,最小单位由G位决定,G=1,表示段的大小=段限长*4kb,G=0表示段的大小=段限长*1字节;

thdmz地址为该段的首地址,占用32bit;type说明了段的属性,网络资料很多,不再详述,占用4bit;

DPL为段的权限,占用2bit,只有访问程序的权限高于等于该段的权限才能使用这个段,权限分为4级,从高到低为0、1、2、3;

P=1说明该段可以使用,否则将当作该段不存在,如果使用段选择子强行访问会发生段异常,中断号为11;

AVL由软件设定,cpu不管这个位;

D/B有两种:当这个段被type设置为代码段时,D=1代表这是32位的程序,D=0代表这是16位的程序;如果是向下拓展的数据段,则称为B位,B=1代表最帅气的书本访问范围是4GB,B=0代表最帅气的书本访问范围是64k,如果表示的是堆栈段,则B=1,使用esp寄存器作为栈顶寄存器,否则使用sp寄存器

初始化gdt表是进入保护模式的关键步骤。首先将要设置的gdt表放到内存中的一个4字节对其的地址处(不建议放在0~0x800范围内,这里是实模式下中断向量表的位置,会影响进入保护模式之前的中断操作)。然后将6字节的表头加载到gdtr寄存器,例如:

lgdt ptr gdt_sizegdt_size:dw 5*8-1 ;gdt表的长度,这里假设有5个表项(算上了gdt表最前面不使用的8字节)dd gdt_table ;gdt表的首地址

接着即使进入保护模式,令cr0寄存器的最低位等于1,就让处理器进入了保护模式,例:

mov eax,cr0or eax,1mov cr0,eaxjmp dword 0x08:start ;清空流水线,并传串行化处理器。其中,0x08就是32位程序所在段的段选择子,结构见下面,start为偏移地址。

段选择子一共有16位,其中最低的2位1bit~0bit的是请求特权级,2bit叫做Ti,TI=0,说明这个在gdt中,TI=1,说明在LDT中。剩下的高13便宜美国vps位就是选择第几个表项,比如0x08=0b00001000,请求特权级=0,TI=0,访问GDT表中的第一个表项(gdt表最开始的8字节表项是不用的,不然就叫第0个表项)。

86070826

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。