本文主要基于 JetPack 源码进行内核编译,也可以下载制定版本的内核源码进行编译,具体方法参照“Specific Version Source”部分.
- 在 Nvidia 下载中心下载与内核版本对应的工具链(GCC 6.4.1 Tool Chain for 64-bit Kernel),下载后解压到~/nVIDIA/toolchain 目录下。
- 设置环境变量
- 获取源码,在~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra 目录下运行./source_sync.sh 下载源码到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources,在该目录下会出现 kernel 文件夹,便是下载的内核代码。 参考文章 1,参考文章 2
Kernel 编译
添加环境变量
export KERNEL_OUT=~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources/kernel/kernel-4.9/build
export KERNEL_MODULES_OUT=~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/rootfs
编译配置文件 (Create the .config file)
在~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources/kernel/kernel-4.9 目录下输入:
make ARCH=arm64 O=$KERNEL_OUT tegra_defconfig
编译内核和设备树 (Build the kernel and DTBs)
在当前目录下继续执行:
make ARCH=arm64 O=$KERNEL_OUT CROSS_COMPILE=${CROSS_COMPILE} -j4
开始编译,编译时间与主机的配置有关,不同机器编译时间也不一样,以我的 i3 笔记本为例 4G 内存,Ubuntu16.04 系统,编译大概 30 分钟左右。
加载模块 (Install modules in temporal location)
在当前目录下继续执行:
sudo make modules_install ARCH=arm64 O=$KERNEL_OUT CROSS_COMPILE=${CROSS_COMPILE} INSTALL_MOD_PATH=$KERNEL_MODULES_OUT
备份当前镜像 (Make a backup of the current image)
把当前的镜像备份成:文件名 + 日期时间的格式.
mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/Image{,.date "+%Y_%m_%d_%H_%M_%S"
}
mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/zImage{,.date "+%Y_ %m_%d_%H_%M_%S"
}
mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/kernel_supplements.tbz2{,.date "+%Y_%m_%d_%H_%M_%S"
}
mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/dtb{,.date "+%Y_%m_%d_%H_%M_%S"
}
但是实际我的目录下并没有 zImage 这个文件。
部署二进制文件 (Deploy binarier in their required locations)
进入到编译输出目录:
cd $KERNEL_OUT
进入到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources/kernel/kernel-4.9/build$ 目录下。
执行复制命令,拷贝二进制文件。
cp ./arch/arm64/boot/Image ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/
cp ./arch/arm64/boot/zImage ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/
cp -r ./arch/arm64/boot/dts ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/
重新生成内核模块追加文件 (Regenerate kernel modules supplement file)
切换到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/rootfs 目录
cd $KERNEL_MODULES_OUT
执行如下命令:
tar –owner root –group root -cjf ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegro/kernel/kernel_supplements.tbz2 lib/modules
生成 JetPack 映像 (Generate JetPack image)
切换到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/目录下,执行如下命令:
cd ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra
sudo ./apply_binaries.sh