环境:linux-0.11系统,x86-CPU构架
从开机加电到执行main函数之前的过程
分三步完成:
1.启动BIOS,准备实模式下的中断向量表和中断服务程序
2.从启动盘加载操作系统程序到内存,加载操作系统程序的工作是利用第一步中准备的中断服务程序实现的
3.为执行32位的main函数做过渡工作。
注:什么是实模式/保护模式?
1.1 0xFFFF0
CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xFFFF,IP的值置为0x0000,CS:IP为0xFFFF0,0xFFFF0指向BIOS地址范围。
BIOS的入口地址就是0xFFFF0.
BIOS程序在内存最开始的位置(0x00000)用1KB的内存空间(0x00000~0x003FF)构建中断向量表,并在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400~0x004FF),在大约56KB以后的位置(0x0E05B)加载了8KB左右的与中断向量表相应的若干中断服务程序。
中断向量表中有256个中断向量,每个中断向量占4个字节,其中两个字节是CS的值,两个字节是IP的值,每个中断向量都指向一个具体的中断服务程序。
1.2 加载操作系统内核程序并为保护模式做准备
分三批逐次加载内核代码:
第一批由BIOS中断int 0x19h把第一扇区bootsect的内容加载到内存
第二批和第三批在bootsect的指挥下,分别把其后的四个扇区和随后的240个扇区的内容加载到内存
1.2.1 加载第一部分代码----引导程序(bootsect)
计算机硬件体系结构设计与BIOS联手操作,会让CPU接收到一个int 19h中断,CPU接收到这个中断后,会立即在中断向量表中找到此中断。中断向量把CPU指向0x0E6F2,即中断服务程序的入口地址。作用就是把软盘的第一个扇区中的程序(bootsect 512B)加载到内存的0x07C00处。
1.2.2 加载第二部分代码-----setup
1. Bootsect对内存的规划
要加载的setup程序的扇区数(SETUPLEN)
被加载到的位置(SETUPSEG)
启动扇区被BIOS加载的位置(BOOTSEG)
将要移动到的新位置(INITSEG)
内核被加载的位置(SYSSEG)
内核的末尾位置(SYSEND)
根文件系统设备号(ROOT_DEV)
2.复制bootsect
Bootsect将自身从内存0x07C00(BOOTSEG)处复制到内存(0x90000INITSEG