Linux内核引导过程解析:从开机到内核加载(基于0xAX/linux-insides项目)

Linux内核引导过程解析:从开机到内核加载(基于0xAX/linux-insides项目)

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的主要职责包括:

  1. 硬件自检(POST)
  2. 初始化硬件设备
  3. 寻找可启动设备
  4. 加载并执行启动扇区代码

启动扇区与引导加载程序

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作为引导加载程序,其主要工作流程:

  1. boot.img:初始加载程序(位于MBR)
  2. diskboot.img:核心镜像加载器
  3. core.img:包含GRUB内核和文件系统驱动
  4. grub_main:初始化控制台、加载配置、模块等
  5. 显示启动菜单,加载选定的操作系统内核

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:

  1. 启动QEMU并等待GDB连接:
qemu-system-x86_64 -kernel bzImage -nographic -append "console=ttyS0" -S -s
  1. 使用GDB连接并设置断点:
gdb vmlinux
(gdb) target remote :1234
(gdb) hbreak *0x1000000
(gdb) c
  1. 转储内存分析:
(gdb) dump binary memory /tmp/dump 0x0000 0x20000

总结:启动过程全景图

  1. 电源启动 → CPU初始化 → 执行BIOS代码
  2. BIOS查找可启动设备 → 加载MBR
  3. 引导加载程序(如GRUB2)接管 → 加载内核
  4. 内核初始化 → 切换保护模式 → 启动系统

理解这个完整流程对于深入学习操作系统原理和内核开发至关重要。在后续文章中,我们将继续探讨内核初始化的更多细节。

linux-insides linux-insides 项目地址: https://gitcode.com/gh_mirrors/li/linux-insides

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡寒侃Joe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值