保护模式 段描述符 页

保护模式
段寄存器(96位)
ES CS SS DS FS GS LDTR TR
cs 为代码段寄存器,一般用于存放代码;
通常和IP 使用用于处理下一条执行的代码
cs:IP
基地址:偏移地址
cs地址对应的数据 相当于c语言中的代码语句
ds 为数据段寄存器,一般用于存放数据;
ds地址对应的数据 相当于c语言中的全局变量
ss 栈段寄存器,一般作为栈使用 和sp搭档;
ss地址对应的数据 相当于c语言中的局部变量
ss相当于堆栈段的首地址 sp相当于堆栈段的偏移地址
es 为扩展段寄存器;
在96位中,只有16位是可见的(Selecter)
struct SetVent
{
WORD Selector; //16位
WORD Attributes; //16位
DWORD Base; //32位Base
DWORD Limit; //32位Limit
}
段寄存器成员简介
在这里插入图片描述

GDT(全局描述符表) LDT(局部描述符表)
当执行类似MOV DS,AX指令时,由AX决定查哪张表,在什么位置,查多少数据;
段描述符
在这里插入图片描述

P位:1 段描述符有效 0 段描述符无效
Attributes:高四个字节,8位到23位
Base:由3部分组成,详情看上图;
Limit:由俩部分组成,见上图;但是还会受G位影响,G位0,Limit单位为字节,位000FFFFF; G位是1时,单位为4kb(1kb=1024,以0开始,要减1,换成16进制位FFF)FFFFFFFF
S位:1 代码段或者数据段描述符;0 系统段描述符;

S=0时的TYPE域
在这里插入图片描述

S=1时的TYPE域
在这里插入图片描述

(数据段A:是否被访问,W是否可写,E为拓展为,1为向下拓展,反之向上拓展,C为一致位,分为一致代码段和非一致代码段)
分别为向上拓展和向下拓展,红色部分为有效位
在这里插入图片描述

结合段描述符表可知,第一位的第5个字位9或者f就是代码段或数据段
在这里插入图片描述

要想确定是代码段还是数据段,看TYPR的第11位,为0是数据段,1为代码段;如果第六个16进制数大于8,就一定是一个代码段,反之位数据段;

DB位
对3个段有影响
在这里插入图片描述

段选择子
在这里插入图片描述

RPL:请求特权级别
Index:处理器将索引值乘以8在加上GDT或者LDT的基地址,就是要加载的GDT表的位置;
例:001B=0000 0000 0001 1011;前俩位11表示RPL;0表示查GDT表,剩下的位为3,
在这里插入图片描述

所以往后数4位就是查的位置(从0开始);

加载段描述符到段寄存器
除了mov,还有LES,LSS,LDS,LFS,LGS修改
(cs位代码段,cs修改会导致EIP变化,想要修改cs就要修改EIP)
代码间跳转
俩种情况:要跳转的段是一致代码段还是非一致代码段
同时修改CS和EIP的指令有:JMP FAR/CALL FAR/RETF/INT/IRETED
(只改变EIP的指令:JMP/CALL/JCC/RET)
四种情况下可跳转:代码段,调用门,TSS任务段,任务门;
权限检查:
非一致代码段:CPL==DPL && RPL <= DPL;
一致代码段:CPL>=DPL(希望应用层直接访问就用一致代码段)
总结:
一致代码段(共享的段):特权级高的程序不允许访问特权级低的程序,但是特权级低的程序允许访问代码段高的程序
非一致代码段:只允许同级访问,绝对禁止不同级别访问;
短调用
指令格式:CALL 立即数/寄存器/内存
发生改变的寄存器:ESP EIP
长调用
跨段不提权
指令格式:CALL CS:EIP
发生改变的寄存器:EIP ESP CS
跨段并提权:
指令格式:CALL CS: EIP
发生改变的寄存器:ESP EIP CS SS
在这里插入图片描述

总结:跨段调用时,一旦有权限切换,就会切换堆栈;
CS的权限一旦改变,SS的权限也要发生改变,CS和SS的等级要保持一致;
JMP FAR只能跳转到同级非一致代码段,但CALL FAR可以通过调用门提权,提升CPL权限;

调用门
指令格式:CALL CS:EIP
执行步骤:1,根据CS的值查GDT表,找到段描述符,这个描述符是一个调用门;
2,在描述符中存储另一个代码段的选择子;
3,选择子指向的段 段.Base+偏移地址 就是真正要执行的地址。
门描述符
在这里插入图片描述

(Segment Selector指向段的Base+俩个Offset in Segment的偏移;DPL的值除了00,就是11)
构造一个调用门(无参数)
0000EC00 00080000,黄标位写入内容的地址,用vs看
有参数:0000EC00 00080003(参数需要自己PUSH)
中断门
IDT:中断描述符表;每个描述符表占8个字节,但是IDT表的第一个元素不是NULL;
中断门不允许传参数
在这里插入图片描述

陷阱门和中断门几乎是一样的,只有描述符结构体的8位到11位是1111,而中端门是1110
中断门执行四,将IF位清零,但是陷阱门不会;(IF影响可屏蔽中断)
任务门
在这里插入图片描述

任务门执行过程:
INT N查IDT表,找到中断门描述符在查GDT表,找到任务段描述符使用TSS的值修改寄存器RETD返回;
TSS:
是一快内存,大小104字节,有各种寄存器和段寄存器;当CPU向使用TSS的值时,通过TR寄存器找到TSS;TSS描述符只能通过任务寄存器TR在GDT中解锁,即只有TR可作为TSS的段选择器;
确定位置:
CPU可以通过 gdtr 寄存器来知道 GDT表在哪里,通过 idtr 寄存器知道 IDT 表在哪里。实际上,CPU是通过 tr 寄存器来确定 TSS 的位置的。
TSS描述符
在这里插入图片描述

当S=0, TYPE=1001或者TYPE=1011的时候,表示这是一个TSS段描述符。当TSS段没被加载进 tr 寄存器时,TYPE=1001,一旦TSS被加载进 tr 寄存器,TYPE就变成了1011.
TSS作用
保存0环、1环和2环的栈段选择子和栈顶指针
一次性切换一堆寄存器
把当前所有寄存器(TSS结构中有的那些寄存器)的值填写到当前 tr 段寄存器指向的 TSS 中
把新的 TSS 段选择子指向的段描述符加载到 tr 段寄存器中
把新的 TSS 段中的值覆盖到当前所有寄存器(TSS结构中有的那些寄存器)中

页的机制
10-10-12分页
1,物理内存
如下指令:MOV eax,dword ptr ds:[0x123456]
其中,0x12345678是有效地址;ds,Base+0x123456是线性地址
2.设置分页方式(10-10-12)
例:000AA8A0
0000 0000 0000 0101 0101 8A0
0000 0000 00 (0)
0001 0101 01 (AA)
8A0

将虚拟机boot.ini文件的第一个系统选项noexecute改成execute,然后重启;
3.找物理地址
每个进程都有一个CR3,这是唯一一个储存物理地址的寄存器,一共4096个字节;
物理内存查看指令:第一级:!dd CR3+0(第一级的CR3通过!process 0 0查看;第二级:!dd CR3+AA4;第三级:!dd CR3+8A4;
(注:除了第一级,每级开始前的CR3都要去掉后三位的属性位置才是正确的位置)
4.PDE和PTE
在这里插入图片描述

PTE特征:PTE可以没有物理页,PTE可以指向同一个物理页,但是,一个PTE不能有多个物理页;
0地址之所以不能读写,是因为没有物理页,挂个有效物理页就能够读写了,那么,什么情况下是有效物理页呢?
5.物理页的属性
物理页的属性=PDE属性&PTE的属性
在这里插入图片描述

如果P位&后的结果为零,那么这个物理页就是无效物理页
(char* str=”hello word”,不能通过指针修改的原因是页的性质,属性是只读的;办法:在PDE和PTE里修改R/W位)
U/S位:0 特权用户 1 普通用户
P/S位:支队PDE有意义,当PS=1时,PDE直接指向物理页,没有PTE;
A位:是否被访问过,是就置一;
D位:是否被写过,写过置1;
拆分C0300000(页目录基址)
结论:C0300000就是PDE的基址,,如果想访问第N个PDE,就会有C0300000+N4
C0300000指向PDE表,但是他本身也是一张PTT表,也是一张物理页;
有了这张表,就可以修改任何页目录表;但如果要设置某个线性地址的PDE和PTE,还需要能够访问PTT表,如何访问呢?
C0000000根据101012分页后,得到的物理页就是第一个PTT表
C0001000根据101012分页后,得到的物理页就是第二个PTT表
访问PTE的公式:0xc0300000+PDI
4
访问PTT的公式:0xc0000000+PDI4096+PTI4
2-9-9-12分页
来历:由于4GB的物理地址范围无法满足要求,提出29912分页,又称PAE(物理地址扩展)分页;
只要确定了是4KB,就确定了12,PTT和PDE都是512位,需要9位又可以索引到;2就是拓展之后的;

开启PAE
在这里插入图片描述

原来的物理地址指向的地址发生改变,指向了PDPTE(Page Directory Point Table Entry)表,页目录指针表项,每项占8个字节;
在这里插入图片描述

结构:
在这里插入图片描述

35—12存储的是页目录表的基址,低12位补0。共36位,即页目录基址;
PDE结构
在这里插入图片描述

PS位是第7位;
PTE结构
在这里插入图片描述

XD标志位(AMD称为NX,即No Excetion) 为了防止溢出漏洞,Intel做了硬件保护,就是这个不可执行位,XD=1时,软件溢出了也没关系,是不可执行的;