OS Boot
操作系统引导解决的问题是:按下电源后,CPU 如何从一无所有的硬件初始状态,一步步走到操作系统就绪、用户可以开始使用?
核心矛盾是一个自举问题:要加载操作系统,需要磁盘读写能力和文件系统解析能力;但这些能力本身就是操作系统才提供的。开机时内存是空的,操作系统还没运行——谁来加载操作系统?
答案是一段极小的固化程序充当起点。它只做最基础的事:从磁盘的固定位置找到下一段稍大的程序,把控制权交过去。每一段程序再找到更大、更完整的下一段,像接力一样逐级放大,直到完整的内核被装入内存并接管整台机器。
引导块
引导程序的存放位置是约定好的——在磁盘的某个固定位置。这个位置称为引导块,也叫启动块。
为什么必须是固定位置
开机早期没有操作系统,ROM 中的小程序不能依赖文件系统去”按路径查找”下一段程序。它只能用最简单的规则——比如”去磁盘的第一个扇区”——找到引导程序。所以启动块、MBR、活动分区引导记录等位置都需要硬件或固件级别的约定,不能随意变动。
BIOS 引导链
典型的 BIOS 引导过程:
- CPU 上电复位 从硬件约定的固定地址开始取指,该地址映射到 ROM,执行其中的自举装入程序。
- 硬件自检与设备选择 ROM 程序进行 POST 自检,按 BIOS 中设置的启动顺序选择启动设备。
- 读入 MBR ROM 程序把启动磁盘的第一个扇区(512 字节)——主引导记录 MBR 读入内存,并把控制权交给其中的引导代码。MBR 的前 446 字节是可执行代码,后 64 字节是分区表。
- 扫描分区表 MBR 中的引导程序扫描分区表,找到标记为活动分区的分区。
- 读入分区引导记录 系统读入活动分区的第一个扇区——分区引导记录,执行其中的引导程序。
- 查找并加载内核 分区引导程序或启动管理器在文件系统中定位操作系统内核和初始化程序,将它们装入内存。
- 内核初始化 内核开始执行,建立中断向量表、内存管理、进程管理、设备驱动等基本运行环境。
- 进入用户态 系统启动第一个用户态服务或登录程序,此后普通用户程序通过系统调用请求内核服务。
整个过程的逻辑是:每一段程序都只负责找到比它更大、更完整的下一段,交付控制权,不做多余的事。 这种逐级放大的设计让几百字节的 ROM 代码最终能启动几 GB 的操作系统内核。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!