内核定制
您可以手动重新构建用于 NVIDIA® Jetson™ Linux 驱动程序包 (L4T) 的内核。 需要互联网连接。
使用 Git 获取内核源代码
先决条件
• 您已安装 Git。 使用以下命令安装 Git
$ sudo apt install git-core
• 您的系统已为出站连接打开默认 Git 端口 9418。
同步内核源代码
• 通过运行 source_sync.sh 脚本获取内核源代码
$ ./source_sync.sh
当提示时,输入在发行说明中提供的“标签”名称。
您可以同步到您喜欢的任何 Linux 标签。 但是,发行说明中提供的标签将源代码同步到构建发行二进制文件所用的相同源代码修订版本。 要查看可用发行标签的列表,请使用
$ git tag -l tegra-l4t*
手动下载和解压内核源代码
作为替代方案,您可以下载内核源文件,然后手动解压它们。 如果可能,建议改为使用 git 同步。
手动下载和解压内核源代码
1. 在浏览器中,导航到
2. 找到并下载适用于您的版本的 L4T 源文件。
3. 解压 TBZ2 文件。
$ tar -xjf public_sources.tbz2
4. 解压内核源文件。
$ cd Linux_for_Tegra/source/public
$ tar –xjf kernel_src.tbz2
内核源代码被解压到 kernel 子目录中。
构建 NVIDIA 内核
按照此过程中的步骤构建 NVIDIA 内核。
先决条件
• 您已下载内核源代码。
• 您已安装内核构建过程所需的实用程序。
使用以下命令安装实用程序
$ sudo apt install build-essential bc
构建 Jetson Linux 内核
1. 使用以下命令设置 shell 变量
$ TEGRA_KERNEL_OUT=<outdir>
其中
• <outdir> 是编译后的内核的期望目标目录。
2. 如果在非 Jetson 系统上进行交叉编译,请导出以下环境变量
$ export CROSS_COMPILE=<cross_prefix>
$ export LOCALVERSION=-tegra
其中
• <cross_prefix> 是 ARM64 工具链的绝对路径,不带 gcc 后缀。 例如,对于参考 ARM64 工具链,<cross_prefix> 是
<toolchain_install_path>/bin/aarch64-linux-gnu-
注意 | NVIDIA 建议使用 Linaro 7.3.1 2018.05 工具链。 |
3. 执行以下命令以创建 .config 文件
$ cd <kernel_source>
$ mkdir -p $TEGRA_KERNEL_OUT
$ make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra_defconfig
其中
• <kernel_source> 目录包含内核源代码(例如 kernel-4.9)。
4. 执行以下命令以构建内核,包括所有 DTB 和模块
$ make ARCH=arm64 O=$TEGRA_KERNEL_OUT -j<n>
其中 <n> 指示要使用的并行进程数。 典型值是系统中的 CPU 数量。
5. 将 <release_packagep>/Linux_for_Tegra/kernel/Image 替换为以下内容的副本
$TEGRA_KERNEL_OUT/arch/arm64/boot/Image
6. 将 Linux_for_Tegra/kernel/dtb/ 的内容替换为以下内容
$TEGRA_KERNEL_OUT/arch/arm64/boot/dts/
7. 执行以下命令以安装内核模块
$ sudo make ARCH=arm64 O=$TEGRA_KERNEL_OUT modules_install \
INSTALL_MOD_PATH=<top>/Linux_for_Tegra/rootfs/
8. (可选)使用以下命令存档已安装的内核模块
$ cd <modules_install_path>
$ tar --owner root --group root -cjf kernel_supplements.tbz2 \
lib/modules
安装的模块可用于提供目标系统上 /lib/modules/<kernel_version> 的内容。
在运行 apply_binaries.sh 之前,使用该存档替换解压后的发行包的 kernel 目录中的存档
Linux_for_Tegra/kernel/kernel_supplements.tbz2
签名和加密内核、kernel-dtb 和 initrd 二进制文件
适用于:Jetson Xavier NX 系列和 Jetson AGX Xavier 系列
为了支持安全启动,kernel、kernel-dtb 和 initrd 二进制文件必须使用密钥进行签名和加密,以生成加密的二进制文件和签名文件。
准备构建外部内核模块
这些步骤描述了如何准备一组内核头文件或内核源代码树,以允许构建树外内核模块。
在 Jetson 系统上准备 L4T 内核头文件
• 在 Jetson 系统上,您可以直接使用此目录中的文件构建树外模块,而无需进一步操作
/usr/src/linux-headers-$(uname -r)-ubuntu18.04_aarch64
• 要构建树外模块,请将内核目录指定为
/usr/src/linux-headers-$(uname -r)-ubuntu18.04_aarch64
或
/lib/modules/$(uname -r)/build
在非 Jetson 系统上准备 Jetson Linux 内核头文件
• 解压以下存档并使用以下命令将其放置在本地目录中
$ cd <local_src_dir>
$ tar -xjf <top>/Linux_for_Tegra/kernel/kernel_headers.tbz2
• 您可以直接使用此目录中的文件构建树外模块,而无需进一步操作
<local_src_dir>/linux-headers-$(uname -r)-linux_x86_64
• 要构建树外模块,请将内核目录指定为
<local src dir>/linux-headers-$(uname -r)-linux_x86_64
使用手动构建的 NVIDIA 内核源代码树
• 如果您从源代码构建了 NVIDIA 内核,则在构建树外内核模块时使用相同的源代码树。 构建树外模块时,将 $TEGRA_KERNEL_OUT 指定为内核目录。
准备未构建的 NVIDIA 内核源代码树
您可以构建与 Linux 内核源代码树兼容的树外模块,而无需构建整个内核镜像。
1. 要解压内核源代码,设置任何必需的 shell 或环境变量,并创建 .config 文件,请按照以下主题中提供的说明进行操作
2. 执行以下命令以准备内核源代码树,以便构建树外内核模块
$ make ARCH=arm64 O=$TEGRA_KERNEL_OUT -j<n> modules_prepare
其中 <n> 指示要使用的并行进程数。 典型值是系统中的 CPU 数量。
构建树外模块时,将 $TEGRA_KERNEL_OUT 指定为内核目录。
构建外部内核模块
如果进行交叉编译,请确保已按照之前的章节中的描述设置 CROSS_COMPILE 环境变量。
执行以下命令以构建树外内核模块
$ cd <path_to_module_source>
$ make ARCH=arm64 –C <kernel_directory> M=$(pwd)
执行以下命令以从内核模块中剥离不需要的符号
$ <tool_chain_path>/aarch64-linux-gnu-strip -–strip-unneeded <path-of-kernel-module.ko>
如何启用 PMIC-WDT
启用 PMIC-WDT
1. 更改 ODM 数据:在 conf 文件中刷写之前,将 ODM 数据位 17:16 设置为 0b10。(这将启用 PMIC-WDT 并禁用 Tegra-WDT。)
在文件 sudo vim p2771-0000.conf.common 中,将 0x1090000 替换为 0x10a0000。
2. 输入命令
echo 0 > /sys/module/kernel/parameters/panic
3. 输入命令
cat /dev/watchdog
或
echo c > /proc/sysrq-trigger
(后一个命令会导致系统崩溃。)
4. 等待两分钟。 设备重新启动。 重新启动后,UART 日志开始出现在 mb2 日志中
[0000.203] I> pmic: reset reason (nverc) : 0x2
使用 L4T 实时内核包
适用于:仅限 Jetson AGX Xavier 系列
NVIDIA® Jetson AGX Xavier™ 系列处理器正式支持 32.5 发行版起的 NVIDIA 实时内核。 本节介绍如何通过 NVIDIA 存储库在您的系统上安装和删除 L4T 实时内核包。
先决条件
您必须将所有 L4T 软件包升级到与实时内核相同的点发行版本。
安装实时内核包
1. 在文本编辑器中打开 apt 源配置文件,例如
$ sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
2. 为 rt-kernel 仓库添加新条目
deb https://repo.download.nvidia.com/jetson/rt-kernel r<rel> main
其中 <rel> 是当前发行版本号,例如 32.6.1。
3. 输入此命令
$ sudo apt update
4. 安装实时内核包
$ sudo apt install nvidia-l4t-rt-kernel nvidia-l4t-rt-kernel-headers
5. 重启
删除实时内核包
1. 输入此命令
$ sudo apt remove nvidia-l4t-rt-kernel nvidia-l4t-rt-kernel-headers
2. 重启。
切换到不同的内核
在您的设备上安装实时内核后,您可能希望在实时内核镜像和原始通用内核镜像之间切换,而无需重新安装或删除内核包。 您可以通过编辑 /boot/extlinux/extlinux.conf 并将 DEFAULT 属性设置为指定要启动的内核来完成此操作。 将 DEFAULT 设置为 real-time 以使用实时内核,或设置为 primary 以使用通用内核。
TIMEOUT 30
DEFAULT real-time