以MIT6.828的分节方式来记录操作系统的笔记。
所以第一章: Boot 启动
JOS
在JOS里,Boot作为Lab1存在。
实模式下运行BIOS,BIOS设置eip以启动bootloader,boot loader检查系统状态,开启保护模式,将磁盘上的kernel加载入物理内存,设置eip启动kernel。Kernel开启分页。
BIOS
BIOS的启动依赖于硬件的电信号,在qemu虚拟机里模拟了这样一个信号来启动BIOS。
Bootloader
Bootloader:
- 从实模式进入保护模式,加载全局描述符表(虚拟地址到线性(物理地址)的映射开启)
- 从磁盘加载kernel到内存(通过读取ELF文件的方式)
Kernel
进入Kernel后:
- 开启分页(就是在物理内存的特定位置创建内核页目录和页表数组,实现线性地址到物理地址的映射关系)
- 这里还基于内存映射的关系,实现了向IO HOLE区域(VGA显存)写值的功能,得以在终端上输出了字符
Linux kernel
在linux kernel中,这一环节的基本流程很相似,参考深入理解Linux内核附录1记录一个很简要的流程:
BIOS
硬件电信号拉起ROM上的BIOS程序,BIOS启动后简单检查和初始化一下硬件,随后在磁盘扇区上搜索操作系统来启动,找到磁盘第一个扇区(引导扇区)后将其拷贝到物理内存的0X00007C00处。
Bootloader
物理内存上有bootloader的第一部分了,第一部分可能会移动他的位置并将第二部分再装入物理内存的特定位置,第二部分会从磁盘中读取OS的映射表,提供给用户选项,选择启动哪一个操作系统,选中后bootloader就会调用BIOS过程来不停的装载内核映像,其中setup()函数在0X00090200处,下一步会跳转到这里
setup()
初始化硬件、和一些寄存器等,并跳转到startup_32()
startup_32()
初始化临时堆栈,段寄存器并解压内核映像放置到物理内存上,然后跳转到内核映像上启动
解压的内核映像启动点仍是一个叫做startup_32()的函数,它会再检查一下硬件软件信息然后的跳转到start_kernel()函数
start_kernel()
完成linux内核初始化工作,具体工作过多,这里不说