当前位置:首页>Linux>ARM64 Linux 启动终章(上):全景复盘 ARM64 Linux 启动全貌,从上电到 PID 1

ARM64 Linux 启动终章(上):全景复盘 ARM64 Linux 启动全貌,从上电到 PID 1

  • 2026-08-19 16:41:27
ARM64 Linux 启动终章(上):全景复盘 ARM64 Linux 启动全貌,从上电到 PID 1

这是“ARM64 Linux 系统启动”专题合集总结上篇。本文沿控制权、硬件描述与地址空间三条主线,串起 BootROM、固件、Bootloader、内核早期启动、SMP、根文件系统与 PID 1。

基线:Linux 6.6.145

这份总结的目标是把启动理解成一条持续交接控制权、内存描述和硬件信息的链路,而不是若干互不相关的组件:

芯片复位 → 固件建立可信执行环境 → Bootloader 装载并传参 → Linux 建立自身地址空间与内核子系统 → 挂载根文件系统 → init 成为 PID 1 → 用户服务运行。

其中,前几个阶段主要解决“能不能安全地执行内核”;内核阶段解决“能不能管理机器资源”;用户空间阶段解决“能不能作为一个可用系统提供服务”。


1. 全景:控制权与关键信息如何一路传递

阶段
控制权所在
核心任务
交给下一阶段的关键输出
芯片上电与复位
BootROM
执行芯片固化的最小启动代码,选择启动介质
第一阶段固件镜像位置
BootROM
芯片 ROM
校验/装载初始固件,建立最小硬件状态
安全固件或 Bootloader 入口
安全固件(常见 TF-A)
EL3
初始化安全世界、DDR、PSCI 电源管理接口;通常准备从高异常级降到非安全世界
非安全世界入口、CPU 管理服务
Bootloader(常见 U-Boot)
通常 EL2 或 EL1
装载 Linux Image、DTB、可选 initramfs;组织内核命令行
x0 = DTB 物理地址
、内核入口、内存中的镜像布局
ARM64 内核早期汇编
EL2/EL1 → EL1
规范异常级、建立页表、开启 MMU、安装异常向量
可执行的内核虚拟地址空间,进入 start_kernel()
通用内核初始化
EL1
初始化内存、中断、时钟、调度、驱动模型、SMP
可运行内核线程与设备驱动环境
根文件系统准备
EL1
解包 initramfs 或挂载真正 rootfs
包含 /sbin/init 等文件的根目录
第一个用户进程
EL1 → EL0
execve
 用户态 init
PID 1 负责启动服务与维持用户空间

这里有三条必须始终同步观察的信息流:

  1. 控制流
    :当前由哪个执行体运行,下一跳入口地址是什么。
  2. 描述流
    :DTB、内核命令行、内存保留区、CPU 拓扑、设备地址等信息怎样交接。
  3. 地址空间流
    :从物理地址/无 MMU,到内核页表与虚拟地址,再到用户进程独立页表。

2. 关键概念与边界

2.1 异常级别:ARM64 的“权限楼层”

ARMv8-A 的异常级别(Exception Level,EL)可以先直观理解为硬件规定的权限楼层:

  • EL3
    :最高特权层,通常由安全固件使用,负责安全世界与非安全世界的边界。
  • EL2
    :虚拟化层;没有虚拟化需求时,内核仍可能由 Bootloader 从 EL2 进入,再自行降到 EL1。
  • EL1
    :Linux 内核运行处,能配置页表、中断、异常向量和设备驱动。
  • EL0
    :普通应用程序运行处,不能直接操作硬件控制寄存器。

Linux 的稳定目标是:

用户程序:EL0Linux 内核:EL1可选虚拟化管理:EL2安全固件:EL3

不要误解: “Linux 从 EL2 启动”不等于“Linux 最终运行在 EL2”。普通非虚拟化 ARM64 Linux 通常会确保其内核执行环境是 EL1。

本地源码的 arch/arm64/kernel/head.S 中,init_kernel_el() 会读取 CurrentEL,若当前处于 EL2,则先初始化 EL2 状态和 EL1 状态,再通过 eret 进入 EL1;若已经在 EL1,则直接建立规范 EL1 状态。见 arch/arm64/kernel/head.S:533-610

2.2 Device Tree:硬件清单,不是驱动

设备树(Device Tree,DT) 是一棵数据树,描述“板子上有什么硬件、它在哪里、如何连接”。

其二进制形式为 DTB。Bootloader 将 DTB 放进内存,并在 ARM64 Linux 启动入口通过寄存器 x0 把 DTB 的物理地址传入内核。

本地 head.S 明确声明 ARM64 Linux Image 入口要求:

  • MMU 关闭;
  • D-cache 关闭;
  • x0 = FDT blob(DTB)的物理地址

见 arch/arm64/kernel/head.S:44-54

DTB 至少会影响:

  • 内存范围:哪些物理内存可由 Linux 管理;
  • 保留内存:固件、DMA 缓冲区、initrd 等哪些范围不能误分配;
  • CPU 节点及 MPIDR:内核如何枚举多核;
  • GIC、中断号和中断控制器;
  • 串口、时钟、定时器、存储控制器;
  • /chosen
     节点中的 bootargs、initrd 起止地址等。

2.3 initramfs、根文件系统、init 与 systemd

这四个概念最容易混淆:

  • initramfs
    :内核启动早期解包到内存中的临时根文件系统。常用于加载存储驱动、解密磁盘、组 RAID、找到真正 rootfs。
  • 根文件系统(rootfs)
     :最终以 / 挂载的文件系统,例如 ext4、NFS、UBIFS、squashfs。
  • init
    :内核启动的第一个用户态进程,成功后其 PID 是 1。
  • systemd
    :一种常见的 init 实现;它不是内核,也不是必须组件。BusyBox init、SysV init 都可充当 PID 1。

Linux 不会“启动 systemd”这一固定对象;它只会尝试执行指定或约定路径下的第一个用户态程序。

在 Linux 6.6.145 中,内核按以下顺序尝试:

  1. rdinit=
     指定的 initramfs 内早期程序;
  2. init=
     指定的程序;
  3. 编译配置的 CONFIG_DEFAULT_INIT
  4. /sbin/init
  5. /etc/init
  6. /bin/init
  7. /bin/sh

若都失败,则 panic:No working init found。见 init/main.c:1493-1517


3. 启动对象关系图

下面的图回答一个问题:每层拥有何种职责,以及启动中传递的主要对象分别服务于谁。

图1:启动对象关系图

解读:

  • BootROM、TF-A、U-Boot 都不是 Linux 内核的一部分,它们负责让内核获得一个可预测的执行环境。
  • DTB 是 Bootloader 交给内核的“硬件合同”;内核据此初始化内存、CPU、GIC、串口和存储等资源。
  • rootfs 的价值不是“有一块磁盘”,而是它必须最终提供一个可被内核执行的 PID 1

4. 分阶段总结:输入、工作、输出与依赖

4.1 阶段一:上电、复位与 BootROM

输入

  • 上电复位信号;
  • 芯片熔丝、启动引脚或启动配置;
  • 启动介质上的初始镜像。

核心任务

BootROM 是芯片厂商写进 ROM 的不可修改代码。它通常只做最小且可信的事:

  • 确定从 SPI Flash、eMMC、SD、USB、网络等哪个介质启动;
  • 装载第一个可执行镜像;
  • 可能完成签名校验或镜像认证;
  • 跳转到该镜像入口。

输出

一个早期固件入口被执行。

常见误区

  • BootROM 通常无法打印 Linux 风格的串口日志。
      如果连 U-Boot banner 都没有,故障可能早于 U-Boot,必须查电源、时钟、启动模式、镜像布局和 BootROM 支持的镜像格式。
  • BootROM 的加载格式、偏移、签名方式高度依赖 SoC,不能把某块开发板的流程直接套用到另一块板。

4.2 阶段二:安全固件——以 TF-A 为代表,但并非所有平台都有相同布局

在很多 ARM64 平台上,Trusted Firmware-A(TF-A) 负责 EL3 的安全固件工作。常见镜像分层是:

  • BL1:常由 BootROM 或早期固件承担;
  • BL2:初始化 DDR、加载后续镜像;
  • BL31:EL3 运行时固件;
  • BL33:非安全世界镜像,常为 U-Boot。

输入

  • BootROM 装载的早期镜像;
  • 板级 DDR、时钟、复位、电源配置;
  • 安全启动验证信息。

核心任务

  • 初始化 DRAM,使后续大镜像和 DTB 有可用内存;
  • 划分安全/非安全内存范围;
  • 建立 EL3 下的安全状态;
  • 提供 PSCI 服务;
  • 跳转到非安全世界的 Bootloader。

PSCI 是什么,为什么重要

PSCI(Power State Coordination Interface) 可以先理解为“Linux 请求固件帮忙管理 CPU 电源状态的标准电话协议”。

Linux 在 EL1,通常不能直接可靠地把另一个 CPU 从断电状态启动。它会请求固件:

  • CPU_ON
    :启动指定物理 CPU;
  • CPU_OFF
    :关闭当前 CPU;
  • CPU_SUSPEND
    :进入低功耗状态;
  • SYSTEM_OFF
     / SYSTEM_RESET:关机或重启。

PSCI 的价值在于,Linux 不必知道每个 SoC 的具体电源控制寄存器;平台差异被固件封装。

输出

  • 已可用的 DRAM;
  • 可调用的 PSCI 服务;
  • 将控制权交给非安全世界的入口条件。

4.3 阶段三:Bootloader——以内核可启动为目标组织所有输入

Bootloader 常见为 U-Boot,但不是唯一选择。UEFI、厂商 Loader 都可能承担同样职责。

输入

  • 可访问的启动介质;
  • 内核 Image
  • DTB;
  • 可选 initramfs;
  • 内核命令行;
  • 固件已经初始化好的 DRAM。

核心任务

  1. 装载 ARM64 Linux Image 到适当物理内存;
  2. 装载 DTB;
  3. 可选装载 initramfs;
  4. 写入 /chosen/bootargs,或以平台规定方式提供命令行;
  5. 保证镜像间没有重叠;
  6. 设置进入 Linux 所需寄存器状态;
  7. 跳转到 Linux Image 的入口。

ARM64 Linux 的关键交接契约

Linux 6.6.145 的 head.S 将最关键的契约写在源码注释中:

  • 内核入口时预期:MMU 关闭、D-cache 关闭;
  • x0
     是 DTB 的物理地址。

见 arch/arm64/kernel/head.S:44-54

进入 primary_entry 后,内核立即保存启动参数。源码将 x0 存入 x21,并同时保留 x0..x3 的原始值,见 arch/arm64/kernel/head.S:161-178

这说明一个重要的定位原则:

如果 Linux 尚未打印任何 earlycon 日志,不一定是“内核没启动”;也可能是 Bootloader 的跳转状态、Image 装载地址、DTB 地址或缓存/MMU 状态违反了 ARM64 boot protocol。

必经与可选内容

通常必经:

  • 内核 Image;
  • DTB 或 ACPI 启动信息;
  • 内核命令行;
  • 正确的加载地址与跳转入口。

平台可选:

  • FIT 镜像、U-Boot bootm/booti
  • UEFI;
  • initramfs;
  • AVB、安全启动、镜像签名;
  • Hypervisor/EL2 虚拟化环境。

4.4 阶段四:ARM64 内核早期启动

这是从“Bootloader 能跳进来”变成“Linux 能用自身虚拟地址和内核 C 代码运行”的阶段。

4.4.1 primary_entry:保存参数,准备页表和 CPU

本地 Linux 6.6.145 的主 CPU 早期路径位于:

arch/arm64/kernel/head.S

核心顺序为:

primary_entry  → record_mmu_state  → preserve_boot_args  → create_idmap  → init_kernel_el  → __cpu_setup  → __primary_switch  → start_kernel

源码可见 primary_entry 在 arch/arm64/kernel/head.S:89-124

  • record_mmu_state()
    :记录 Bootloader 是否意外带着 MMU 启动;
  • preserve_boot_args()
    :保存 DTB 指针与入口参数;
  • create_idmap()
    :创建恒等映射;
  • init_kernel_el()
    :将 CPU 整理到 Linux 所需 EL1 环境;
  • __cpu_setup()
    :准备 TCR、MAIR 等 MMU 相关控制寄存器;
  • 随后切换到内核页表并进入 C 函数 start_kernel()

4.4.2 恒等映射为什么不可少

恒等映射(identity mapping,idmap) 指虚拟地址等于物理地址的临时映射。

开启 MMU 是一个“脚下地板会改变”的动作:

  • 开启前,CPU 取指地址按物理地址理解;
  • 开启后,CPU 取指地址按虚拟地址翻译;
  • 如果当前正在执行的下一条指令没有有效映射,CPU 会立即取指异常。

因此内核在一段特殊的 .idmap.text 代码中执行页表切换,使当前路径在 MMU 开启前后都能继续被正确访问。

4.4.3 MMU、TTBR 与页表的核心因果

MMU(Memory Management Unit,内存管理单元) 负责把 CPU 发出的虚拟地址翻译成物理地址,并按页表权限进行检查。

ARM64 中:

  • TTBR0_EL1
    :通常用于低地址范围的映射,早期启动中可暂用于 idmap;
  • TTBR1_EL1
    :通常承载内核高地址空间页表;
  • TCR_EL1
    :定义虚拟地址空间、页粒度等翻译规则;
  • MAIR_EL1
    :定义内存属性编码,例如普通缓存内存与设备内存;
  • SCTLR_EL1.M
    :控制 MMU 开启。

Linux 的 __enable_mmu 会写入 TTBR0_EL1 和 TTBR1_EL1,随后设置 SCTLR_EL1 以使 MMU 生效;见 arch/arm64/kernel/head.S:721-749

4.4.4 异常向量

ARM64 的异常不是 x86 的 IDT。它通过 VBAR_EL1 指向异常向量表。

主核与次级 CPU 均需要在适当时机设置:

VBAR_EL1 → vectors

次级 CPU 的路径可在 arch/arm64/kernel/head.S:657-680 看到:

  • 设置 CPU 启动模式;
  • finalise_el2()
     完成 EL2 到 EL1 的最终处理;
  • 设置 VBAR_EL1
  • 初始化当前 CPU 的 idle task;
  • 进入 secondary_start_kernel()

4.5 阶段五:start_kernel()——通用内核建立可运行环境

当 ARM64 汇编已经完成最小地址空间和 CPU 状态建设后,内核进入:

void __init __noreturn start_kernel(void)

位置:init/main.c:887

前半段:不能依赖中断和完整调度

start_kernel() 一开始明确关闭本地中断:

local_irq_disable();early_boot_irqs_disabled = true;

见 init/main.c:899-905

此时系统并不是“完全不能运行”,而是必须严格避免依赖还没初始化完成的中断、时钟、调度和驱动框架。

关键路径包括:

  1. boot_cpu_init()
    :把当前启动 CPU 标记为 boot CPU;
  2. setup_arch(&command_line)
    :进入 ARM64 架构初始化;
  3. setup_command_line()
    :处理内核命令行;
  4. setup_nr_cpu_ids()
    setup_per_cpu_areas():建立 CPU 数量和 per-CPU 区域;
  5. smp_prepare_boot_cpu()
    :准备启动 CPU;
  6. parse_early_param()
    :解析必须非常早生效的参数;
  7. mm_core_init()
    :初始化核心内存管理基础;
  8. sched_init()
    :初始化调度器基础;
  9. init_IRQ()
    tick_init()timekeeping_init()time_init():中断、tick、时间体系;
  10. local_irq_enable()
    :在可安全响应中断后开中断;
  11. console_init()
    :初始化控制台。

对应源码区间可重点阅读:

init/main.c:887-1085

setup_arch():ARM64 与设备树真正接合的地方

ARM64 的 setup_arch() 位于:

arch/arm64/kernel/setup.c:297-393

核心动作:

setup_machine_fdt(__fdt_pointer);arm64_memblock_init();paging_init();unflatten_device_tree();psci_dt_init();init_bootcpu_ops();smp_init_cpus();smp_build_mpidr_hash();

它们的因果关系是:

  1. setup_machine_fdt(__fdt_pointer)
    使用启动时保存的 DTB 指针验证和读取硬件信息。
  2. arm64_memblock_init()
    将 DTB 中的内存节点、保留内存等转换为早期内存管理器 memblock 的记录。memblock 可以理解为“伙伴系统尚未就绪前,内核使用的简化物理内存账本”。
  3. paging_init()
    建立更完整的内核页表与线性映射,为后续的常规内存管理做准备。
  4. unflatten_device_tree()
    将扁平二进制 DTB 转换为内核中的设备树节点结构,供 OF(Open Firmware)框架和驱动匹配使用。
  5. psci_dt_init()
    从 DT 的 /psci 节点解析 PSCI 调用方式,如 SMC 或 HVC。
  6. smp_init_cpus()
     与 smp_build_mpidr_hash()根据 DT 描述的 CPU 节点建立 Linux 逻辑 CPU 编号与硬件 MPIDR 的映射。

注意:若系统采用 ACPI 而非 DT,路径会转向 ACPI 的表解析;本地源码中也明确根据 acpi_disabled 分支选择 psci_dt_init() 或 psci_acpi_init(),见 arch/arm64/kernel/setup.c:369-376


4.6 阶段六:PSCI、SMP 与次级 CPU online

多核启动的核心问题是:

主核已经进入 Linux 后,如何让尚未运行的物理 CPU 获得正确入口、页表、栈和调度上下文,并被安全标记为 online?

4.6.1 逻辑 CPU 与物理 CPU

Linux 中的 CPU0CPU1 是逻辑编号;硬件通过 MPIDR 标识 CPU 的层级拓扑身份。

DT 中 CPU 节点提供硬件标识,内核建立:

逻辑 CPU 编号 ↔ MPIDR 硬件标识 ↔ CPU 启动操作

本地 setup_arch() 在解析 CPU 后调用:

smp_init_cpus();smp_build_mpidr_hash();

见 arch/arm64/kernel/setup.c:374-376

4.6.2 启动次级 CPU 的完整因果链

通用内核走到 kernel_init_freeable() 后,开始允许 SMP 完整上线:

smp_prepare_cpus(setup_max_cpus);smp_init();sched_init_smp();

见 init/main.c:1547-1559

对单个次级 CPU,ARM64 关键路径为:

CPU online 请求  → __cpu_up()  → secondary_data.task = idle  → update_cpu_boot_status(CPU_MMU_OFF)  → boot_secondary()  → CPU 操作集 cpu_boot()  → 平台 PSCI CPU_ON  → 次级 CPU 从固件给定入口开始执行  → secondary_entry / secondary_holding_pen  → __cpu_setup()  → __enable_mmu()  → __secondary_switched  → secondary_start_kernel()  → CPU 标记 online

__cpu_up() 的源码在 arch/arm64/kernel/smp.c:112-174

  • 先把次级 CPU 应使用的 idle 任务栈保存在 secondary_data.task
  • 标记启动状态为 CPU_MMU_OFF
  • 调用 boot_secondary()
  • 最多等待 5 秒;
  • 若 CPU 没有 online,则读取 secondary_data.status 和 __early_cpu_boot_status 判断卡在哪个早期状态。

这是很实用的故障定位设计:主 CPU 并非只能得到“次核没起来”,还能区分“MMU 未打开”“不支持页粒度”“不支持 52 位 VA”等早期失败原因。

4.6.3 次级 CPU 的两类入口

head.S 有两种次级 CPU 入口语义:

  1. secondary_holding_pen
    用于某些平台让次核先在 holding pen 等待。它不断比对 secondary_holding_pen_release,未轮到自己就执行 wfe 低功耗等待。见 arch/arm64/kernel/head.S:612-628
  2. secondary_entry
    用于 CPU 被内核动态带起的场景。它直接初始化 EL 状态,再进入共同的 secondary_startup。见 arch/arm64/kernel/head.S:630-655

无论从哪条入口进入,最终都要完成:

  • CPU 特性和控制寄存器设置;
  • 内核页表与 idmap 页表准备;
  • 开启 MMU;
  • 设置 VBAR_EL1
  • 建立当前 CPU 的内核任务上下文;
  • 调用 secondary_start_kernel()

4.6.4 CPU hotplug 的本质

CPU hotplug 是运行中 CPU 的上线和下线机制,不只是“启动阶段多核初始化”。

  • online
    :把一个 CPU 从离线状态带入 Linux 调度和中断体系;
  • offline
    :迁移任务、中断和 per-CPU 工作,停止 CPU,并常通过 PSCI CPU_OFF 让其进入低功耗状态。

启动阶段的 CPU bring-up 与运行时 hotplug 共享许多低层机制,例如 CPU operation、PSCI、页表与次级入口;但运行时 hotplug 还要面对任务迁移、CPUHP 状态机和资源回收问题。


5. 主路径流程图

这张图回答:从复位到 PID 1 的必经控制路径是什么,在哪些位置会发生关键状态切换。

图2:主路径流程图

解读:

  • 开启 MMU
     是内核早期最危险的转折点:页表、执行地址、缓存与屏障必须一致。
  • 解析 DTB
     早于大部分设备驱动初始化,因为没有硬件资源描述,驱动无法正确匹配和获得寄存器、中断、时钟等资源。
  • 执行 init
     是内核到用户空间的边界;它不是一次普通 fork,而是内核第一次通过 kernel_execve() 启动用户态程序。

6. 时序图:一次成功启动中各层如何交接

图3:固件、Bootloader 与主 CPU 的启动交接
图4:主 CPU、次级 CPU 与用户空间的启动交接

解读:

  • 固件和内核之间的 PSCI 调用不是普通函数调用,而是跨异常级的服务请求,底层可能通过 SMC 或 HVC 指令完成。
  • 次级 CPU 的“启动成功”不是固件返回成功就结束,而是必须经过内核早期汇编、MMU 启用、C 级初始化,并最终被 Linux 标记为 online。
  • init 的成功表示内核已经完成“把机器带起来”的职责;之后系统策略,例如网络服务、挂载额外文件系统、图形界面,主要由用户空间负责。

7. 从 start_kernel() 到用户态 init 的关键阶段

7.1 rest_init():首次建立内核线程与 PID 1 的执行上下文

start_kernel() 完成核心初始化后调用 arch_call_rest_init();默认实现直接进入 rest_init(),见:

init/main.c:838-841init/main.c:1084-1085

rest_init() 位于 init/main.c:698 附近,其核心角色是:

  • 创建 kernel_init,它将成为最终负责准备 rootfs 并执行 init 的内核线程;
  • 创建 kthreadd,内核线程管理者;
  • 当前启动线程最终成为 idle 任务。

7.2 kernel_init_freeable():让系统具备“运行完整初始化”的条件

在 init/main.c:1535-1590,关键顺序是:

smp_prepare_cpus(setup_max_cpus);workqueue_init();smp_init();sched_init_smp();do_basic_setup();wait_for_initramfs();console_on_rootfs();prepare_namespace();

其意义:

  • smp_prepare_cpus()
     / smp_init():准备和拉起次级 CPU;
  • workqueue_init()
    :工作队列可真正开始处理异步内核工作;
  • do_basic_setup()
    :初始化驱动核心,并按 initcall 等级调用内建驱动初始化函数;
  • wait_for_initramfs()
    :确保 initramfs 解包完成;
  • prepare_namespace()
    :在没有早期 initramfs init 时,准备并挂载最终 rootfs;
  • console_on_rootfs()
    :打开 /dev/console 并将其复制为 init 的标准输入、输出、错误输出。

7.3 initcall:内建驱动为什么不是随意初始化

内核把大量初始化函数分成层级:

early → pure → core → postcore → arch → subsys → fs → device → late

Linux 6.6.145 中,do_initcalls() 顺序执行这些层级,见 init/main.c:1269-1331do_basic_setup() 执行 driver_init() 和 do_initcalls(),见 init/main.c:1340-1347

这不是装饰性的分类。它表达依赖关系,例如:

  • 基础内存、总线和驱动核心必须先于具体设备驱动;
  • 文件系统支持必须在最终根文件系统挂载之前准备;
  • 某些依赖其他框架的设备驱动必须更晚初始化。

启动定位中可加:

initcall_debug

内核会输出每个 initcall 的调用与耗时,有助于定位“启动卡在某个内建驱动”的问题。


8. 启动状态图

这张图回答:系统何时真正从“不可用”跨越到“可调度、可挂载、可运行用户程序”。

图5:启动状态图

解读:

  • “内核解压成功”不代表 Linux 已可用;在 ARM64 raw Image 流程中,重点是入口状态、页表切换和 start_kernel() 早期初始化。
  • “看到了内核 banner”不代表 rootfs 成功;rootfs、init 和用户服务是之后的独立阶段。
  • “CPU1 没上线”也不一定表示内核整体失败;它通常属于 SMP bring-up 或 PSCI/CPU DT 描述问题。

上篇小结

从芯片复位到 PID 1,启动的本质是逐层建立下一阶段所需的最小运行前提:固件提供可信执行环境,Bootloader 完成镜像与参数交接,内核建立地址空间并初始化资源,最终由 init 接管用户空间。下篇将转向实战:如何识别启动产物、依据最后一条日志划分故障边界,并用 QEMU 验证关键路径。

我是熊树先生,持续记录 Linux 内核、嵌入式系统与底层技术学习,分享内核源码分析、驱动开发和系统软件实践。

如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 13:36:46 HTTP/2.0 GET : https://f.mffb.com.cn/a/510521.html
  2. 运行时间 : 0.137605s [ 吞吐率:7.27req/s ] 内存消耗:4,670.31kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9b79e8735c9b73a9b12c6bf9e2e602e7
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000587s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000833s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000306s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000271s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000538s ]
  6. SELECT * FROM `set` [ RunTime:0.000243s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000521s ]
  8. SELECT * FROM `article` WHERE `id` = 510521 LIMIT 1 [ RunTime:0.000648s ]
  9. UPDATE `article` SET `lasttime` = 1787290606 WHERE `id` = 510521 [ RunTime:0.027732s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.017115s ]
  11. SELECT * FROM `article` WHERE `id` < 510521 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002109s ]
  12. SELECT * FROM `article` WHERE `id` > 510521 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.009085s ]
  13. SELECT * FROM `article` WHERE `id` < 510521 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001265s ]
  14. SELECT * FROM `article` WHERE `id` < 510521 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.008328s ]
  15. SELECT * FROM `article` WHERE `id` < 510521 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000829s ]
0.139134s