第一章 从开机加电到执行main函数之前的过程

2019-04-13 15:28发布

   从开机到main函数的执行分三步完成,其目的是实现从启动盘加载操作系统程序,完成执行main函数所需要的准备工作。    第一步:启动BIOS,准备实模式(实模式是Intel 80286和之后的80x86兼容CPU的操作模式)下的中断向量表和中断服务程序;    第二步:从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步中准备的中断服务程序实现的。    第三步:为执行32位的main函数做过渡工作。

   1.1 启动BIOS,准备实模式(实模式是Intel 80286和之后的80x86兼容CPU的操作模式)下的中断向量表和中断服务程序

    计算机的运行时离不开程序的。然而,按下计算机电源按钮加电的那一刻,计算机的内存中,准确说是RAM中,空空如也,软盘里虽有操作系统,但CPU的逻辑电路被设计为只能运行内存中的程序,如果要运行软盘中的操作系统,必须将软盘中的操作系统加载到内存(RAM)中。     注:RAM,随机存取存储器,特点加电状态下课任意读写,断点后信息消失。     当RAM中什么程序都没有的时候,谁来完成加载软盘中操作系统的任务? BIOS。

  1.1.1 BIOS的启动原理

   BIOS有谁来执行?    0xFFFF0。从体系的角度,可得出这样结论:既然软件方法不能执行BIOS,那就只能靠硬件方法完成。 CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xFFFF,IP的值置为0x0000,这样CS:IP就指向了0xFFFF0这个位置。如图1-1。
  注:IP/EIP,指令指针寄存器,存在于CPU中,记录将要执行的指令在代码段中的偏移地址,它于CS组合即为将要执行的指令的内存地址。         CS,code segment register,代码daunting寄存器,存在于CPU中,指向CPU当前执行代码在内存中所在的区域。
   图1-1 启动时BIOS在内存中的状态及初始执行位置
  注意,这是一个纯硬件完成的动作,BIOS程序的入口地址恰恰就是0xFFFF0,也就是,BIOS程序的第一条指令就设计在这个位置上。

 1.1.2 BIOS在内存中加载中断向量表和中断服务程序

  BIOS程序被固化在计算机主机板上的一块很小的ROM芯片里。为了便于立即,选用的BIOS程序只有8KB,所占地址段为0xFE000~0xFFFF,如图1-2所示,现在CS:IP已经指向了0xFFFF0这个位置,这意味着BIOS开始启动了,随着BIOS程序的执行,屏幕上会显示显卡的信息,内存的信息……说明BIOS程序在检测显卡、内存……这期间,有一项对启动boot操作系统至关重要的工作,就是BIOS在内存中建立中断向量表和中断服务程序。    注:ROM,只读存储区,现在通常用闪存芯片做ROM。特性,断电之后仍能保存信息,这一点与硬盘类似。    BIOS程序在内存最开始的位置(即:0x00000)用1KB的内存空间(0x00000 ~ 0x003FF)构建中断向量表,并在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400 ~ 0x004FF),在大约56KB以后的位置(0x0E2CE)加载了8KB左右的与中断向量表相应的若干中断服务程序。

图1-2 BIOS在内存中加载中断向量表和中断服务程序

    中断向量表中有256个中断向量,每个中断向量占4个字节,其中两个字节是CS的值,两个字节是IP的值,每个中断向量都指向一个具体的中断服务程序。