编译内核,就要有内核源码,可以从不同官网下载内核源码,有的硬件厂商针对自己开发板,也提供了一些修改了的内核源码。这次要编译的内核针对NXP i.MX 7 计算机模块 - Colibri iMX7。
https://www.toradex.cn/computer-on-modules/colibri-arm-family/nxp-freescale-imx7
ARM硬件:Colibri iMX7
操作系统:Ubuntu19 64bit
题外话,交叉编译,即在X86架构电脑上的编译器编译的内核或程序运行在ARM架构上。我使用X86电脑(64位)windows系统下,安装了虚拟机(vmware),且在虚拟机中安装了ubuntu19和配置好了交叉编译器。接下来就是下载和编译内核。
1、源码下载
下载方式有两种:
(1) 从Toradex服务器下载内核源码 https://git.toradex.com/cgit/
(2) 使用GIT获取linux内核源码
git clone -b tegra git://git.toradex.com/linux-toradex.git
2、源码编译
将下载的内核源码解压,解压完成后进入到该目录中,如:cd linux-toradex
2.1 内核配置
第一步:配置内核准备工作
就是配置编译工具链,要配置哪些功能,要编译哪些模块到内核等等。首先要设置硬件环境,方法有两种:
方法1:这应该是官方提供的Makefile添加的功能,使用:make colibri_imx7_defconfig。执行该命令就可以把colibri_imx_defconfig自动配置为.config。
方法2:colibri_imx_defconfig从哪里来的呢?方法1是如何实现的?这里就手动实现,进入到arch/arm/configs目录下,可以找到colibri_imx7_defconfig。拷贝该文件到该内核源码的顶层目录(即linux-toradex目录下)。
将colibri_imx7_defconfig重命名为.config,这样就完成了内核硬件配置的第一步。
第二步:配置编译内容
sudo make menuconfig
如果出现如下界面,表示.config文件正常。这里面需要做一些基础的配置。
选择进入到General setup --->
->Cross-compiler tool prefix
编译内核的时候,需要指定交叉编译链,选择该选项,填入:arm-linux-gnueabihf-
->Compile also drivers which will not load
在其他平台编译以便测试驱动程序编译流程,通常不需要。
->Local version - append to kernel release
附加额外的字符串到内核版本信息后面,以及localversion*文件内容后面。通常用于我们的版本管理,所以自己定义。我们写入个-1.0
->Automatically append version information to the version
查找git标记的版本号信息,附加到localversion*文件内容后面,以及CONFIG_LOCALVERSION设置值得后面。
这里会在后面添加dirty,可以取消自动附加。按下空格键可以设置[ ]为空即可。
更多信息请参考:《内核编译选项详解》
配置编译内容:
这里我需要将一个USB转串口驱动编译进内核,所以我需要选择如下:
Device Drivers ---> USB support ---> USB Serial Convertor support --->
按下空格修改为:<M> USB Winchiphead CH34X_ACM Single Port Serial Driver
下载来的内核源码里是没有USB Winchiphead CH34X_ACM Single Port Serial Driver这个选项的,这是我根据项目需要添加的,并希望编译到内核中去,所以我这里是需要配置的,如何添加的详细过程,可以参考《如何将驱动或模块编译进内核》。
选择Save及Load后,退出该界面,编译的准备工作就已经完成了。
可以看到提示信息,配置已经写入到.config文件了,执行make开始编译了。
这里我们需要切换到root用户来编译,在普通用户下make出现如下错误:
第三步:编译
切换root用户:sudo -s
sudo su 和 sudo -s都是切换到root用户,不同的是:
sudo su 环境用的是目标用户(root)的环境
sudo -s 环境用的是当前用户本身的环境
执行:make
因为第一次编译,所以需要等待漫长的编译......
编译完成。
第四步:编译生成image文件
make -j3 zImage
从上图可以看到,生成的zImage文件在arch/arm/boot目录下。
第5步:编译内核模块
make -j3 modules
第6步:安装内核模块到主机系统中
make modules_install
可以在主机系统中可以查看到内核模块安装到主机上了。
安装到主机上的作用是,我们在系统中开发的程序是需要在arm板子上运行的,编译的时候就需要对应板子的内核,也就是编译的时候指定对应内核的目录。
参考:
Build U-Boot and Linux Kernel from Source Code