1、os 整理11 操 作 系 统 启 动 :任何一台计算机,在开机后,它要做的第一件事情就是引导(Booting),通过引导,计算机为自身搭建好运行环境,为以后 OS 的启动与运行做好准备。 首先,我们来看看一台计算机是如何引导自身的。在机器加电后,电源供电稳定后,电源会传给 8284A 时钟生成器一个“Power Good”低电位信号,随后 8284A会输出有效的 RESET 信号,使 CPU 复位,这时 CS:IP = FFFF:0000。CPU 在这里执行一条 jmp far addr 类指令,跳转到实际 BIOS 映射代码的位置,开始执行 BIOS 代码。上述是机器在加电后的启动过程,大
2、家都知道计算机的启动是分为冷启动与热启动的,那么对于热启动,其过程又是怎样的呢?其实热启动只不过是将键盘中断程序置复位标志为 1234h,然后再跳转到 BIOS 处执行,其主要是省去了在自检过程中对存储器的检测。在跳转到 BIOS 后,首先会先关闭中断,然后开始自检(POST)工作,这个自检主要检测计算机最基本设备的运转状态。其主要包括对,CPU 内部寄存器测试,BIOS 芯片字节的检查,8237 DMA 控制器测试,基本 32K RAM 检测等最基本内容。由于被检测设备在系统运行中的重要性,因此在此过程中,BIOS 一旦检测到任何异常,都将判为致命性错误,系统将被停机。通过上面的自检后,BI
3、OS 开始初始化 8259 可编程中断控制器,并设置 BIOS 的8 个主要中断向量(int 10hint 17h),然后初始化并测试 CRT 视频接口以及显示内存(对于热启动这一步将跳过),在确认正常后,执行其内部的显示卡标准驱动程序(注意这里的驱动跟安装操作系统下的驱动是不一样的),这段代码会存放在 C0000h,其主要目的是初始化显示卡。然后 BIOS 会打印显卡信息。接着 BIOS 开始检查其他设备,其包括对 8259 中断控制器测试,8253 定时器测试, 键盘复位和卡键测试,扩展 I/O 测试, 设置硬件中断向量,扩展 RAM 测试(这里的 RAM 测试会检测除 032K 以外的整
4、个 RAM 空间,对于热启动同样也会跳过这一阶段),.然后 BIOS 会搜索其他设备的 ROM,如果找到,则会执行它们。接着测试 ROM-BASIC 的字节检查,测试磁盘驱动器(如:FDC 等),测试打印机端口和 RS-232,并设置他们的地址。os 整理2MBR(Master Boot Record)的扇区中的可执行代码部分:首先,程序会检测 MBR 的签字是否合法,即判断其最后字是否为 AA55h.通过后, 将自身移动到内存中的其他地方,以备将来在此装入引导分区的 Boot 扇区. 然后,程序检查四个分区的分区状态,找出活动分区,并将该分区的 Boot 扇区读入到 0000:7C00h 处
5、,并检查其签字是否合法,在通过后,程序跳转到 0000:7C00h 处执行,即将控制权交给活动分区的 Boot 程序;对于软盘则没有那么复杂,软盘的第一个扇区就是它的 Boot 区,系统自举时将直接将其读入到 0000:7C00h 处并执行。.2 保 护 模 式 基 本 组 成 .最早的 Intel 系列的 CPU 只存在一种操作模式,即现在所说的实模式 (Real Mode,以下简称 RM)。在 Intel 推出 80286 之后,为了增强 CPU 的处理能力,同时也为了适应当时的软件开发需求,Intel 提出了保护模式 (Protected Mode,以下简称 PM),但在 80286 下
6、的 PM 由于 CPU 本身设计的问题,并没有使其发挥出很大的功效。在 80386 推出之后,Intel 完善了 CPU 的设计形成了最终的 IA-32 架构,并提出了另一种模式系统管理模式(System Management Mode)。本章我们的讨论就围绕着这三种模式进行展开,并重点讨论 PM. 首先,对这三种模式做一简单概述。 RM:此模式是主机在加电或复位后自动进入的模式,在此模式下其可以执行 16 位指令,并可以切换到 PM 或者 SMM。 PM:在此模式下,CPU 能够支持其自身的 32 位特性,使自身处于最高性能表现。这些特性主要包括:1 最大可访问 4GB 内存空间。事实上,在
7、 RM 下通过一些未公开的特性,也可以达到同样的效果,但其对于代码段 和堆栈空间却是无效的。况且后面的所有特性都是基于 PM 的,对 RM 没有效果。 2 虚拟存储。处于 PM 下的 CPU 其内存管理单元(MMU)支持这项特性。前面我已经说到,在 PM 下 CPU 最大寻址空 间为 4GB,而在实际中,我们并没有如此大的物理内存空间。因此通过 MMU,可以将外存设备(如:硬盘)的一部分 空间模拟成物理内存进行使用。 3 地址映射。即 MMU 可以在地址使用前对其进行转换,即所谓的映射。 os 整理34 改进的分段机制。本文后面将对此进行重点论述。 5 内存保护与任务保护。即在 PM 状态下,
8、引入了权限机制。通过权限控制可以达到保护相关代码和数据的目的。6 改进的寻址模式。在 RM 下,只有常数,BX 或 BP,SI 或 DI 可以用来形成地址,而在 RM 下可以通过任意寄存器进行寻 址,并且可以包含一个为 2,4 或8 的比例因子。 7 多任务支持。在 PM 下,CPU 提供了特殊的机制能够进行快速的上下文切换。SMM:该模式为操作系统实现特定平台指定的功能提供了一种有效的机制。 值得注意的是,在 PM 下,CPU 允许在受保护的情况下,执行 RM 程序,这个特性被称为虚拟 8086 模式(Virtual-8086 Mode),但其本质上却不是真正的 RM。对于三种模式关系的形象
9、解释可以通过下图来描绘: 正如上面所说的,只有在 PM 下,CPU 才能充分发挥其自身的所有特性,而计算机在启动之后,默认的 CPU 操作模式却是 RM。因此摆在我们面前的一个主要问题就是如何在 RM 与 PM 之间相互切换。那么如何在 RM 和 PM 之间相互切换呢。核心步骤其实很简单,只要改变 CPU 中的 CR0 寄存器中 PE 标志位的值,就可以实现。在 PE=1 时,CPU 进入 PM,而在 PE = 0 时,则进入 RM.但这仅仅是整个切换过程中的一小部分,在进入保护模式之前我们还需要做很多事情,其中最关键的就是建立好一个被称为 GDT 的表。 保 护 模 式 最 基 本 的 组
10、成 部 分 是 围 绕 着 “地 址 转 换 方 式 ”的 变 化 增 设 了 相 应 的 机 构 。 1、 数 据 段 os 整理42、 描 述 符 (ti 位 )3、 选 择 子 3中断中断在系统中是由外部事件所引起的,如:一次 I/O 操作的结束。其产生与 CPU 当前所执行的指令没有关系。从是否能够被屏蔽来划分,可将其分为两类,即可屏蔽中断与不可屏蔽中断,其中前者由 CPU 的 INTR 引脚接收信号,后者由 NMI 引脚接收信号。 由于产生中断的中断源并不单一,因此在 INTR 接收中断的时候,同样还要接收一个 8 位的中断向量号,以判断是谁发出的中断请求。CPU 对于某个中断向量号
11、是由谁发出原则上并没有规定。但在实际系统中,为了避免产生冲突,部分中断向量号都有自己固定的中断源,这一工作是由可编程中断控制器(PIC)完成的。在 80386 系统上,该 PIC 是 8259A。该芯片功能十分强大,不仅能向 CPU提供中断向量号,还可以自主处理中断请求的优先级。每个 8259A 芯片可以支持 8 个中断请求信号,并可进行级连。对于 8259A 的介绍,我们将在文章的后半部分进行。 对于是否屏蔽可屏蔽中断可以通过 8259A 有选择地控制,也可以通过 CPU 的 CLI 和 STI 指令实现。 CLI 和 STI 指令可以设置 EFLAGS 寄存器的 IF 位,如果该位被清除,
12、则 CPU 会禁止外部中断传递信号给 INTR 引脚。但对于 CPU 内部异常和NMI 该位不起作用。在执行这两条指令时,必须要保证当前 CPL 小于等于 IOPL,否则会引起通用保护故障。当然虽然 NMI 是不可屏蔽中断,但通过将 CMOS端口(0x70)中第 7 位置 1 这种手段也可以将 NMI 也屏蔽掉的,当然需要打开该中断将该位清零就可以了。 4异常异常是在 CPU 执行指令期间遇到非法指令所产生的。因此异常与当前指令存在着关系,例如:除零,特权级不正确等等,都会触发异常。80386 可以识别多种不同的异常,并以不同的中断向量号来标示它们。在异常发生时,CPU 就根据原先设定好的中断
13、向量号转到不同的中断处理程序(ISR)执行。在系统中除了存储段描述符和系统段描述符外,还有一类门描述符。这种描述符是用来描述控制转移的入口点。任务内特权级的改变和任务间且换都是通过os 整理5这种描述符实现的。其中,门描述符共分为 4 种分别是,调用门(CallGates),陷阱门(Trap Gates),中断门(Interrupt Gates)和任务门(TaskGates) 。 5陷阱门和中断门这两种门是用来描述中断和异常的入口的。其只能出现在 IDT 中(对于 IDT 后面将有详细描述),不能出现在 GDT 和 LDT 中。这两种门的格式如下表:中断门描述符偏移量3130292827262
14、52423222120191817161514131211109 8 7 6 5 4 3 2 1 0+4偏移量(位 3116)P DPL 0 D 1 10 000 保留+0CS 寄存器选择子偏移量(位 150)陷阱门描述符偏移量313029282726252423222120191817161514131211109 8 7 6 5 4 3 2 1 0+4偏移量(位 3116)P DPL 0 D 1 11 000 保留+0CS 寄存器选择子偏移量(位 150)注:DPL - 描述符特权级P - 门有效标志D - 门规模(1 = 32 位; 0 - 16 位) 在从中断处理程序返回的过程中,如果当初是通过陷阱门或中断门进入的,则从堆栈顶弹出 EIP 和 CS,以及 EFLAGS。然后根据 CS 寄存器选择子的 RPL 字段确定返回后的特权级。值得注意的是,如果 RPL 为一个内层特权级,则将会产生通用保护故障。对于需要提供出错误码的中断处理程序,则必须先人为地从堆栈中弹出出错误码,在执行 IRET 指令返回。 os 整理6进入中断和异常还可以通过任务门.liyj 2010-12-27