2. Jetson硬件架构与启动链路

Jetson不是一块“带GPU的树莓派”,而是一颗完整的Tegra SoC加上外围电源、内存、存储与接口的嵌入式系统。理解它的硬件架构与启动链路,是后续做设备树裁剪、驱动适配和启动优化的前提。本节以Orin系列(如Jetson Orin Nano/NX)为主线,同时兼顾Xavier与Nano的共性,讲清SoC内部组成、计算单元分工、内存与存储布局,以及从BootROM到内核的完整启动流程。

一、Tegra SoC内部组成与计算单元分工

Tegra SoC把CPU、GPU、多种加速器、内存控制器、显示与视频编解码、外设控制器集成在一颗芯片内。以Orin为例,主要计算单元及其职责如下:

  • CPU集群:Orin采用Arm Cortex-A78AE核心,通常为12核(3个四核簇),负责通用控制、Linux内核与用户态逻辑。Cortex-A78AE中的“AE”表示支持锁步(Split-Lock)模式,可满足功能安全场景。
  • GPU:基于NVIDIA Ampere架构,含CUDA核心与Tensor Core,承担并行计算、深度学习推理与图形渲染。它是Jetson区别于普通Arm板的核心资源。
  • DLA(Deep Learning Accelerator):专用深度学习加速器,Orin上通常有2个,擅长INT8/FP16卷积类推理,功耗效率高于GPU,适合常驻的推理任务。
  • PVA(Programmable Vision Accelerator):可编程视觉加速器,面向图像预处理、光流、特征提取等视觉流水线,可分担CPU与GPU的像素级工作。
  • VIC(Video Image Compositor):视频图像合成器,负责缩放、色彩空间转换、旋转、图层合成,是摄像头到显示链路中的关键硬件模块。
  • NVENC/NVDEC:硬件视频编解码单元,处理H.264/H.265等码流,降低CPU占用。

这些单元并非各自独立,而是通过内存控制器与互连总线共享LPDDR内存。理解“谁负责什么”,才能在性能调优时把任务放到正确的单元上:例如把YOLO推理交给DLA或GPU,把图像缩放交给VIC,把视频解码交给NVDEC,而不是全部压在CPU上。

Tegra SoC 内部组成与计算单元分工 CPU 集群 Cortex-A78AE ×12 通用控制 / Linux内核 支持锁步安全模式 GPU Ampere 架构 CUDA / Tensor Core 并行计算 / 推理 / 渲染 专用加速器 DLA ×2:INT8/FP16 推理 PVA:视觉预处理 VIC:缩放/色彩/合成 互连总线 / 内存控制器(共享 LPDDR5 带宽) LPDDR5 内存 与 GPU 共享,非独立显存 容量决定可加载模型规模 存储与外设 QSPI NOR:BootROM/MB1 eMMC / NVMe:根文件系统 任务分配原则: 推理 → DLA/GPU 图像缩放与色彩转换 → VIC 视频编解码 → NVDEC/NVENC 通用逻辑 → CPU 所有单元共享同一 LPDDR 带宽,带宽是性能瓶颈的关键约束

二、内存与存储布局

Jetson的内存布局有两个容易混淆的点。第一,GPU没有独立显存,CPU与GPU共享同一块LPDDR。这意味着模型权重、输入图像、中间特征图都占用同一带宽池,做大分辨率多路视频推理时,带宽往往先于算力成为瓶颈。第二,启动介质与根文件系统介质可以不同:BootROM和早期固件通常放在QSPI NOR Flash中,而根文件系统放在eMMC或NVMe SSD上。

以Orin Nano 8GB为例,典型布局可理解为:

区域典型介质内容
BootROMSoC内部ROM固化代码,不可修改,负责最早期引导
MB1 / MB2QSPI NORBootROM加载的第一、二级引导固件
UEFI / 设备树QSPI NOR平台初始化、传递设备树给内核
内核与根文件系统eMMC / NVMeLinux内核镜像、根文件系统、应用

实际开发中,用lsblk可以看到mmcblk0(eMMC)或nvme0n1(NVMe)作为根设备;用cat /proc/meminfo可确认可用内存。若使用NVMe启动,需要在UEFI阶段正确识别PCIe设备,这依赖设备树中PCIe控制器的描述是否完整。

三、BootROM → MB1 → UEFI → 内核的启动流程

Jetson的启动是一条严格分级的信任链,每一级负责初始化一部分硬件,再把控制权交给下一级。

  1. BootROM:SoC上电后首先执行固化在芯片内的BootROM。它读取启动介质选择引脚(或eFuse配置),从QSPI NOR中加载MB1。BootROM代码不可修改,是信任根。
  2. MB1(MicroBoot1):运行在BPMP(Boot and Power Management Processor)上,负责初始化时钟、电源、DDR内存控制器等最底层硬件。DDR训练成功后,内存才可用。MB1随后加载MB2。
  3. MB2:继续初始化更多外设,并加载UEFI固件。
  4. UEFI:提供标准UEFI启动环境,初始化PCIe、USB、显示等,读取启动项,加载Linux内核镜像(Image)和设备树(DTB),并把设备树地址通过寄存器传给内核。
  5. 内核:解压并启动,解析设备树,注册平台设备,挂载根文件系统,最终启动用户态init。

这条链路中,任何一级失败都会导致启动停在早期阶段。例如DDR训练失败会表现为无串口输出;UEFI找不到启动项会停在UEFI菜单;内核找不到根文件系统会报VFS: Unable to mount root fs。定位时先看串口日志停在哪一级,再针对性排查。

四、设备树在启动中的作用

设备树(Device Tree)是内核与硬件之间的“硬件说明书”。在Jetson上,UEFI把DTB加载到内存并传给内核,内核据此知道有哪些CPU、内存地址范围、GPIO控制器、I2C总线、PCIe控制器、摄像头接口等。没有正确的设备树,内核即使启动也无法驱动外设。

设备树源文件(.dts/.dtsi)编译为二进制DTB。Jetson的DTB通常位于/boot/dtb/下,例如tegra234-p3767-0000-p3768-0000-a0.dtb。修改设备树后需要重新编译并更新到启动分区。一个典型的节点片段如下:

/* 示例:启用某个I2C控制器并挂载传感器 */
&i2c1 {
    status = "okay";
    clock-frequency = <400000>;
    imx219: camera@10 {
        compatible = "sony,imx219";
        reg = <0x10>;
        status = "okay";
    };
};

这段配置的含义是:把i2c1控制器状态设为okay(启用),总线频率400kHz,并在地址0x10上挂载一个compatible为sony,imx219的摄像头。内核启动时会根据compatible匹配驱动,匹配成功则probe,摄像头节点出现在/dev或V4L2子系统中。若compatible写错或status为disabled,驱动不会加载,表现为设备节点缺失。

设备树调试的常用手段:用dtc -I dtb -O dts反编译DTB查看实际生效内容;用ls /proc/device-tree/查看内核解析后的设备树;用dmesg | grep -i i2c确认控制器是否注册成功。
修改设备树前务必备份原始DTB,并保留串口调试通道。错误的设备树可能导致内核在早期panic,此时只能通过恢复模式重新烧录。

把以上内容串起来看:Tegra SoC提供算力单元,内存与存储决定资源边界,启动链路保证系统从信任根逐级走到内核,设备树则把板级硬件差异描述给内核。四者共同构成Jetson硬件适配的基础。后续做摄像头、PCIe、显示等外设适配时,本质上都是在正确的位置修改设备树,并验证启动链路中对应阶段是否成功。