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 启动大致流程如下:

  1. CPU 加电复位,IP = 0xFFF0
  2. 从 BIOS ROM 执行 JMP 指令进入主逻辑
  3. 执行 POST → 初始化内存与外设
  4. 调用 INT 19h 加载启动设备的 MBR 到 0x7C00
  5. 跳转执行 MBR(bootloader)

MBR

MBR (Master Boot Record) 是存储在硬盘第一个扇区(512字节)中的特殊数据结构,它包含以下组成部分:

  1. 引导代码 (Bootstrap Code)
  • 占用前440字节
  • 包含可执行代码,用于启动操作系统
  • BIOS 在完成硬件检测后会加载并执行这段代码
  1. 磁盘签名 (Disk Signature)
  • 4字节(偏移量440-443)
  • 唯一标识磁盘的标识符
  1. 保留区域 (Nulls)
  • 2字节(偏移量444-445)
  • 通常为0x0000
  1. 分区表 (Partition Table)
  • 64字节(偏移量446-509)
  • 最多可描述4个主分区(每个分区项16字节)
  • 每个分区项包含:
    • 引导标志(1字节):指示是否为活动分区
    • 起始CHS地址(3字节)
    • 分区类型(1字节):标识文件系统类型
    • 结束CHS地址(3字节)
    • 起始LBA地址(4字节)
    • 分区大小(4字节):以扇区为单位
  1. 引导签名 (Boot Signature)
  • 2字节(0x55AA,偏移量510-511)
  • 标识有效的MBR

MBR引导代码的执行

  1. 扫描分区表:查找活动分区(引导标志为0x80的分区)
  2. 验证活动分区:检查分区类型和有效性
  3. 加载VBR:将活动分区的第一个扇区(Volume Boot Record)加载到内存
  4. 转移控制权:跳转到VBR代码执行

限制与特点

  • 磁盘大小限制:由于使用32位LBA,最大支持2TB磁盘
  • 分区数量限制:最多4个主分区(可通过扩展分区解决)
  • 兼容性:与旧系统和硬件高度兼容
  • 安全性:缺乏现代安全功能如数字签名验证

MBR与BIOS引导的交互

  1. BIOS以实模式运行,只能访问1MB内存空间
  2. MBR代码也运行在实模式下,使用BIOS中断服务
  3. 磁盘访问方式
    • 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 0x10INT 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
  1. 发生中断(外设/软件/异常触发)

  2. CPU:

  • 保存当前标志寄存器 FLAGS
  • 清除 IF(中断标志位,屏蔽后续中断)
  • 将当前 CS:IP 压栈
  1. 查找中断向量表中的第 n 项(即 INT n)对应的 CS:IP

  2. 跳转到中断服务程序执行

  3. 中断服务程序结尾执行 IRET(中断返回):

  • 恢复栈中的 IPCSFLAGS
  • 继续原程序执行

◉ 中断类型

  1. 软件中断
mov ah, 0x0E
mov al, 'A'
int 0x10      ; 通过软件触发 BIOS 的显示字符中断

特点:

  • 手动触发
  • 常用于调用 BIOS、DOS 或操作系统服务(Linux 的 int 0x80

  1. 硬件中断

硬件中断由外设向中断控制器(如 PIC、APIC)发送中断请求信号(IRQ)触发,CPU 并不会执行 INT 指令

流程大致如下:

  1. 外设(如键盘)发出 IRQ
  2. PIC/APIC 接收并发信号给 CPU
  3. CPU 暂停当前任务,自动跳转到中断服务程序(ISR)
  4. 通常会通过中断向量(和 IDT/IVT)找到入口地址

示意:

键盘 → IRQ1 → PIC → CPU → ISR → 返回原程序

举例:定时器(IRQ0)、键盘(IRQ1)、硬盘(IRQ14)等中断处理程序


  1. 异常中断

异常是 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

关键步骤说明

  1. 外设触发 IRQ
    • 硬件设备(如键盘、定时器)通过 IRQ 线 向 PIC 发送中断请求
  2. PIC 判断是否屏蔽
    • PIC 检查该 IRQ 是否被屏蔽(通过 IMR 中断屏蔽寄存器
    • 若屏蔽,则忽略;否则进入下一步
  3. PIC 通知 CPU
    • PIC 通过 INTR 引脚 向 CPU 发送中断请求
  4. CPU 响应中断
    • CPU 完成当前指令后,发送 INTA(Interrupt Acknowledge) 信号确认中断
  5. PIC 发送中断向量号
    • PIC 收到 INTA 后,将 中断向量号(如 0x08~0x0F 对应 IRQ0~7) 发送给 CPU
  6. CPU 处理中断
    • CPU 根据向量号查找 中断向量表(实模式下位于 0x0000),跳转到对应的 ISR(中断服务程序)
  7. ISR 发送 EOI(End of Interrupt)
    • ISR 处理完成后,向 PIC 发送 EOI 命令(写入 0x20 到 PIC 的 命令端口
  8. PIC 允许新中断
    • PIC 收到 EOI 后,清除该中断的 正在服务(In-Service, ISR) 标志,允许新的中断请求
  9. CPU 恢复执行
    • CPU 执行 IRET 指令,恢复现场,继续执行原程序

补充说明

  • 级联 PIC(主从 PIC)

    在 x86 系统中,通常有 两个 8259A PIC(主 PIC IRQ0~7,从 PIC IRQ8~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