启动流程

启动链路可抽象为控制权在不同阶段的转移过程。当前主线为 UEFI + GPT + ESPBIOS + MBR 作为兼容路径保留。

Power On
  -> CPU 从复位向量开始执行
  -> 固件完成最小硬件初始化
  -> 固件加载引导程序(.efi 或 legacy boot sector)
  -> 引导程序加载内核镜像
  -> 内核接管(ExitBootServices 之后)

MIPS 早期启动特征

MIPS 早期阶段的核心目标是确定性执行。由于 cache/TLB/MMU 可能尚未稳定,代码通常优先使用行为可预测的地址区。

区域常见用途早期阶段适用性
kuseg用户态虚拟地址低,依赖 MMU
kseg0cached 直映中,依赖 cache 状态
kseg1uncached 直映高,常用于寄存器/串口
kseg2/3内核映射区低,依赖完整映射

典型 MIPS 启动主干:

start.S(reset)
  -> 关中断/初始化 CP0
  -> 早期时钟与平台初始化
  -> 设置栈指针 sp
  -> 跳转 C 入口 board_init_f
  -> relocate_code
  -> board_init_r
  -> bootm/booti/bootz

sp 在进入 C 前必须可用;否则函数调用现场无法可靠保存。


源码主线(正文中段)

以下代码块为结构化摘录,用于对应常见开源实现中的调用关系。

U-Boot(MIPS): start.S -> board_init_f -> board_init_r

路径参考:arch/mips/cpu/start.Scommon/board_f.ccommon/board_r.c

/* 结构化摘录 */
reset:
    mtc0  zero, CP0_STATUS
    # early cpu/clock init
    la    sp, CONFIG_SYS_INIT_SP_ADDR
    jal   board_init_f
    nop
/* 结构化摘录 */
void board_init_f(ulong boot_flags) {
    early_init_uart_clock_dram();
    relocate_code(...);
}

void board_init_r(gd_t *gd, ulong dest_addr) {
    init_drivers_and_commands();
    run_main_loop();
}

SeaBIOS: 启动设备选择与移交

路径参考:src/post.csrc/boot.c

/* 结构化摘录 */
void boot_prep(void) {
    scan_bootorder();
    select_boot_device();
    call_boot_entry();
}

EDK2/UEFI: Boot Manager 调度

路径参考:MdeModulePkg/Universal/BdsDxe/

/* 结构化摘录 */
EfiBootManagerRefreshAllBootOption();
Option = EfiBootManagerGetBootManagerMenu();
EfiBootManagerBoot(&Option);   // 内部进入 LoadImage/StartImage

固件阶段向内核阶段的关键分界点为 ExitBootServices()

GRUB(UEFI): EFI 应用入口

路径参考:grub-core/kern/efi/

/* 结构化摘录 */
grub_efi_image_handle = image_handle;
grub_machine_init();
grub_main();

在 UEFI 模式下,GRUB 作为 EFI 应用被固件直接加载,不再依赖 MBR 446B 引导代码链。


BIOS+MBR 与 UEFI+GPT

BIOS + MBR(兼容路径)

BIOS 完成 POST 后读取 LBA0 的 MBR 并移交执行。MBR 结构如下:

区段大小
boot code446B
partition table64B
signature2B (0x55AA)

该路径可用,但扩展与安全能力受限。

UEFI + GPT + ESP(当前主线)

UEFI 从 ESP 加载 .efi 启动程序,主流程如下:

SEC/PEI/DXE/BDS
  -> 读取 NVRAM 启动项(BootOrder/Boot####)
  -> 从 ESP 加载 *.efi
  -> 引导器加载内核
  -> ExitBootServices
  -> Kernel

常见 ESP 路径:

  • EFI/BOOT/BOOTX64.EFI
  • EFI/ubuntu/grubx64.efi
  • EFI/systemd/systemd-bootx64.efi
  • EFI/Microsoft/Boot/bootmgfw.efi

快速源码索引

主题入口
U-Boot MIPS 汇编入口arch/mips/cpu/start.S
U-Boot C 初始化common/board_f.c, common/board_r.c
SeaBIOS 启动调度src/post.c, src/boot.c
EDK2 BDSMdeModulePkg/Universal/BdsDxe/
EDK2 变量服务MdeModulePkg/Universal/Variable/
GRUB BIOS 平台grub-core/boot/i386/pc/
GRUB UEFI 平台grub-core/kern/efi/

结论:默认启动链路应按 UEFI + GPT + ESP 组织叙述;BIOS + MBR 作为兼容分支理解与排障使用。