保护模式

一、段描述符
在这里插入图片描述
1、段界限边界值=(描述符中段界限 + 1)*(段界限粒度大小)- 1
由于段界限从0开始,所以左边加个1,由于地址从0开始,所以最右边减个1。段界限是用来限制偏移地址的,若超出这个范围,CPU会抛出异常,

2、G位为0,表示段界限粒度为1字节,为1,表示段粒度大小为4KB。

3、type,共4位,当指定了S位后,type才有确切的意义,3 2 1 0位依次从左向右如下图X R C A
在这里插入图片描述
A位是Accessed位,由CPU设置,每当CPU访问过,便设置为1。
C表示一致性代码段
R表示可读,为1代表可读,为0代表不可读
X表示可执行,为1代表可执行,为0代表不可执行
E表示标识段的扩展方向,为0表示向上扩展,为1表示向下扩展
W表示是否可写,为1表示可写,为0表示不可写。

4、S位,为0代表系统段,为1代表数据段。代码、数据、栈都是硬件的输入,都是数据段,各种成为“门”的结构是系统段。

5、DPL,Descriptor Priviledge Level描述符特权级,从高到低分别是0、1、2、3,操作系统处于0,用户程序处于3。

6、P字段,Present,是否存在在内存中,如果位于内存中,为1,否则为0。

7、AVL: available,是否可用,对用户来说。

8、L字段:为1表示64位代码段,为0表示32位。

9、D/B:用来指示有效地址及操作数的大小。

二、全局描述符表GDT(Global Descriptor Table)
段描述符存放在GDT中,GDT本质是个段描述符类型的数组。GDT的起始地址由GDTR(GDT Register)指向,它48位。对gdtr的初始化只能使用lgdt指令。格式是lgdt48,前16位是GDT的大小减1,后32位是gdt的起始地址。由于16位表示65536,一个段描述符8字节=64B,所以gdt可容纳65536 / 16 = 2^13 = 8192个段描述符。
GDT第0个描述符不可用:防止因为选择子忘记初始化而选择到第0个段描述符。如果选择子未初始化,它的值是0。

三、选择子
段寄存器中保存的是选择子(selector),它索引到全局描述符表的对应段描述符。
由于段寄存器16位,所以选择子也是16位。
第0~1位存储RPL(请求特权级)。
第2位是TI(Table Indicator)位,用来指示选择子是在GDT中还是在LDT中,0表示在GDT中,1表示在LDT中。
第3~15位存储的是段描述符的索引。
在这里插入图片描述
四、LDT
Local Descriptor Table
加载指令:lldt 16,首地址存在gdtr中。
LDT第0个描述符可用:因为当在LDT中,意味着选择子的第2位为1,所以选择子一定经过了初始化,所以排除了忘记初始化的可能。

五、打开A20地址线
将端口0x92的第1位置为1。

in al, 0x92
or al, 00000010B
out 0x92, al

六、保护模式的开关,cr0寄存器的PE位。
PE(Potection Enable)
在这里插入图片描述

可以看出PE位位于第0位。所以,把cr0存的值与0x1或一下即可。

mov eax, cr0
or eax, 0x00000001
mov cr0, eax
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值