保护模式(段寄存器介绍1)
保护模式简介
CPU分为实模式、保护模式、虚拟8086模式,大多数操作系统运行在保护模式下。
- 保护模式具有两个特点:段、页、保护模式真正保护的是数据结构、寄存器、指令。
- 实模式:16位汇编,访问的都是物理地址,非常危险。
- 保护模式:保护的是对内存的访问,相对实模式安全。段层保护,页层面保护。
保护模式有:段的机制和页的机制参考书<intel白皮书第三卷>
什么是段寄存器?有哪些?(段的机制)
段寄存器共有8个:ES CS SS DS FS GS LDTR TR 共8个 OD可见6个,但GS段寄存器windows并没有使用(32位下)
如果运行在实模式下,则只有前四个有用。
如果是64位,则使用GS而不是FS。
当我们用汇编读写某一个地址时,比如:mov dword ptr ds:[0x123456],eax
其实我们真正读写的地址是:ds.base+0x123456
当执行一条指令时,真正执行的是cs.base+EIP处的指令。
当去访问堆栈时。真正访问的是ss.base+Addr地址
段寄存器结构:共96位,16位可见,80位不可见,可见部分位Selector成员(选择子)

段寄存器的结构

段寄存器属性的探测:

我们已经读取到es得可见部分16位:

将ax值写入一个段寄存器 注意我们写一个段寄存器写的是96位以后会论证的


读段寄存器:mov ax,es 只能读16位(可见部分)
写段寄存器:mov ds,ax 写了96位的。
段寄存器可以用mov指令读写,但是LDTR和TR除外。
ES:002B
002B 换成二进制 0000 0000 0010 1011 后三位是有含义的其中后面两位是代表RPL
一共有两张表LDTR GDT LDT不能单独的存在只能嵌套在GDT中 LDT有多张
段描述符的位置 = gdt首地址 +4 * 8
r gdtr 用来查看gdtr的地址
保护模式特权级别DPL,RPL,CPL之间的联系和区别
CPL:是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位
RPL:说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子都有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RPL可以不同。RPL可能削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。
DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。
当进程访问一个段时,需要进程特权级检查,一般要求DPL>=max{CPL,RPL}
总结及思考:
段寄存器只能看见16位,如何证明有96位呢?
写段寄存时,只给了16位,剩下的80位填什么

浙公网安备 33010602011771号