操作系统启动过程
2023年 8月 13日
50.6k
0
BIOS读入硬盘第1磁道,第一扇区的程序,一共512字节,读取到内存0x7c00到位置。这部分内容是源码中boot/bootsect.s的内容,CPU将从0x7c00处开始执行bootsect.s中的指令。此时CPU处于实模式。
执行bootsect.s代码,会将0x7c00 - 0x7e00的内容,也即是整个bootsect.s内容拷贝到0x90000 - 0x90200。然后跳转到新区域继续执行bootsect.s的代码
继续执行bootsect.s代码的时候,CPU会继续从磁盘读入后续4个扇区的内容,也即是boot/setup.s的程序,一共 4 * 512字节,然后写入到0x90200 - 0x90a00区域。紧接着继续从磁盘读入 system 模块,写入到内存0x10000 - 0x90000区域(不一定占满全部,只是假设了system模块大小不会超过0x80000的大小,即512KB)。bootsect.s就执行完了,准备开始执行setup.s
执行setup.s代码的时候,系统会通过BIOS获取机器的一些参数信息,比如说内存大小,显存信息等,这些数据放置在0x90000 - 0x90200区域内。也就是说把bootsect.s的代码给覆盖了。
具体这块区域中记录了什么,如下图
继续执行setup.s,系统会将system模块整体移动到0x00000 - 0x80000 的区域。然后开启CPU保护模式,将程序指针跳转到0x00000,开始执行system中的代码
system的开头是boot/head.s的程序,主要做了CPU保护模式下一些寄存器的初始化,页表初始化等操作。最后跳转至/init/main.c中 的main函数,操作系统从此开始进行自身的初始化工作,开始运行。
参考
www.oldlinux.org/Book-Lite/
www.bilibili.com/video/BV19r…
time.geekbang.org/opencourse/…
捡田螺的小男孩