【理解OS】1.保护模式概述
这个系列文章主要目的是为了记录我个人学习保护模式后的总结与一点点的思考。我也是一个学习者,其中由错误在所难免,若各位朋友指出将不胜感激。
1. Intel CPU的运行模式概述
这里我将粗略介绍Intel IA-32 CPU和其64扩展所提供的运行模式,及各运行模式的特点。
Intel IA-32架构一共提供了四种运行模式、分别是保护模式(protected mode)、实地址模式(实模式,Real-address mode)、系统管理模式(SMM)、虚拟8086模式(Virtual-8086 mode)。
其中保护模式是几乎所有运行在现代x86 CPU上操作系统使用的模式,具备x86 CPU所有的架构特性、最佳的性能、所有的指令支持、最佳的向后兼容性,也是现代x86 CPU的原生运行模式。x86 CPU通常对所有操作系统都推荐使用该模式。
实地址模式在现代计算机中的职责通常是负责计算机开启启动时计算机操作系统运行环境的准备。开机启动时CPU 首先进入实模式 读取BIOS进行基本的硬件自检查、硬盘扇区引导、操作系统选择和加载等等,待操作系统加载至内存接管CPU等硬件资源时,CPU将根据操作系统期望的运行模式进行切换,通常会切换至保护模式。
虚拟8086模式是一种开启保护模式后,为向后兼容8086程序所提供的一种准模式。注意虚拟8086模式与保护模式的关系通常是寄生关系,一般而言开启保护模式才能在保护模式中运行虚拟8086模式,但进入SMM时情况将会有所不同。
当操作系统运行时,CPU接受操作系统的调度,但若这个过程中CPU自身出现缺陷和不可修复的错误怎么办?X86 CPU提供了一种最高权限模式,系统管理模式。当CPU接收到SMM中断时,将会切换至SMM,并且在BOIS中寻找可能修正CPU错误的方法,随后再切换至合适的运算模式(可以切换至任何运行模式)。
以上是X86 IA-32架构阐述,但现代CPU和操心系统基本都运行在64位环境下,6并且4位已经成为主流,因此下面将介绍一个X86为应对64位机时代对64位做的拓展所新增的一个运行模式,IA-32e Mode(IA-32 extra mode),现代64位操作系统基本运行在该模式。该模式提供了2种子模式,兼容模式和64位模式。兼容模式提供对保护模式几乎所有特性的接纳,而64位模式则将保护模式的线性地址扩展至64位,提供了超过64GB的内存寻址空间,由此可见IA-32e模式基本可以看作是对保护模式的扩展(这也是IA-32e这种e的含义,extra),但也兼容了32位程序的运行环境。
通过上述,无论是IA-32还是其64位扩展,基本都是围绕保护模式所展开的,而现代操作系统也可以简单说基本都是运行在保护模式下(IA-32e模式本质上是对32位保护模式的扩展)。因此想要理解现代操作系统,保护模式必然是一道绕不过的坎。
2.保护模式概述
保护模式的重要性于Intel 白皮书中所占的篇幅即可窥探一二。这个小节将介绍在X86架构中举足轻重的存在,力图理清保护模式的特性。
在保护模式为出来之前,也即16位机时代,基本所有的CPU都是运行在实地址模式下。实地址模式中线性地址即可等同于物理地址,对线性地址内存的修改则直接等同与对物理地址的修改,这个所谓的实地址指的就是这个特点,线性地址等效于物理地址。这种模式有没有问题?当然有,而且问题很大,否则为什么要有保护模式呢?实模式的主要问题其实就是出在实地址这三个字上,一切的问题都是由实地址所带来的。
首当其冲的问题,实地址模式直面物理内存,导致CPU对所有内存一视同仁,这种做带来的后果是CPU无法区分代码和数据,那么代码所在内存和数据所在内存的特点都一样,因此所有的内存都是可读可写可执行的,这个问题对于系统稳定的影响和系统的危险性不言而喻,其后一切的问题基本都因此所带来的。而后面诞生的所谓保护模式,保护的是什么?保护就是物理内存,因此保护模式最为重要的两个特性就是段的机制和页的机制,它们的主要目的都是为了更加安全和高效的使用物理内存,那么保护模式后面的虚拟内存、分页映射和权限检查等重要特性的目的将不难理解。
因此后续的文章将围绕保护模式段和页的机制作为主线展开,将保护模式琐碎的细节串联起来。