详解开机流程:
1. 加电,进入BIOS(Basic Input Output System):
x86系列CPU:加电即进入16位的 实模式。
CS = 0xF000
IP = 0xFFF0
CS:IP = 0xFFFF0
指向地址0xFFFF0,即BIOS的入口地址。
2. Power-on Self Test(开机自检)
BIOS会对硬件设备进行检测,屏幕可能出现内存显卡等信息。
3. BIOS 加载中断向量表和中断程序
BIOS 会在内存最开始的1KB构建中断向量表,之后的256字节构建数据区,之后加载中断向量表和中断服务程序。
4. 加载引导程序 1
现在 CPU 会收到 int 0x19 的中断,去0x0E6F2 找到中断程序入口地址,启动加载服务程序,就是把第一扇区的 512 字节加载到0x07C00 内存处。
This is called the Master Boot Record (MBR)
Code就是操作系统的引导程序,例如GRUB。还有Disk Signature。四个16字节的条目描述了磁盘是如何分割的(可以运行多个操作系统或在同一磁盘中有单独的卷)。
如下图,利用MBR转移控制权限。
4. 加载引导程序 1.5
有了第一部分的引导程序,接下来就是进行第二部分的程序引导。而第一部分引导程序,就是脱离了硬件,内存中终于有了操作系统的代码。
在引导程序 1 中,包括将要加载的setup程序的扇区数(SETUPLEN)以及被加载到的位置(SETUPSEG);启动扇区被BIOS加载的位置(BOOTSEG)及将要移动到的新位置(INITSEG);内核(kernel)被加载的位置(SYSSEG)、内核的末尾位置(ENDSEG)及根文件系统设备号(ROOT_DEV)。运行 引导程序 1。
- 首先会对内存进行规划。将 0x07C00 处的 512B 内容复制到 0x9000处。
- 在复制过程中CS被指向了新位置,用CS的值0x9000来把数据段寄存器(DS)、附加段寄存器(ES)、栈基址寄存器(SS)设置成与代码段寄存器(CS)相同的位置,并将栈顶指针SP指向偏移地址为0xFF00处。
- 利用 int 0x13 中断从磁盘服务程序的 2 - 5 扇区加载到 0x90200处,紧挨着之前的 512B。
5. 加载引导程序 2
同上,将 6-240 软盘的内容加载到0x1000后的120KB空间。
6. 引导程序 1 完成
确认根设备号。
将语句跳转到 0x90200 处,也就是 引导程序 1.5。
7. 引导程序 1.5
-
利用BIOS的中断向量提取机器信息并保存在0x90000- 0x901FC的位置。自此操作系统的内核加载完成。
-
关中断。
-
将0x10000的内核代码复制到起始位置0x00000。这就将 BIOS 建立的中断向量表和数据区给覆盖掉了
接下来,就是操作系统的任务了。