boot:计算机如何“自我启动”
计算机的启动过程看似简单,实则复杂精妙,涉及从硬件到软件的一系列控制权移交
✅ 基本释义
单词 | 词性 | 中文含义 |
---|---|---|
boot | 名词(n.) | 靴子,长筒靴 |
💡 小知识:为什么“boot”也表示启动?
boot 是 bootstrap 的缩写,源于一句英语谚语:
“pull oneself up by one’s bootstraps”
(拽着鞋带把自己拉起来 —— 显然不可能)
这句话最早被工程师用来形容启动计算机的“悖论”: 没有程序无法启动计算机,但计算机不启动又无法加载程序
于是,人们将最初的那段“用来启动计算机的程序”称作 boot(拉鞋带),逐渐演变为计算机术语:
boot:通过最小的代码使计算机自我启动
虽然 boot 本义是“靴子”,但在 IT 语境中,boot = 启动,已是广泛接受的词义扩展
✅ boot vs. start:你用对了吗?
词汇 | 适用范围 | 示例 | 是否底层相关 |
---|---|---|---|
boot | 引导整个计算机系统 | boot the system, bootloader | ✅ 是(从加电开始) |
start | 启动程序/服务/操作 | start browser, start Apache | ❌ 否(操作系统之上) |
✍️ 用法示例
- ✅ I boot the computer.
- ✅ The system boots from USB.
- ✅ GRUB is a bootloader.
- ❌ I boot the browser.
- ✅ I start the browser.
建议:操作系统开发者应明确区分 boot(底层引导)与 start(高层服务启动)
x86 启动体系结构
BIOS 启动与MBR
BIOS 是主板上的固件程序,“硬件到软件的桥梁”,CPU 加电后从 0xFFFF0
开始执行,逐步完成硬件初始化与引导加载
x86 BIOS 启动大致流程如下:
- CPU 加电复位,IP =
0xFFF0
- 从 BIOS ROM 执行
JMP
指令进入主逻辑 - 执行 POST → 初始化内存与外设
- 调用
INT 19h
加载启动设备的 MBR 到0x7C00
- 跳转执行 MBR(bootloader)
MBR
MBR (Master Boot Record) 是存储在硬盘第一个扇区(512字节)中的特殊数据结构,它包含以下组成部分:
- 引导代码 (Bootstrap Code)
- 占用前440字节
- 包含可执行代码,用于启动操作系统
- BIOS 在完成硬件检测后会加载并执行这段代码
- 磁盘签名 (Disk Signature)
- 4字节(偏移量440-443)
- 唯一标识磁盘的标识符
- 保留区域 (Nulls)
- 2字节(偏移量444-445)
- 通常为0x0000
- 分区表 (Partition Table)
- 64字节(偏移量446-509)
- 最多可描述4个主分区(每个分区项16字节)
- 每个分区项包含:
- 引导标志(1字节):指示是否为活动分区
- 起始CHS地址(3字节)
- 分区类型(1字节):标识文件系统类型
- 结束CHS地址(3字节)
- 起始LBA地址(4字节)
- 分区大小(4字节):以扇区为单位
- 引导签名 (Boot Signature)
- 2字节(0x55AA,偏移量510-511)
- 标识有效的MBR
MBR引导代码的执行
- 扫描分区表:查找活动分区(引导标志为0x80的分区)
- 验证活动分区:检查分区类型和有效性
- 加载VBR:将活动分区的第一个扇区(Volume Boot Record)加载到内存
- 转移控制权:跳转到VBR代码执行
限制与特点
- 磁盘大小限制:由于使用32位LBA,最大支持2TB磁盘
- 分区数量限制:最多4个主分区(可通过扩展分区解决)
- 兼容性:与旧系统和硬件高度兼容
- 安全性:缺乏现代安全功能如数字签名验证
MBR与BIOS引导的交互
- BIOS以实模式运行,只能访问1MB内存空间
- MBR代码也运行在实模式下,使用BIOS中断服务
- 磁盘访问方式:
- CHS模式(柱面-磁头-扇区)
- LBA模式(逻辑块地址),通过BIOS扩展功能实现
GPT 与 UEFI 启动
UEFI 是 BIOS 的继任者,支持图形界面、网络启动、安全验证等现代功能
BIOS vs. UEFI 对比表
项目 | BIOS 实模式 | UEFI 模式 |
---|---|---|
地址模式 | 16 位实模式(1MB) | 32/64 位长模式(TB 级) |
分区格式 | MBR,最多 2TB / 4 分区 | GPT,最多 128 分区(可扩展) |
显示方式 | 文本模式 | 图形输出(GOP) |
驱动机制 | 固化,无法扩展 | 加载外部 .efi 驱动 |
安全特性 | 无 | 支持 Secure Boot |
UEFI 使用 GOP(Graphics Output Protocol) 提供帧缓冲图形输出,类似 VESA BIOS,但不依赖操作系统
实模式
一、实模式概览:简单直接但受限
x86 处理器加电启动时,CPU 默认工作在实模式(Real Mode)。这种模式源于 8086 架构,其特点如下:
特性 | 描述 |
---|---|
地址总线宽度 | 20 位物理地址,最大访问范围为 1MB(2²⁰ 字节) |
内存寻址机制 | 使用段寄存器(如 CS、DS)与偏移地址组合寻址 |
地址计算公式 | 物理地址 = 段 × 16 + 偏移 (即 段 << 4 + 偏移 ) |
缺乏保护机制 | 无分页、无权限控制、无虚拟内存 |
可直接访问硬件区 | 如 BIOS ROM、显存、I/O 映射区 |
二、典型内存布局
地址范围 | 用途 |
---|---|
0x00000–0x003FF | 中断向量表(IVT,共 1KB) |
0x00400–0x004FF | BIOS 数据区(BDA) |
0x00500–0x07BFF | 可用内存,DOS 程序运行区 |
0x07C00 | BIOS 加载 MBR 的默认位置 |
07C00h–9FFFFh | DOS应用空间 |
0xA0000–0xBFFFF | 显存:图形/文本模式 |
0xC0000–0xEFFFF | 扩展 ROM,如显卡 BIOS |
0xF0000–0xFFFFF | BIOS ROM 映射区 |
三、段寄存器用途一览
寄存器 | 功能 | 默认用于 |
---|---|---|
CS | 代码段 | JMP、CALL |
DS | 数据段 | MOV、LODS |
SS | 栈段 | PUSH、POP |
ES | 字符串操作 | STOS、MOVS |
支持段前缀,例如:
mov ax, es:[di] ; 使用 ES 段访问内存
mov ax, ss:[bp] ; 使用 SS 段访问栈数据
四、启动流程(BIOS 初始化)
阶段 | 地址 / 内容 |
---|---|
CPU 复位 | CS = 0xF000, IP = 0xFFF0(0xFFFF0) |
跳转指令 | EA 5B E0 00 F0 → FAR JMP 到主逻辑 |
初始化 | POST、内存检测、显卡等 |
设置 IVT | 初始化 0x00000 – 0x003FF 中断表 |
设置 BDA | 初始化 BIOS Data Area(0x0400–0x04FF) |
调用 INT 19h | 加载 MBR → 跳转执行 |
BIOS ROM 映射而非复制进内存
使用芯片组(如 northbridge)把 ROM 的一部分 映射到 CPU 的内存空间
0xF0000–0xFFFFF
上
该地址的内容一般为:
0xFFFF0: EA 5B E0 00 F0 ; JMP FAR F000:00E0
📌 即跳转到 BIOS 主代码入口 0xF00E0
开始 POST 和硬件初始化
中断机制与 INT 服务
一、中断机制
现代计算机体系结构中 软硬件协作机制,允许处理器暂时中断当前任务,转而处理更紧急或更重要的任务(如键盘输入、定时器超时、系统调用等),然后在中断处理完毕后恢复原任务
中断是一种由内部或外部事件触发的控制转移/事件驱动机制,打断当前 CPU 的执行流程,跳转执行中断服务程序(ISR)
◉ 中断来源
中断类型 | 触发方式 | 是否使用 INT 指令 |
举例 |
---|---|---|---|
软件中断 | 执行 INT n 指令 |
✅ 是 | INT 0x10 、INT 0x80 |
硬件中断 | 外设通过硬件信号触发 | ❌ 否 | 键盘输入、定时器溢出 |
异常(陷阱) | CPU 检测到运行错误或特定事件 | ❌ 否 | 除以 0、页错误、调试陷阱 |
◉ 中断向量表(IVT)
实模式下:位于实地址 0x0000:0000
(物理地址 0x00000
),总长 1KB,共 256 项,每项 4 字节(段:偏移地址)
格式:[低地址字节:偏移 | 高地址字节:段]
,共 4 字节一组
中断号 | 地址 |
---|---|
INT 0 | 0000h-0003h (除0异常) |
INT 10 | 0028h-002Bh (BIOS 视频) |
INT 13 | 0034h-0037h (BIOS 磁盘) |
… |
◉ 中断处理流程(实模式)
flowchart TD A[发生中断] -->B[CPU保存现场] B --> C[获取中断向量] C --> D[查找中断向量表] D --> E[跳转到ISR] E --> F[执行中断服务程序] F --> G[中断返回指令] G --> H[恢复现场] H --> I[继续原程序] subgraph CPU自动完成 B C D G H I end subgraph 程序员实现 E F end
-
发生中断(外设/软件/异常触发)
-
CPU:
- 保存当前标志寄存器
FLAGS
- 清除 IF(中断标志位,屏蔽后续中断)
- 将当前
CS:IP
压栈
-
查找中断向量表中的第
n
项(即INT n
)对应的CS:IP
-
跳转到中断服务程序执行
-
中断服务程序结尾执行
IRET
(中断返回):
- 恢复栈中的
IP
、CS
和FLAGS
- 继续原程序执行
◉ 中断类型
- 软件中断
mov ah, 0x0E
mov al, 'A'
int 0x10 ; 通过软件触发 BIOS 的显示字符中断
特点:
- 手动触发
- 常用于调用 BIOS、DOS 或操作系统服务(Linux 的
int 0x80
)
- 硬件中断
硬件中断由外设向中断控制器(如 PIC、APIC)发送中断请求信号(IRQ)触发,CPU 并不会执行 INT
指令
流程大致如下:
- 外设(如键盘)发出 IRQ
- PIC/APIC 接收并发信号给 CPU
- CPU 暂停当前任务,自动跳转到中断服务程序(ISR)
- 通常会通过中断向量(和 IDT/IVT)找到入口地址
示意:
键盘 → IRQ1 → PIC → CPU → ISR → 返回原程序
举例:定时器(IRQ0)、键盘(IRQ1)、硬盘(IRQ14)等中断处理程序
- 异常中断
异常是 CPU 执行过程中自动触发的中断:
- 同步触发:和当前指令直接相关
- 不能屏蔽:如除零异常、无效指令、段错误等
举例:
mov ax, 0
div ax ; 除以 0,会自动触发 INT 0(除零异常)
常见异常:
中断号 | 描述 |
---|---|
INT 0 | 除法错误(#DE) |
INT 6 | 无效操作码(#UD) |
INT 13 | 一般保护异常 |
INT 14 | 页错误(分页机制) |
总结对比
中断类型 | 触发来源 | 示例 | 是否使用 INT 指令 |
是否自动触发 | 可否屏蔽 |
---|---|---|---|---|---|
硬件中断(IRQ) | 外设发出中断信号(经 PIC/APIC) | 键盘、定时器、网卡、鼠标 | ❌ 否 | ✅ 是 | ✅ 是 |
软件中断 | 程序显式执行 INT 指令 |
INT 0x10 (BIOS)、INT 0x80 (Linux syscall) |
✅ 是 | ❌ 否 | ✅ 是 |
异常中断(Fault) | CPU 检测到非法操作或错误 | 除 0 错误、越界、段错误、页错误 | ❌ 否 | ✅ 是 | ❌ 否 |
可屏蔽中断(IRQ) | 与硬件中断重合(受 IF 位控制) | IRQ0–IRQ15(8259 PIC 管理) | ❌ 否 | ✅ 是 | ✅ 是 |
不可屏蔽中断(NMI) | 高优先级专用硬件中断 | RAM 校验错误、主板故障、看门狗 | ❌ 否 | ✅ 是 | ❌ 否 |
◉ 中断服务
BIOS 中断是实模式下 x86 CPU 提供的一组低级硬件访问接口,通过 INT
指令调用
每个中断号对应不同的功能类别,而 AH
寄存器通常用于指定该类别下的具体功能
中断号 | 功能 | 用途 |
---|---|---|
0x10 | 视频 | 设置模式、显示字符等 |
0x13 | 磁盘 | 软盘/硬盘(CHS / LBA )读写 |
0x14 | 串口 | RS232 串口通信 |
0x15 | 高级服务 | 内存探测、A20 控制等 |
0x16 | 键盘输入 | 获取按键等 |
0x19 | 启动加载器 | 加载启动扇区(MBR) |
0x1A | 实时时钟 | 实时时钟 RTC,获取时间/日期 |
◉ 中断控制器(PIC)
PIC(Programmable Interrupt Controller) 是一种专用芯片,用于:
- 管理来自多个外设的中断请求(IRQ)
- 向 CPU 发出统一的中断信号
- 控制中断优先级和屏蔽不必要的中断
- 将中断请求映射到中断向量
🪪 IRQ 通道分配(传统 PC)
IRQ 编号 | 默认用途 | 所属 |
---|---|---|
IRQ0 | 系统定时器 | 主 |
IRQ1 | 键盘控制器 | 主 |
IRQ2 | 连接从 PIC | 主 |
IRQ3 | 串口 COM2 | 主 |
IRQ4 | 串口 COM1 | 主 |
IRQ5 | LPT2 / 声卡 | 主 |
IRQ6 | 软盘控制器 | 主 |
IRQ7 | LPT1 打印机 | 主 |
IRQ8 | 实时时钟 RTC | 从 |
IRQ9 | 可编程中断备用 | 从 |
IRQ10~15 | 网卡、USB 等 | 从 |
工作原理
flowchart TD A[外设触发 IRQ 信号] --> B{PIC 判断是否屏蔽?} B -- 未屏蔽 --> C[PIC向CPU发送INTR信号] B -- 已屏蔽 --> Z[忽略该中断] C --> D[CPU响应INTA(中断确认)] D --> E[PIC发送中断向量号] E --> F[CPU根据向量号查中断向量表] F --> G[跳转执行ISR(中断服务程序)] G --> H[ISR处理完成,发送EOI指令] H --> I[PIC清除中断标记,允许新中断] I --> J[CPU继续执行原程序] subgraph CPU 行为 D F G J end subgraph PIC 行为 B C E I end subgraph 外设行为 A end
关键步骤说明
- 外设触发 IRQ
- 硬件设备(如键盘、定时器)通过 IRQ 线 向 PIC 发送中断请求
- PIC 判断是否屏蔽
- PIC 检查该 IRQ 是否被屏蔽(通过 IMR 中断屏蔽寄存器)
- 若屏蔽,则忽略;否则进入下一步
- PIC 通知 CPU
- PIC 通过 INTR 引脚 向 CPU 发送中断请求
- CPU 响应中断
- CPU 完成当前指令后,发送 INTA(Interrupt Acknowledge) 信号确认中断
- PIC 发送中断向量号
- PIC 收到 INTA 后,将 中断向量号(如
0x08~0x0F
对应 IRQ0~7) 发送给 CPU
- PIC 收到 INTA 后,将 中断向量号(如
- CPU 处理中断
- CPU 根据向量号查找 中断向量表(实模式下位于
0x0000
),跳转到对应的 ISR(中断服务程序)
- CPU 根据向量号查找 中断向量表(实模式下位于
- ISR 发送 EOI(End of Interrupt)
- ISR 处理完成后,向 PIC 发送 EOI 命令(写入
0x20
到 PIC 的 命令端口)
- ISR 处理完成后,向 PIC 发送 EOI 命令(写入
- PIC 允许新中断
- PIC 收到 EOI 后,清除该中断的 正在服务(In-Service, ISR) 标志,允许新的中断请求
- CPU 恢复执行
- CPU 执行
IRET
指令,恢复现场,继续执行原程序
- CPU 执行
补充说明
-
级联 PIC(主从 PIC)
在 x86 系统中,通常有 两个 8259A PIC(主 PIC
IRQ0~7
,从 PICIRQ8~15
),主 PIC 的 IRQ2 连接从 PIC 的 INT 线 -
EOI 的重要性
如果不发送 EOI,PIC 会认为该中断仍在处理,导致 后续中断被阻塞(中断“卡死”)
控制端口 I/O 映射(标准 IBM PC)
控制器 | 命令端口 | 数据端口 |
---|---|---|
主 PIC | 0x20 |
0x21 |
从 PIC | 0xA0 |
0xA1 |
⛓️ 初始化 PIC(重新映射中断向量)
8259 默认将 IRQ0~IRQ7
映射为 INT 0x08~0x0F
,与 x86 异常冲突。因此,操作系统或 bootloader 需 重映射中断向量
💡 示例:将主 PIC 映射到 INT 0x20~0x27
,从 PIC 到 0x28~0x2F
mov al, 0x11 ; ICW1: 初始化命令字,级联模式
out 0x20, al ; 主 PIC 命令端口
out 0xA0, al ; 从 PIC 命令端口
mov al, 0x20 ; ICW2: 主 PIC 起始中断号 0x20
out 0x21, al
mov al, 0x28 ; ICW2: 从 PIC 起始中断号 0x28
out 0xA1, al
mov al, 0x04 ; ICW3: 主 PIC 使用 IRQ2 连接从 PIC
out 0x21, al
mov al, 0x02 ; ICW3: 从 PIC 连接到主 PIC 的 IRQ2
out 0xA1, al
mov al, 0x01 ; ICW4: 普通 8086 模式
out 0x21, al
out 0xA1, al
🚫 中断屏蔽(IMR)
-
PIC 有一个中断屏蔽寄存器(IMR),写入 1 表示屏蔽该中断
-
操作方式:
in al, 0x21 ; 读主 PIC 的 IMR or al, 0x01 ; 屏蔽 IRQ0(定时器) out 0x21, al
🔁 中断结束信号(EOI)
中断服务完成后,必须告诉 PIC 当前中断已处理完:
mov al, 0x20 ; 发送非特定 EOI 命令
out 0x20, al ; 对主 PIC
; 如果是来自从 PIC 的中断,还需给从 PIC 也发 EOI:
out 0xA0, al
PIC 的局限性
PIC 被广泛使用于 实模式和早期操作系统(如 MS-DOS、早期 Linux),但存在明显限制:
- 只能处理 15 个中断(IRQ2 被占用为桥接)
- 优先级固定(IRQ0 > IRQ1 > …)
- 配置复杂(I/O 操作,ICW、OCW)
- 所有中断共享单个线(
INTR
),易阻塞
演进
阶段 | 控制器 | 说明 |
---|---|---|
早期 | 8259 PIC | 单核、最多 15 个中断源 |
中期 | APIC | 多核,每核一个 Local APIC |
后期 | xAPIC | 用 MMIO 控制寄存器,支持更多 IRQ |
现代 | x2APIC | 用 MSR 控制,支持更大系统、更快中断 |
◉ 保护模式与中断门
在 32 位保护模式下:
- 使用 IDT(中断描述符表)替代实模式的中断向量表
- 每个 IDT 项是 8 字节,指向中断门(Interrupt Gate)或陷阱门(Trap Gate)
- 支持权限检查(如用户态只能触发系统调用号)
◉ 总结
中断机制是操作系统、硬件抽象层和驱动程序的基础。它使得:
- CPU 不必轮询外设(高效)
- 实现优先级调度与异步响应
- 系统调用成为可能(通过软中断)
总结流程图:从加电到引导扇区
flowchart TD PWR[加电] FFFF0[CPU:0xFFFF0
CS=F000, IP=FFF0] BIOS[BIOS 执行POST / 初始化] INIT[设置 IVT、BDA 等内存区域] INT19[调用INT 19h
读取MBR到0x7C00] BOOTLOADER[跳转执行 Bootloader
启动 OS] PWR --> FFFF0 --> BIOS --> INIT --> INT19 --> BOOTLOADER