Linux内核分析之基础知识-4
第4章:ARM64 启动流程
从 EL3 到 Linux 内核的旅程
本章概述
ARM64 (AArch64) 的启动流程与 x86_64 有显著差异。本章详细讲解 ARM64 特有的启动机制,包括异常级别、设备树和 ATF。
ARM64 启动方式对比
| 启动方式 | 引导程序 | 典型设备 | 参数传递 |
|---|---|---|---|
| UEFI | UEFI 固件 → GRUB | 服务器、工控 | 设备树/ACPI |
| ATF | ATF → U-Boot | 嵌入式 | 设备树 |
| 直接引导 | U-Boot/RPi Boot | 树莓派等 | 设备树 |
| kexec | 运行中内核 | 热重启 | 自定义 |
4.1 ARM64 架构基础
4.1.1 异常级别 (Exception Levels)
ARM64 定义了 4 个异常级别 (EL),从 EL0 到 EL3:
1 | ┌─────────────────────────────────────────────────────────────┐ |
4.1.2 CPU 模式和寄存器
1 | /* CurrentEL 寄存器值 */ |
4.1.3 ARM64 内存模型
1 | ARM64 VMSA (虚拟内存系统架构): |
4.2 ARM64 启动规范
4.2.1 Boot Protocol 要求
Linux ARM64 内核对启动状态的要求:
1 | /* Documentation/arm64/booting.txt */ |
4.2.2 设备树传递
1 | /* 设备树 blob (DTB) 格式 */ |
4.3 内核入口:primary_entry
4.3.1 内核镜像头部
1 | /* arch/arm64/kernel/head.S */ |
4.3.2 primary_entry 完整流程
1 | /* arch/arm64/kernel/head.S */ |
4.4 MMU 初始化
4.4.1 record_mmu_state
1 | /* 记录当前 MMU 状态 */ |
4.4.2 __cpu_setup
1 | /* CPU 初始化 - 设置系统控制寄存器 */ |
4.4.3 init_kernel_el
1 | /* 异常级别初始化 */ |
4.5 __primary_switch
4.5.1 启用 MMU 并切换
1 | /* 主切换代码 - 启用 MMU 并跳转到虚拟地址 */ |
4.6 设备树处理
4.6.1 setup_machine_fdt
1 | /* arch/arm64/kernel/setup.c */ |
4.6.2 unflatten_device_tree
1 | /* drivers/of/fdt.c */ |
4.7 ARM64 内存初始化
4.7.1 arm64_memblock_init
1 | /* arch/arm64/kernel/setup.c */ |
4.7.2 paging_init
1 | /* arch/arm64/mm/mmu.c */ |
4.8 ARM64 启动总结
4.8.1 完整启动流程
1 | ┌─────────────────────────────────────────────────────────────┐ |
4.8.2 ARM64 vs x86_64 启动对比
| 方面 | ARM64 | x86_64 |
|---|---|---|
| 入口点 | primary_entry | startup_32/startup_64 |
| 首先执行 | 汇编代码 | 实模式 C 代码 |
| 模式切换 | EL3/EL2 → EL1 | Real → Protected → Long |
| 参数传递 | x0 (DTB) | boot_params 结构 |
| 页表初始化 | C 代码中设置 | 汇编代码中设置 |
| MMU 启用 | __enable_mmu | cr4_set_pg/cr3_write |
| 设备发现 | 设备树 | ACPI/e820 |
- Title: Linux内核分析之基础知识-4
- Author: 韩乔落
- Created at : 2026-01-08 02:46:57
- Updated at : 2026-01-19 13:40:51
- Link: https://jelasin.github.io/2026/01/08/Linux内核分析之基础知识-4/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments