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上。
二、内存与存储布局
Jetson的内存布局有两个容易混淆的点。第一,GPU没有独立显存,CPU与GPU共享同一块LPDDR。这意味着模型权重、输入图像、中间特征图都占用同一带宽池,做大分辨率多路视频推理时,带宽往往先于算力成为瓶颈。第二,启动介质与根文件系统介质可以不同:BootROM和早期固件通常放在QSPI NOR Flash中,而根文件系统放在eMMC或NVMe SSD上。
以Orin Nano 8GB为例,典型布局可理解为:
| 区域 | 典型介质 | 内容 |
|---|---|---|
| BootROM | SoC内部ROM | 固化代码,不可修改,负责最早期引导 |
| MB1 / MB2 | QSPI NOR | BootROM加载的第一、二级引导固件 |
| UEFI / 设备树 | QSPI NOR | 平台初始化、传递设备树给内核 |
| 内核与根文件系统 | eMMC / NVMe | Linux内核镜像、根文件系统、应用 |
实际开发中,用lsblk可以看到mmcblk0(eMMC)或nvme0n1(NVMe)作为根设备;用cat /proc/meminfo可确认可用内存。若使用NVMe启动,需要在UEFI阶段正确识别PCIe设备,这依赖设备树中PCIe控制器的描述是否完整。
三、BootROM → MB1 → UEFI → 内核的启动流程
Jetson的启动是一条严格分级的信任链,每一级负责初始化一部分硬件,再把控制权交给下一级。
- BootROM:SoC上电后首先执行固化在芯片内的BootROM。它读取启动介质选择引脚(或eFuse配置),从QSPI NOR中加载MB1。BootROM代码不可修改,是信任根。
- MB1(MicroBoot1):运行在BPMP(Boot and Power Management Processor)上,负责初始化时钟、电源、DDR内存控制器等最底层硬件。DDR训练成功后,内存才可用。MB1随后加载MB2。
- MB2:继续初始化更多外设,并加载UEFI固件。
- UEFI:提供标准UEFI启动环境,初始化PCIe、USB、显示等,读取启动项,加载Linux内核镜像(Image)和设备树(DTB),并把设备树地址通过寄存器传给内核。
- 内核:解压并启动,解析设备树,注册平台设备,挂载根文件系统,最终启动用户态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确认控制器是否注册成功。
把以上内容串起来看:Tegra SoC提供算力单元,内存与存储决定资源边界,启动链路保证系统从信任根逐级走到内核,设备树则把板级硬件差异描述给内核。四者共同构成Jetson硬件适配的基础。后续做摄像头、PCIe、显示等外设适配时,本质上都是在正确的位置修改设备树,并验证启动链路中对应阶段是否成功。