上一篇讲了在jetson平台上编译内核,本篇讲在x86 PC上编译
这里提一点,我并不建议你用虚拟机来搞Linux开发,你的host至少应该是个ubuntu+windows双系统,虚拟机可能有各种问题,不要浪费时间在这些没有意义的问题上,可能会影响到你搞正事的情绪。
- 配置交叉编译环境
请查看第10篇博文
玩转NVIDIA Jetson AGX Xavier(10)— L4T内核kernel编译之Linaro 交叉编译环境搭建 - 下载内核源码
官网上有通过git获取源码的方式,这里我不建议这么做,直接到网站上下载更好。
打开NVIDIA Jetson的下载中心
https://developer.nvidia.com/embedded/downloads
进入下载中心后确认一下版本和产品,32.1,JAX and TX2。
这个版本一定要和你手上的Jetson上运行的版本一致,不然会搞挂你jetson上的系统。
以后的新版本源码下载也是如此,版本号和产品务必对应。 - 解压源码
把下载好的文件拷到一个位置,我建议新建一个存放源码的文件夹,并且固定下来不要移动
在新建目录下,解压第一层文件,下载的文件不一样文件名也不一样
tar -xjf JAX-TX2-public_sources.tbz2
第一层解压之后会出现一个public_sources的文件夹,继续解压第二层文件
tar -xjf public_sources/kernel_src.tbz2
解压完这层以后,目录下会出现kernel的文件夹,这个就是源码了。打开kernel会看到kernel-4.9 nvgpu nvidia三个文件,kernel-4.9是Linux4.9的源码。
注意:后边所有的步骤要在一个terminal下完成!不要打开多个命令窗
- 配置.config文件
设置编译输出路径,我在这里用的是 /home/xavier/kernel 随便搞一个就行
这个目录将会存储你从kernel编译出来的所有内容
TKOUT=/home/gaosiy/okernel
检查一下路径设置的对不对,注意下面代码里的$是要写上的
$TKOUT
会显示TKOUT=/home/gaosiy/okernel is a directory,意味着你的路径设置成功了,其实这个主要是为了后边写make参数时更方便,所以用变量代替。
打开源码路径
cd /home/gaosiy/kernel/kernel-4.9
确认一下编译输出路径
sudo mkdir -p $TKOUT
配置.config文件
sudo make ARCH=arm64 O=$TKOUT tegra_defconfig
成功后会提示你生成了.config文件。
注意,tegra_defconfig在每个版本或者每个产品里叫法都不一样,TX2好像是tegra18_defconfig
- 配置交叉编译变量
如果安装好了交叉编译工具,直接设置环境变量,这个变量只在一个terminal下有效,有保质期
export CROSS_COMPILE=/home/gaosiy/l4t-gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
查看设置的变量对不对
export | grep CROSS_COMPILE
输出的应该跟你上边设置的是一样的
这里再说一句,熟练运用|grep在输出结果中定位关键字非常重要,各位加油
- 编译内核
这里与在jetson上编译有很大不同,还是在kernel-4.9的目录下,使用
sudo make ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILE O=$TKOUT -j4
j4是选择用几个核进行编译,Xavier有4个核,如何查询核的数量可以看我的前边的一篇jetson常用命令的博文。
这里多输入了一个编译参数CROSS_COMPILE,这个参数如果不输入,将会默认使用本机的架构来进行编译,x86的编译器不认arm的很多变量,所以基本上刚跑起来就会因为变量报错而停止。