参考: 中国科学院大学 2025年秋《高级操作系统教程》课件
计算机启动
启动流程:
从上电到内核的第一行代码:BIOS -> bootload
任务:
- 硬件初始化 (BIOS)
- 初始化 BIOS
- 检查 CPU 寄存器
- 检查 BIOS 代码的完整性
- 检查 DMA, timer, interrupt controller
- 检查系统内存
- 检查系统总线和外部设备
- 跳转到下一级 BIOS (如 VGA-BIOS ) 执行并返回
- 识别可以启动的设备(CD-ROM? USB? HDD?)
- 加载内核代码到内存 (bootloader)
BIOS (Basic Input/Output System,基本输入输出系统)
存放于 BIOS 芯片(ROM)中
三大任务:
- 初始化硬件
- 在计算机开机时对系统各组件进行检查
- 启动操作系统
- 加载引导程序(bootloader)或操作系统
- 提供硬件的软件抽象
- 向操作系统提供系统配置信息
- 向操作系统提供硬件访问接口,向操作系统隐藏硬件的变化
- 现代操作系统会忽略 BIOS 提供的抽象层并直接访问硬件
BIOS 中的主要内容:
- 程序段:
- 自诊断程序
通过读取 CMOS RAM 中的内容,识别硬件配置,并对其进行自检和初始化 - CMOS设置程序
引导过程中,用特殊热键启动,进行设置后,存入 CMOS RAM 中 - 系统自检装载程序
在自检成功后,将磁盘 0 磁道 0 扇区上的引导程序装入内存,让其运行以装入系统 - 主要 I/O 设备的驱动程序和中断服务
- 自诊断程序
- 数据段: 系统基本配置
缺点:
- 采用汇编语言编写,维护困难
- 以 16 位模式的代码的形式存在,这就给运行于增强模式的操作系统访问其服务造成了困难
EFI / UEFI (Extensible Firmware Interface / Unified Extensible Firmware Interface)
EFI/UEFI 的优点:更易于实现,容错和纠错特性更强,缩短了研发时间
- 模块化
- C语言
- 动态链接较
- 标准接口
- 开放统一
- 开源
- 运行于32位或64位模式
- 充分的向下兼容性
- EFI 系统下的驱动用 EFI Byte Code 编写而成,不是直接可运行的二进制代码
- EFI Byte Code: 专用于 EFI 驱动的虚拟机器语言,必须在 EFI 驱动运行环境下被解释运行
- 利用加载 EFI 驱动的形式,识别及操作硬件
bootloader 引导程序
存放于磁盘的 MBR 扇区
- 开机时,引导操作系统启动的程序
- BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 bootloader 读到系统的 RAM 中,然后将控制权交给 bootloader
bootloader 的主要任务:
- 将操作系统内核从硬盘加载到 RAM 中
- 需要为操作系统提供启动参数,以实现定制化启动
- 跳转到内核的入口点去执行,即启动操作系统
常见的bootloader:
Grub, isolinux, uboot, openSBI,ntldr(用于启动Windows系统) ,Linuxboot
两种磁盘分区表:
- MBR
1
2
3
4
5 +-------------+----------------------+--------------+
| boot loader | Disk Partition Table | Magic Number |
+-------------+---+---+---+---+------+--------------+
| code | 1 | 2 | 3 | 4 | ... | 0x55AA |
+-------------+---+---+---+---+------+--------------+
- GPT
1
2
3
4
5
6
7
8
9
10
11 +------+---------------------------+---------------------+-----------+--------+
| PMBR | Partition Table | Partition | Table | GPT |
| | | | Backup | Backup |
+------+-----+---+---+---+---+-----+---+---+---+---+-----+-----------+--------+
| | GPT | | | | | | | | | | | Partition | GPT |
| MBR | HDR | 1 | 2 | 3 | 4 | ... | 1 | 2 | 3 | 4 | ... | Table | HDR |
| | | | | | | | | | | | | Backup | Backup |
+------+-----+---+---+---+---+-----+---+---+---+---+-----+-----------+--------+
| LBA0 | LBA1| LBA2 |LBA3~| LBA35 ~ LBA-35 | LBA-34~ | LBA-1 |
| | | |LBA34| | LBA-2 | |
+------+-----+---------------+-----+---------------------+-----------+--------+
当前在 Linux 上希望统一 bootloader 的进展: LinuxBoot
从内核的第一行代码到第一个用户态程序的第一行代码:kernel boot
任务:
- 配置页表并开启虚拟内存机制,允许使用虚拟地址
- 配置异常向量表并打开中断,允许”双循环”