实验完善代码 LAB2-4下载链接 提取码:79t8
1、80386保护模式和实模式
8086处理器是一款16位的处理器,这种处理器的数据总线是16位,而地址总线是20位,最大寻址范围位1MB的地址空间。
数据总线是用来传送数据信息,数据总线的位数决定了CPU单词通信能交换的数据量。
地址总线 是用于传送CPO发出的地址信息,地址总线的位数决定了CPU 的寻址范围。
控制总线 用来传送控制信号、时序信号和状态信息等。
80386 处理器是一款32位的处理器,这种处理器的数据总线和地址总线都是32 位,可以寻址4GB。
80386 开始CPU 演变出了两种工作模式:实模式和保护模式。
实模式: 实地址访问模式。16位的处理器,寄存器都是16位的,如何访问地址范围为1M。 采取分段寻址模式:20位地址 = 16位段基址 + 16位偏移(物理地址 = 段地址*16 + 偏移地址)。 这种模式下,段也是地址的一部分,程序员指定的地址就是物理地址。
保护模式: 这种模式下,内存段的访问受到限制,访问内存时不能直接从段寄存器中获取段的起始地址了,需要经过额外的转换和检查。
分段机制 是利用一个称作段选择子的偏移量到全局描述符表中找到需要的段描述符,找到的这个段描述符中存放的就是真正段的物理首地址,然后再加上偏移地址便得到了最后的物理地址。
可以这样理解保护模式下的寻址,首先有一个结构体类型(称为段描述符,Descriptor), 它有三个成员变量:段物理首地址、段界限、段属性,在 内存中存在一个数组(全局描述符表,GDT)维护一组这样的结构体。段选择子中存储的是对应的结构体在该数组中的下标,通过该索引从数组中找到对应的结构体,从而得到段的物理首地址,然后加上偏移量,等到真正的物理地址。
- 如何寻找全局描述符表呢?
80386 以及以后额度处理器专门设计了一个寄存器GDTR,用来存储全局描述符表在内存中存放的位置,当发生内存寻址与定位的时候,处理器通过该寄存器找到全局描述符表,并通过段选择子找到对应的描述符,进而得到该段的起始地址,并加上偏移地址得到最终的物理地址。
-
GDTR 寄存器是48位的,其中32位记录 段描述符表的物理地址,16位记录 描述符表的长度。
段描述符实际上是一个占据64位内存的结构体。 段描述符 包含了段的物理首地址、段的界限以及段的属性。在描述符中,段基址占32位,段限长占20位,属性占12位。
-
32位的保护模式下可以寻址4GB ,如果机器内存没有4GB怎么办?
-
中断管理的变化
(1)实模式下的中断管理
系统的中断管理机制都是通过一个叫做中断向量表的东西实现的。这个表就是一个存储一组向量的数组,其中每个向量就是一个数据结构,包含4个字节,前两个字节表示IP,后两个字节表示CS 的值,合在一起代表中断处理程序的第一条指令存放的物理地址: CS:IP。
(2)保护模式下的中断管理
保护模式下的中断向量表存放在IDTR寄存器中,因此中断向量表的实际物理地址由操作系统决定。保护模式下的中断可以分为两种:硬件中断和软件中断(异常)。
硬件中断是由外部事件所引起的,其产生与CPU当前执行的指令没有关系;软件中断是在CPU执行指令期间遇到非法指令所产生的,可以分为:故障,陷阱和中止。 -
重要寄存器以及模式的切换
x86体系中,寄存器CR0 是用来标志系统是处于实模式还是保护模式的,为0表示处于实模式;为1表示处于保护模式。
2、安全性问题
x86 平台的CPU 有0、1、2、3 四个特权级别,其中level0是最高的特权级,可以执行很多的特权操作,而level3 则是最低的特权级,很多特殊的操作都不能在这个级别下运行。当操作系统内核运行时,系统处于level0,即CS 寄存器的未两位为00;而用户程序运行时,系统处于level3 的, 即CS 寄存器的末两位位11。
本文参考文章 http://grid.hust.edu.cn/zyshao/OSEngineering.htm
推荐这位博主系列的文章