一、保护性检验有一下几类:
1 限长的检验
2 类型检验
3 特权级检验
4 可寻址范围的限制
5 例程入口点的限制
6 指令集的限制
二、启动/禁用段和页的保护
CR0寄存器的PE标志位,将处理器切换到保护模式,一旦进入保护模式则没办法重新打开或者关闭。
CR0的PG标志位置位,开启页级的保护,一旦启动就无法关闭。可以通过如下操作可以禁用页级的保护:
1、CR0寄存器的WP标志清零
2、 将每个页目录项和页表项的读写标志和普通用户/超级用户(U/S)标志置位。
三、段描描述符的标志位
1、 描述符(S)标志:(第二个双字的bit12位)为1说明是代码段或者数据段描述符,为0则为系统段。
2、类型域:(第二双字节的bit8-bit11位)确定代码段,数据段或者系统段的类型。
3、限长域:(limit19:16和segment limit15:00和G和E)来确定该段的长度。
4、描述符特权级(DPL):(bit13,bit14)确定该段的特权级。
5、请求特权级(RPL):(段选择符的bit0和bit1位)确定一个段选择符的请求特权级别。
6、当前特权级别(CPL):(CS段寄存器的bit0和bit1)指明当前运行的进程的特权级。
7、普通用户/超级用户(U/S)标志:(页目录项和页表项的bit2)确定该页的类型。
8、读写(R/W)标志:(页目录项和页表项的bit1)确定访问该页的类型:只读还是可读可写。
四、gdt和ldt
如果手头上有虚拟地址xxxx:yyyyyyyy
首先从GDTR中取出GDT的基址BA找到GDT
xxxx一共16位,根据倒数第三位即T1位判断
如果T1=0,xxxx的前13位表示的是GDT的位置索引,根据索引得到一个描述符
该描述符含有段的基址与其他各种信息,段的起始地址+yyyyyyyyy就得到线程地址
如果T1=1,那么从LDTR得到LDT的位置索引,在GDT里面找到LDT描述符,LDT描述符里面包含LDT的线性地址
找到LDT,取出xxxx的前13位,在LDT中找到段描述符,该段描述符里面包含段的基址等信息.
而后段的基址加上yyyyyyyy得到线性地址