前言
先前了解了段寄存器,现在继续深入学习段寄存器
段描述符
引出问题
首先要解决的就是上个笔记遗留下来的问题:
mov bx,ds //将段寄存器ds的Selector部分保存到bx(ecx的低16位)
mov ax,cs //将段寄存器cs的Selector部分保存到ax(eax的低16位)
mov ds,ax //将先前读出来的段寄存器去写ds这个段寄存器,也就是用cs段寄存器覆盖ds段寄存器
写寄存器是对整个96位的段寄存器进行修改,但是这里只给出了16位的段选择子Selector,剩下的80位呢
在回答问题之前,还需要了解两个结构:GDT(全局描述符表)和 LDT(局部描述符表)
为什么要了解这两张表?
因为当执行类似前面对段寄存器进行修改的指令:MOV DS,AX时,CPU会先查表,根据AX的值(段选择子)来决定查找GDT还是LDT
但在Windows中LDT并没有被使用,于是AX的值(段选择子)是用来决定查询表中的哪个位置
GDT
什么是GDT
GDT全称:Global Descriptor Table,为全局描述符表,表中存储的数据项为段描述符
GDT的数量
一个处理器对应一个GDT
定位GDT
大致了解了GDT是一张表,接下来则要定位到这张表,查看其内容
想要定位GDT表的位置,可以通过gdtr寄存器来定位
gdtr寄存器存储了GDT表的起始位置和GDT表的大小
通过windbg定位GDT
通过在windbg中输入下列指令查看有关GDT的信息: