1.80386 支持几种运行模式,分别是什么?

  • 实模式:CPU在加电后会短暂的处于实模式,用于初始化保护实模式的 关键数据结构,访问的是物理地址;
  • 保护模式:一种安全且稳定的工作模式,通过分段与分页的机制实现了权限隔离(内核与用户层、进程间);
  • 虚拟8086模式:过渡模式

2.在实模式环境下,内存是如何寻址的(例如 mov ax,ds:[0x15])?

  • 分段:段内偏移16位 64KB
  • 范围:地址范围20位 20-16=4位 (16种状态) 16*64=1024KB=1M
  • 解析:ds*0x10+0x15

3.保护模式下段寄存器在切换的时候,处理器做了什么?

  1. 将段选择子拆分(index:13bit TI:1bit RPL:2bit)三部分
  2. 根据TI的指示到指定的表(GDT\LDT)中以index为下标去寻找一个64bit的数据;
  3. 将找到的数据存储至此段寄存器对应的高速缓存行中(进行类型检查、权限检查)
  4. 类型检查,通过则进行下一步,否则报异常
    • CS必须是代码段
    • DS必须是数据段(可读可写)
    • SS必须是可读可写的数据段,也可以是代码段
  5. 权限检查()

4.在x86保护模式下,高速缓存部分有80位,段描述符有64位,怎么填充的?

  • 段描述符64bit
  • 地址 32bit 属性16bit 大小 20bit(通过设置G扩展为32bit)
  • 段选择子 16bit

5.为什么存在高速缓存部分?

  • 效率:不用每次使用都去内存读取,内存的速度一般低于cpu的处理速度
  • 方便:提前将描述符存储在指定为自豪,一次加载,一直使用,直至下次切换

6.什么是GDT 、IDT,分别保存了什么东西?

  • GDT:是一个64bit数组,里面保存着段描述符、TSS描述符、调用门
  • IDT:是一个64bit数组,里面保存着中断门、陷阱门、任务门

7.保护模式下和特权相关的名词有几个?

  • CPL:CS段选择子后两位,当前特权级别
  • RPL:段选择子的后两位,请求特权级别,要进行段切换的时候涉及
  • DPL:段描述符中某两位,描述特权级别

  • DPL:描述符特权(Descriptor Privilege Level)

    • 存储在描述符中的权限位,用于描述代码的所属的特权等级,也就是代码本身真正的特权级。一个程序可以使用多个段(Data,Code,Stack)也可以只用一个code段等。正常的情况下,当程序的环境建立好后,段描述符都不需要改变——当然DPL也不需要改变,因此每个段的DPL值是固定。
  • RPL:请求特权级RPL(Request Privilege Level)
    • RPL保存在选择子的最低两位。 RPL说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。RPL的值由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL<CPL时,实际起作用的就是CPL了,因为访问时的特权检查是判断:EPL=max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次访问时的附加限制,RPL=0时附加限制最小,RPL=3时附加限制最大。所以你不要想通过来随便设置一个rpl来访问一个比cpl更内层的段。
  • CPL:当前任务特权(Current Privilege Level)
    • 表示当前正在执行的代码所处的特权级。CPL保存在CS中的最低两位,是针对CS而言的。当选择子成功装入CS寄存器后,相应的选择子中的RPL就变成了CPL。因为它的位置变了,已经被装入到CS寄存器中了,所表达的意思也发生了变——原来的要求等级已经得到了满足,就是当前自己的等级。

8.分段机制,对我们的意义是什么?

  • 安全:成功的将数据访问与代码划分为4个级别(目前只使用了2个:ring0 ring3)
  • 方便:若换了段寄存器对于地址索引的作用,开启了平坦内存的时代
  • 问题:内存属性、PE文件分为代码段、数据段等额外的困扰