操作系统启动流程
Windows 启动流程
计算机启动是一种复杂而有序的过程,而使用 UEFI 和 BIOS 启动 Windows 操作系统又是两种不同的过程。
BIOS 启动
- 按下计算机开机键,此时 BIOS 进行加电自检(POST),自检通过之后,选择从 BIOS 中已设置的第一启动设备启动,然后读取存储于硬盘第一个扇区中的 MBR(0 柱面 0 磁头1 扇区)并把计算机控制权交于 MBR
- MBR 会搜索存储于自身中的硬盘分区表,并找到其中唯一已标注为“活动”的主分区,然后在该分区根目录下搜索并读取 bootmgr(启动管理器)至内存,并将计算机控制权交于 bootmgr
- bootmgr 搜索位于活动分区 Boot 目录下的 BCD(启动配置数据),BCD 中存储有启动配置选项,如果有多个操作系统启动选项,则 bootmgr 会显示所有启动选项,并由用户选择。如果只有一个启动选项,bootmgr 会默认启动
- 默认启动 Windows 操作系统之后,bootmgr 搜索并读取 Windows 分区 Windows\System32 目录下的 winload.exe 程序,然后将计算机控制器交给 winload.exe,并由其完成内核读取与初始化以及后续启动过程
UEFI 启动
- 按下计算机开机键,UEFI 读取位于 ESP 分区 EFI/Microsoft/Boot/ 目录下的 bootmgfw.efi 文件并将计算机控制权交于 bootmgfw 程序
- 由 bootmgfw 搜索并读取存储于 EFI/Microsoft/Boot/ 目录下的 BCD 文件。如果有多个操作系统启动选项,则 bootmgfw 会显示所有启动选项,并由用户选择。如果只有一个启动选项,bootmgfw会默认启动
- 默认启动 Windows 操作系统之后,bootmgrfw 搜索并读取 Windows 分区 Windows\System32
目录下的 winload.efi 程序,然后将计算机控制器交给 winload.efi,并由其完成内核读取与初始化以及后续启动过程
bootmgr 与 bootmgfw 是功能相同,适用于不同固件的程序。
Linux 启动
Linux 的开机引导和启动过程是相当容易理解,过程如下:
- 按下计算机开机键,此时 BIOS 进行加电自检(POST),自检通过之后,选择从 BIOS 中已设置的第一启动设备启动,然后读取存储于硬盘第一个扇区中的 MBR 并把计算机控制权交于 MBR
- MBR 引导加载器,大多数 Linux 发行版本使用的引导加载器有三种: GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相对于其他老的同类程序使用最广泛的。控制权交由加载器后,加载器加载内核程序
- 在选定的内核加载到内存中并开始执行后,在其进行任何工作之前,内核文件首先必须从压缩格式解压自身。一旦内核自解压完成,则加载 systemd 进程,并转移控制权到 systemd