操作系统学习(一)OS启动基于uCore
BIOS
对于x86-32操作系统,可以访问的内存空间范围为4GB。在计算机启动时,首先进入16位的实模式,可以访问的内存空间为1MB,其中BOIS存储在1MB的空间中,如图所示。
BIOS位于EEPROM中,完成以下工作:
- 基本输入输出的程序
- 系统设置信息
- 开机后自检程序
- 系统自启动程序等
BIOS将加载程序从磁盘的引导扇区(512字节)加载到0x7C00,加载程序(BootLoader)将操作系统加载到内存中,完成操作系统的启动。
QEMU默认使用的BIOS是SeaBIOS,具体内容需要看QEMU源码。1
CPU
CPU上电后从0xFFFF0读取第一条指令,根据CS:IP得到。
第一条指令是一个长跳转指令,有的BIOS IBV这条指令是 Jmp F000:E05Bh,有的则是Jmp F000:FFAAh。不同产商做法不同,都是一条长跳转指令。
CS将被更新成0xF000,表面上看CS其实没变化,但CS的基址域将被更新为0x000F0000h(0xF000左移4位),此时形成的物理地址为Base+EIP=0x000FE50B,而此地址是在1M中的了。0xFFFE0000-0xFFFFFFFF和0xE0000-0xFFFFF这两段物理地址均是会被decode到BIOS 芯片中。2
系统启动流程
由于目前的硬盘可能有多个扇区,BIOS读取加载程序的位置不确定,系统的启动流程如图所示。
系统上电后,由BIOS初始化硬件,读取主引导扇区上的主引导记录(MBR),主引导记录读取活动分区的引导扇区代码,加载并跳转到磁盘上的引导程序。
加载程序
加载程序(BootLoader)从文件系统中读取启动配置信息,依据配置加载指定内核并跳转到内核执行。
对于X86系统,加载程序完成的工作包括:
- 使能保护模式和段机制
- 从硬盘上读取kernel并加载到内存中固定位置
- 跳转到kernel进行执行,控制权交给OS
后续以uCore的BootLoader和kernel为例进行分析。