从开机到main函数的执行分为三步完成,目的是实现从启动盘加载操作系统程序,完成执行main函数所需要的准备工作。
第一步,启动BIOS,准备实模式下的中断向量表和中断服务程序。
实模式(Real Mode)是Inter 80286和之后的80x86兼容的CPU的操作模式(应该包括8086)。实模式的特征是一个20位的存储器地址空间(2^20 = 1048 576,即1MB的存储器可被寻址),可以直接软件访问BIOS以及周边硬件,没有硬件支持的分页机制和实时多任务概念。从80286开始,所有的80x86CPU的开机状态都是实模式;8086等早期的CPU只有一种操作模式,类似于实模式。
BIOS程序在内存最开始的位置(0x00000)用1K的内存空间(0x00000 ~ 0x003FF)构建中断向量表,在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400 ~ 0x004FF),并在大约57K以后的位置(0x0E05B)加载了8KB左右的与中断向量表相应的若干中断服务程序。
中断向量表是实模式中断机制的重要组成部分,记录所有中断号对应的中断服务程序的内存地址。
中断服务程序是通过中断向量表的索引对中断进行响应服务,是一些具有特定功能的程序。
在Linux系统的启动过程中无论Linux的内核是如何设计的,BIOS程序所要做的就是找到软盘并加载第一扇区,其余的它什么都不知道,也不必知道。
第二步,从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步中准备的中断服务程序实现的。
首先,加载第一部分内核代码,即引导程序(bootsect);
随后加载第二部分内核代码setup;
最后加载第三部分内核代码system模块。
第三步,为执行32位的main函数做过渡工作。
首先,关闭中断并将system移动到内存地址起始位置0x00000;
接下来,设置中断描述符和全局描述符表;
之后,打开A20,实现32位寻址;
最后,为保护模式下执行head.s做准备,并执行head.s。
到此从开机加电到执行main函数之前的工作已经准备完毕。