汇编学习7

保护模式

前言

实模式下,用户程序对内存的访问十分的自由,没有任何限制,随随便便就可以修改任何一个内存单元。这样往往会导致很多安全问题,毕竟在多用户多程序的时代,内存中会有多个用户程序同时运行,为了使他们互不干扰,各自在自己的内存空间 ‘活动’ ,保护模式是十分重要的。

全局描述符表

在保护模式下,在对每个段进行访问之前,必须先进行登记。登记的信息包括段的起始地址,段的界限和各种访问属性。

和一个段有关的信息,需要8个字节来描述,称为段描述符,每个段都需要一个描述符。为了存放这些描述符,需要在内存中开辟出一段空间,在这段空间里,所有的描述符都是挨在一起的,集中存放的,这就构成了一个描述符表。

最主要的描述符表示全局描述符表(GDT),所谓全局,意味着是该表是为整个软硬件系统服务的。在进入保护模式前,必须要定义全局描述符表。

为了跟踪全局描述符表(我这里理解的跟踪是记录表具体位置的意思),处理器内部有一个48位的寄存器,称为全局描述符表寄存器(GDTR),分为两个部分,分别是32位的线性地址和16位的边界。
GDTR(全局描述符表寄存器)的32位线性基地址部分保存的是 全局描述符表在内存中的起始地址,16位边界部分保存的是界限(其在数值上等于表的大小,总字节数-1)换句话说,全局描述符表的界限值就是表内最后一个字节的偏移量,第一个字节的偏移量是0,最后一个字节的偏移量是表的大小减去1。

因为GDT的界限是16位,可以表示2的16次方(65536字节),一个描述符占8位,那么最多可以定义8192个描述符。

因为实模式和保护模式,访问内存方式的不同,必须要在进入保护模式之前定义 GDT,而且实模式下最多只能访问1MB的内存,故GDT通常定义在1MB一下的内存区域。进入保护模式之后,可以重新定义GDT

存储器的段描述符

每个描述符在GDT中占8个字节,也就是2个双字,64位。如图所示:
在这里插入图片描述
20位的段界限用来限制段的扩展范围。
G位是粒度位,当G位是0的时候,段界限以字节为单位,如果是1,以4KB为单位。
S位用于指定描述符的类型,位是0的时候,表示是系统段,位为1的时候,表示是代码段或者数据段
DPL表示描述符的特权级,0表示最高级别,3表示最低级别。
P是段存在位,P用于指示描述符所对应的段是否存在,一般来说,描述符所指示的段都位于内存中。
D/B位是 默认操作数的大小 或者默认的栈指针的大小
L位是64位代码段标志
TYPE字段共4位,用于指示描述符的子类型,或者说类别。
AVL是软件可以使用的位

安装存储器的段描述符并加载GDTR

具体参见代码部分

保护模式下的内存访问

控制实模式和保护模式之间切换的开关原是一个叫CR0的寄存器
CR0是32位寄存器,包含了一系列用于控制处理器操作模式和运行状态的标志位,它的第一位是PE位,置于1,则表示进入保护模式。
保护模式下,BIOS中断不能再用。
在实模式下,内存的访问方式是 将段寄存器的内容左移4位,然后再加上偏移地址,以形成20位的物理地址。
32位的段寄存器,分为段选择子和描述符高速缓存器 两个部分:
在这里插入图片描述
在保护模式下,尽管访问内存也需要指定一个段,但传送到段选择器的内容不是逻辑段地址,而是段描述符在描述符表中的索引号
如图:
在这里插入图片描述
段选择器(段选择子) 根据描述符索引找到描述符(通过把索引乘8,因为一个描述符占8个字节,然后加上GDTR提供的线性基地址就可以找到描述符),然后把描述符的内容加载到不可见的描述符高速缓存部分。

加载的部分包括线性基地址、段界限和段的访问属性。此后,每当有访问内存的指令的时候,不会在访问描述符,而是直接用当前段寄存器描述符高速缓存器提供线性基地址。不单单是访问数据段,即使处理器取指令执行的时候,也采用了相同的方法。

清空流水线并串行化处理器

即使在实模式下,段寄存器的描述符高速缓存器 也可以被用于访问内存,但仅仅低20位有效,高12位全是0
在进入保护模式前,必须清空流水线。 一般可以用 jmp指令或者call指令,一旦使用这个指令,可以清空流水线,且会重新加载CS,刷新描述符高速缓存器的内容
操作数默认的大小,是由描述符高速缓存器的D位决定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值