怎么编译Linux内核?

在线课堂:https://www.100ask.net/index(课程观看)
论  坛:http://bbs.100ask.net/(学术答疑)
开 发 板:https://100ask.taobao.com/ (淘宝)
     https://weidongshan.tmall.com/(天猫)
交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
交流群二:QQ群:536785813(单片机-嵌入式)
公 众 号:百问科技


版本日期作者说明
V12020韦东山摘自《嵌入式Linux应用开发完全手册》

1. Linux 内核介绍

Linux内核(英语:Linux kernel)是一种开源的类Unix操作系统宏内核。整个Linux操作系统家族基于
该内核部署在传统计算机平台(如个人计算机和服务器,以Linux发行版的形式)和各种嵌入式平台,如路由器、无线接入点、专用小交换机、机顶盒、FTA接收器、智能电视、数字视频录像机、网络附加存储(NAS)等。工作于平板电脑、智能手机及智能手表的Android操作系统,它的底层操作系统也是Linux。尽管在桌面计算机的占用率较低,但基于Linux的操作系统统治了几乎从移动设备到主机的其他全部领域。实际Linux的发行版Ubuntu,其易用性也逐渐接近Windows。

Linux kernel官网:https://www.kernel.org/
linux Kernel维基百科:https://www.wiki.kernel.org/
在线阅读linux kernel源码:https://elixir.bootlin.com/
ST官方源码地址:https://github.com/STMicroelectronics/linux.git
ST官方提供内核源码示例:https://github.com/STMicroelectronics/linux-examples
100ask_Stm32mp157开发板Git仓库地址: https://gitee.com/weidongshan/stm32mp15xc-kernel.git
更多关于Linux内核资料请参考页面:http://wiki.100ask.org/Category:Linux_Operating_System

上述Git仓库是专为100ask_imx6ull系列开发板制定的Linux内核,它有如下特性:
在这里插入图片描述

2. 编译内核镜像

不同的开发板对应不同的配置文件,配置文件位于内核源码arch/arm/configs/目录。
编译Linuxkernel前必须先配置好工具链等开发环境,这里我们使用的交叉编译工具链为Buildroot GCC 8.4版本。

设置交叉编译,并执行编译命令。

book@100ask:~$ export ARCH=arm
book@100ask:~$ export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
book@100ask:~$ export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

STM32MP157全功能版
kernel的编译过程如下(编译内核前需要先配置好工具链等一些环境变量):

book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make 100ask_stm32mp157_pro_defconfig
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make uImage LOADADDR=0xC2000040 
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make dtbs

编译步骤参考如下,编译完成 uImage 后才可编译设备树文件,如果你觉得编译速度很慢可以加 -j<数 字>来使用并行任务编译,如下图加 -j8 参数使用 8 个并行任务来编译内核,编译速度视性能而言,i7 9700F 主频 3Ghz 四核 8G 内存全速编译可能需要 5 分钟左右。
在这里插入图片描述
在这里插入图片描述
编译完成后生成的文件如下图所示
在这里插入图片描述
编译完成后,在arch/arm/boot目录下生成uImage内核文件, 在arch/arm/boot/dts目录下生成设备树
的二进制文件stm32mp157c-100ask-512d-lcd-v1.dtb。
把这2个文件复制到/home/book/nfs_rootfs目录下备用,如下图:

book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ cp arch/arm/boot/uImage ~/nfs_rootfs/
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ cp arch/arm/boot/dts/stm32mp157c-100ask-512d-v1.dtb ~/nfs_rootfs/

在这里插入图片描述

3. 编译内核模块

无论是哪个版本的STM32MP157开发板,编译内核模块的命令是一样的。

STM32MP157全功能版
进入内核源码目录后,就可以编译内核模块了:

book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules -j8

内核模块编译命令执行截图示例
在这里插入图片描述

4. 安装内核模块到 Ubuntu 某个目录下备用

可以先把内核模块安装到nfs根文件系统(/home/book/nfs_rootfs为安装目录)。
注意:下面会执行tree命令,如果提示没有该命令,需要执行“sudo apt install tree”命令安装tree
工具(前提是Ubuntu能上网)。

STM32MP157全功能版
执行以下命令:

book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install

如下图,把模块安装在nfs所在目录 /home/book/nfs_rootfs/ 目录下:
在这里插入图片描述
安装后的的/home/book/nfs_rootfs/目录结构如下图所示:
在这里插入图片描述
由于模块编译安装完成后会自动生成两个链接到内核源码目录的链接文件,需要手动删除这两个链接
文件才可以继续执行拷贝内核模块到开发板步骤,否则会提示空间不足等问题,如下所示,执行rm build source 删除两个红框所示的链接文件。

book@virtual-machine:~/nfs_rootfs/lib/modules/5.4.31-g04363cb64$ rm build source

在这里插入图片描述
之后可以继续执行拷贝模块到开发板操作。

已标记关键词 清除标记