4. Jetson Linux源码获取与编译体系

Jetson 平台的 Linux 系统并非单一内核,而是由 NVIDIA 提供的 L4T(Linux for Tegra)源码包统一组织,包含 U-Boot、Linux 内核、设备树、根文件系统以及 flash 烧录工具。理解这套源码包的目录结构,是后续交叉编译、内核裁剪、设备树适配和定制烧录的前提。本节围绕“源码从哪来、工具链怎么配、各组件怎么编、镜像怎么烧”这条主线展开。

一、L4T 源码包结构与获取

NVIDIA 将 Jetson 的 BSP 拆分为两类资源:一类是 Driver Package(驱动包,含预编译内核、U-Boot、根文件系统与 flash 工具),另一类是 Sample Root Filesystem(示例根文件系统)。要自行编译,还需下载 L4T Sources 源码包。以 Jetson Orin Nano(L4T R36.x)为例,典型目录如下:

Linux_for_Tegra/          # 驱动包主体
├── kernel/               # 内核与设备树源码(解压 L4T Sources 后)
│   ├── kernel-5.10/      # 内核源码
│   ├── hardware/nvidia/  # 设备树源文件
│   └── dtb/              # 编译产物
├── bootloader/           # U-Boot、引导固件
├── rootfs/               # 根文件系统挂载点
├── tools/                # 烧录与镜像工具
└── flash.sh              # 烧录脚本

获取流程通常是:从 NVIDIA 官网下载对应版本的 Driver Package 与 Sample Root Filesystem,解压后执行 apply_binaries.sh 将驱动二进制注入根文件系统;再单独下载 L4T Sources 并解压到 kernel/ 目录。版本必须严格对应,例如 R36.3.0 的驱动包只能搭配同版本源码,否则内核与固件接口不匹配会导致启动失败。

二、交叉编译工具链配置

Jetson 是 aarch64 架构,而开发主机通常是 x86_64,因此必须使用交叉编译工具链。NVIDIA 推荐使用 Bootlin 工具链(aarch64--glibc--stable)或 Linaro 工具链。配置的核心是让编译系统找到 aarch64-linux-gnu- 前缀的编译器。

export CROSS_COMPILE=/opt/toolchains/aarch64--glibc--stable/bin/aarch64-linux-gnu-
export ARCH=arm64
export LOCALVERSION=-tegra

其中 LOCALVERSION=-tegra 用于给内核版本号追加后缀,避免与通用内核混淆。验证工具链是否可用:

${CROSS_COMPILE}gcc --version

若输出 aarch64 版本信息,说明工具链就绪。注意:编译内核与 U-Boot 使用同一套工具链即可,但根文件系统制作阶段若需编译用户态程序,也应保持 ABI 一致。

三、内核与设备树编译

进入 kernel/kernel-5.10 目录后,先加载 Jetson 默认配置,再按需裁剪:

make ARCH=arm64 O=$PWD/../build defconfig
make ARCH=arm64 O=$PWD/../build menuconfig   # 可选裁剪
make ARCH=arm64 O=$PWD/../build -j$(nproc) Image dtbs modules

编译产物中,Image 是内核镜像,arch/arm64/boot/dts/ 下生成 .dtb 设备树文件。设备树是 Jetson 硬件适配的关键:Orin Nano 的板级设备树通常为 tegra234-p3767-0000-p3768-0000-a0.dtb,修改引脚复用、外设节点后需重新编译并替换。判断编译是否成功,可检查 Image 文件大小是否合理(通常几十 MB),以及 dtbs 是否生成对应板卡文件。

四、U-Boot 编译

U-Boot 位于 bootloader/ 目录,负责引导内核。Jetson 的 U-Boot 已由 NVIDIA 适配,编译方式为:

cd bootloader
make ARCH=arm64 CROSS_COMPILE=${CROSS_COMPILE} \
     tegra234_defconfig
make ARCH=arm64 CROSS_COMPILE=${CROSS_COMPILE} -j$(nproc)

生成的 u-boot.bin 与 u-boot.dtb 会被 flash 脚本打包进引导分区。若修改了启动参数(如 bootargs 中的根文件系统路径),需同步更新 U-Boot 环境变量或设备树 chosen 节点。

五、根文件系统制作

根文件系统基于 Sample Root Filesystem 构建。解压后执行:

sudo ./apply_binaries.sh

该脚本将 NVIDIA 驱动、CUDA 库、固件等注入 rootfs/。若需精简,可删除不需要的示例包;若需添加自研应用,直接拷贝到 rootfs/usr/local/bin/ 并设置权限。最终根文件系统会被打包为 system.img,由 flash 脚本写入 eMMC 或 NVMe。

六、flash.sh 烧录脚本参数解析与定制

flash.sh 是烧录入口,核心参数决定目标板卡、存储介质与烧录范围:

sudo ./flash.sh <board> <rootdev>
# 示例:烧录到 Orin Nano 的 NVMe
sudo ./flash.sh jetson-orin-nano-devkit nvme0n1p1

常用参数包括:-k 指定只烧录某分区(如 -k kernel 仅更新内核),-r 跳过根文件系统重建,-S 指定 system.img 大小。定制烧录时,可修改 flash.sh 中引用的 board.conf 与分区表 *.xml,调整分区布局或添加自定义分区。烧录完成后,串口日志出现 Starting kernel ... 且系统进入登录提示,即表示烧录成功。

Jetson L4T 源码编译与烧录体系 源码获取 Driver Package Sample RootFS + L4T Sources 交叉编译工具链 aarch64-linux-gnu- ARCH=arm64 编译产物 Image / dtb / u-boot.bin system.img 编译流程 内核编译 make Image dtbs 设备树编译 tegra234-*.dtb U-Boot编译 u-boot.bin 根文件系统 apply_binaries.sh flash.sh 烧录 board 参数 jetson-orin-nano-devkit rootdev 参数 nvme0n1p1 / mmcblk0p1 -k kernel / -r / -S 分区烧录 / 跳过重建 / 镜像大小 串口日志:Starting kernel ... → 登录提示
版本一致性是 Jetson 编译的第一原则:Driver Package、L4T Sources、Sample RootFS 三者版本号必须完全一致,否则会出现内核模块加载失败或设备树不匹配。建议在项目初期就固定版本并记录在案。
修改设备树后若未重新编译并替换 dtb,烧录后仍会使用旧硬件配置,表现为外设不工作或引脚功能异常。每次改动后应确认 dtb 文件时间戳已更新,并在烧录时包含 -k kernel 或完整烧录。