Linux内核引导过程解析:从开机到内核加载(基于0xAX/linux-insides项目)
linux-insides 项目地址: https://gitcode.com/gh_mirrors/li/linux-insides
引言:计算机启动的魔法时刻
当我们按下计算机的电源按钮时,一系列精密的硬件和软件协同工作,最终将操作系统加载到内存中。这个过程看似简单,实则包含了许多复杂的技术细节。本文将深入探讨x86_64架构下Linux内核的引导过程,从硬件初始化到内核加载的完整流程。
计算机启动的硬件阶段
1. 电源启动与CPU初始化
按下电源按钮后,主板向电源供应单元发送信号。电源稳定后,会向主板发送"Power Good"信号。此时,主板开始初始化CPU:
- CPU寄存器被重置为预定义值
- x86 CPU进入实模式(Real Mode)
- 关键寄存器初始值:
- CS(代码段寄存器)= 0xf000
- IP(指令指针)= 0xfff0
- CS基地址 = 0xffff0000
2. 实模式下的内存寻址
实模式是x86 CPU的初始工作模式,具有以下特点:
- 20位地址总线(1MB寻址空间)
- 16位寄存器(最大64KB寻址能力)
- 使用分段内存管理机制
物理地址计算公式:
物理地址 = 段选择器 × 16 + 偏移量
例如,CS:IP为0x2000:0x0010时:
0x2000 × 16 + 0x0010 = 0x20010
3. 复位向量与BIOS
CPU从复位向量地址0xFFFFFFF0(16字节低于4GB)开始执行,这里通常是一条跳转指令,指向BIOS的入口点。BIOS的主要职责包括:
- 硬件自检(POST)
- 初始化硬件设备
- 寻找可启动设备
- 加载并执行启动扇区代码
启动扇区与引导加载程序
1. 主引导记录(MBR)
BIOS在可启动设备的第一个扇区(512字节)寻找MBR:
- 前446字节:启动代码
- 随后64字节:分区表
- 最后2字节:魔数0x55AA(标识可启动设备)
一个简单的启动扇区示例(NASM语法):
[BITS 16]
boot:
mov al, '!'
mov ah, 0x0e
int 0x10 ; 调用BIOS显示服务
jmp $
times 510-($-$$) db 0
db 0x55
db 0xaa
2. GRUB2引导加载程序
现代Linux系统通常使用GRUB2作为引导加载程序,其主要工作流程:
- boot.img:初始加载程序(位于MBR)
- diskboot.img:核心镜像加载器
- core.img:包含GRUB内核和文件系统驱动
- grub_main:初始化控制台、加载配置、模块等
- 显示启动菜单,加载选定的操作系统内核
Linux内核加载协议
引导加载程序需要按照Linux内核启动协议准备内存环境,并填充内核头部信息。典型的内存布局如下:
内存地址 内容
0x100000 保护模式内核
0x0A0000 I/O内存区域
0x000000 BIOS保留区域
X+0x10000 命令行参数
X+0x08000 内核实模式堆栈
X 内核设置代码
0x7C00 引导扇区入口
内核头部结构
内核头部定义在arch/x86/boot/header.S中,包含关键字段:
hdr:
setup_sects: .byte 0 ; 设置扇区数
root_flags: .word ROOT_RDONLY
syssize: .long 0 ; 系统大小
vid_mode: .word SVGA_MODE
boot_flag: .word 0xAA55
调试技巧:观察早期启动过程
要调试内核早期启动过程,可以使用QEMU配合GDB:
- 启动QEMU并等待GDB连接:
qemu-system-x86_64 -kernel bzImage -nographic -append "console=ttyS0" -S -s
- 使用GDB连接并设置断点:
gdb vmlinux
(gdb) target remote :1234
(gdb) hbreak *0x1000000
(gdb) c
- 转储内存分析:
(gdb) dump binary memory /tmp/dump 0x0000 0x20000
总结:启动过程全景图
- 电源启动 → CPU初始化 → 执行BIOS代码
- BIOS查找可启动设备 → 加载MBR
- 引导加载程序(如GRUB2)接管 → 加载内核
- 内核初始化 → 切换保护模式 → 启动系统
理解这个完整流程对于深入学习操作系统原理和内核开发至关重要。在后续文章中,我们将继续探讨内核初始化的更多细节。
linux-insides 项目地址: https://gitcode.com/gh_mirrors/li/linux-insides
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考