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 ... 且系统进入登录提示,即表示烧录成功。
dtb 文件时间戳已更新,并在烧录时包含 -k kernel 或完整烧录。