第4章 保护模式入门

为什么要有保护模式?

实模式下的不足

  • 实模式下操作系统与用户程序处于同一特权级,平起平坐,没有区别对待
  • 用户所引用的地址都是指向真实的物理地址,也就是说逻辑地址等于物理地址
  • 用户程序可以自由的修改段基址,这几乎可以访问所有的内存
  • 访问超过64K的地址就需要切换段基址,容易蒙蔽
  • 一次只能运行一个程序
  • 共20条地址线,最大可用内存为1MB,这在之前就不可以用了

保护模式

保护模式之寄存器扩展

除了段寄存器之外,通用寄存器,指令指针寄存器,标志寄存器都由原来的16位扩展为32位寄存器。经过extend后的寄存器,前面都加e,寻址范围达到4GB


  • 保护模式增加了一个描述符表,表中至少有一个表项称为段描述符,其大小为64字节用来描述各个内存段的起始地址,大小,权限等信息。段寄存器中保存的不在时段基址,而是称为“选择子”的内容,selector,用这个数来索引全局描述表中的段描述符,把全局描述符表当成数组,选择子就像数组下标一样。
  • 为了提供获取段信息的效率,对段寄存器率先应用了缓存技术,将段信息缓存用一个寄存器来缓存,这就是段描述符缓冲寄存器(Descriptor Cache Register
    三种段描述缓存寄存器结构:

80286:拥有了保护模式,地址总线由20位扩宽到了24位,即寻址空间为2的24次方,16MB。但是80286的通用寄存器还是16位,即单独的寄存器寻址还是64KB,要想防伪全部的空间,还是需要不停的切换段基址
80386: 提升地址中线与寄存器都为32位,段基址是32位,单独的一个寄存器也是32位,任意一个段都可以访问4GB的空间

综上所述,CPU有三种模式:实模式、虚拟8086模式,保护模式

保护模式之运行模式反转

bits的指令格式是[bits16]或[bits32]
bits[16]:声明下面的指令编译为16位的机器码
bits[32]:声明下面的指令编译为32位的机器码


操作数反转指令0x66
如果当前的模式是16位实模式,操作数大小是32位
如果当前的模式是32位保护模式,操作数大小变为16位

寻址方式反转前缀0x67

保护模式之指令扩展

mul无符号数相乘指令扩展:

  • 若乘数是8位,则把寄存器al当作另一个乘数,结果是16位,存入ax中
  • 若乘数是16位,则把ax当作另一个乘数,结果是32位,存入dx:ax中,其中dx是结果的高16位,ax是结果的低16位
  • 若乘数是32位,则把eax当作另一个乘数,结果是64位,存入edx:eax,edx为高32位,eax为低32位
    imul同上

div无符号数除法指令:

  • 如果除数是8位,被除数就是16位,位于寄存器ax,商在寄存器al,余数在寄存器ah。
  • 如果除数是16位,被除数就是32位,高16位在dx,低16位在ax,商在ax,余数在dx。
  • 如果除数是32位,被除数是64位,高32位在edx,低32位在eax,商在寄存器eax,余数在edx。

全局描述符表GDT

段描述符

全局描述符表GDT、局部描述符表LDT及选择子

  • 一个段描述符只能用来定义一个内存段。代码段要占用一个段描述符,数据段与栈段也要各自占用一个描述符,这些描述符就放在全局描述符表GDT中
  • GDT位于内存中,拥有独立的寄存器,拥有专门的寄存器GDTR,专门用来存储GDT的内存地址与大小。GDTR是48位寄存器
  • 段寄存器CS、DS、ES、FS、GS、SS,在实模式下,段中存储的是段基址,即内存段的起始地址;而在保护模式下,在段寄存器中存入选择子的东西

打开A20地址线

in al, 0x92
or al, 0000_0010B
out 0x92, al

地址回绕:实模式下的内存访问采取“段基址:段内偏移地址”,由于实模式下是20位地址先,最大寻址空间是1MB,即0x00000~0xFFFFF。CPU采用了地址回绕的方式,对于超过1MB多的部分会自动回绕到0地址,继续由)地址开始映射。超过1MB多余出来的内存被成为高端内存区HMA

保护模式的开关,CR0寄存器的PE位

PE:Protection Enable,用于控制是否启用保护模式,是保护模式的开关

mov eax, cr0
or eax, 0x00000001
mov cr0, eax

处理器微架构简介

流水线作业
计算机系统设计者的基本任务是提高处理机指令的执行速度,而采取的主要措施是指令级的并行性,即让多条指令同时参与解释的过程。
将一个指令的执行过程分为多个阶段,一般把一条指令的解释过程分为3个(取指、分析和执行)或5个(取指、译码、执行、访存和写回)阶段。然后执行过程如下图:


乱序执行
乱序执行是指在CPU中运行的指令不按照代码中的顺序执行,而是按照一定的策略将打乱顺序执行,也许后面的指令会先执行。
缓存

  • cpu中有一级缓存L1,二级缓存L2,三级缓存L3等,他们都是SRAM,即静态存取寄存器。
    缓存的局限性:程序的90%的时间都运行在程序中的10%代码上。分为两个方面:
  1. 最近访问过的指令与数据,在将来的一段的时间内依然经常被访问。
  2. 靠近当前访问内存空间的内存地址,在将来的一段时间也会被访问。

分支预测
流水线是提高CPU效率的方式,但流水线最大的问题是程序的分支结构,如何把握分支的方向,才能是流水线高效率。

  • 2位预测法:最简单的预测法。使用2bit的计数器来记录跳转状态,每跳转一次就加一,直到加到最大值3就不再加了,如果未跳转就减一,直到减到0就不在减了。当遇到跳转指令,如果计数器的值大于1则跳转,如果小于等于1则不跳转。
使用远跳转指令清空流水线,更新段描述符缓冲寄存器

你可能感兴趣的:(第4章 保护模式入门)