Linux内核开发流程
1. Linux内核开发流程
构建Linux内核流程
主要分为两部分
- 环境配置: 选择合适的编译主机环境 系统非常重要
- 安装对Linux内核源码构建所需的环境依赖
- 设置你需要构建的目标单板的架构 工具链
- 内核构建
- make构建可以给bootloader使用的 内核镜像
- make构建 dtb设备树文件(可选
x86架构不需要
) - make 构建内核模块驱动
- 安装到合适的位置,替换原有的版本
-
Host下配置开发环境
-
安装必要依赖包
- 解压配置合适的工具链
-
-
获取配套的交叉编译工具链
-
SOC原厂提供: NXP ST Rockchip Amlogic Allwinnertech 等。
- 社区下载: Linrao Debian ARM Bootlin
-
-
下载kernel源码
-
获取Linux Kernel主线LTS源码
-
Git方式获取: git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-
获取芯片原厂Kernel源码
-
-
-
指定编译板子配置文件
make BOARDNAME_defconfig
-
编译
-
编译内核镜像
make –jN
-
编译设备树
make dtbs
-
编译安装模块驱动
make modules
-
-
-
安装驱动模块至目标kernel位置
获取适合的Linux内核
Kernel源码区别
-
Linus Torvalds 发布的 Linux 内核的官方(主线)版本可在 https://kernel.org 获得。
- 这些版本遵循内核的开发模式流程。但是,它们可能尚未包含特定领域的最新特性。某些开发中的功能可能尚未准备好用于主线版本。
-
许多芯片供应商提供自己的内核源
- 他们优先关注硬件支持。与主线 Linux 有一个非常重要的增量支持。
- 仅在主线还没有支持时有用。 许多SOC供应商同时投入于主线内核开发。
-
许多内核子社区维护自己的内核版本,通常具有更新 但不够稳定。
-
架构社区(ARM、MIPS、PowerPC 等)、设备驱动社区(I2C、SPI、USB、PCI、网络等),其他社区(如real-time等)
-
无官方发布,仅用于分享工作和为主线版本做出贡献。
-
2. 使用主线Linuxkernel演示
1. 获取主线Linuxkernel
- 所有版本压缩包下载:https://kernel.org/pub/linux/kernel/
- Git仓库源码地址:git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
2. Kernel源码目录作用
kernel源码目录 | 目录功能作用介绍 |
---|---|
arch | 包含体系结构的文件。子目录下有不同的架构。 |
Documentation | 包含内核文档。如果您想找到有关 Linux 某个方面的更多信息,可以直接从这里寻找 |
drivers | 包含设备驱动程序 - 数以千计。 有一个每种驱动程序的子目录。 |
fs | 包含文件系统代码。 |
include | 包含内核头文件,包括那些工具链需要的文件。 |
init | 包含内核启动代码。 |
kernel: | 包含核心功能,包括调度、锁、定时器、电源管理和调试/代码跟踪等。 |
mm | 包含内存管理。 |
net | 包含网络协议。 |
scripts | 包含许多有用的脚本,包括设备树编译器 (DTC)等。 |
tools | 包含许多有用的工具,包括 Linux 性能计数器工具 perf,分析和追踪等。 |
3. 配置Kernel编译环境
1. 安装Host依赖
- Ubuntu16+ 系统 LinuxKernel编译依赖
sudo apt-get install libc6-armel-cross libc6-dev-armel-cross libncurses5-dev build-essential bison flex libssl-dev bc libelf-dev
2. 设置ARCH
首先,指定要构建的内核的架构将 ARCH 设置为 arch/ 下的目录名称: export ARCH=arm
默认情况下,内核构建系统假定内核是为主机架构配置和构建的(在我们的例子中为 x86,那么ARCH默认就是x86)。内核构建镜像时将使用此设置。使用目标架构的配置项。使用目标架构的源代码和头文件编译内核。
3. 设置 CROOS_COMPILE
在编译镜像时,内核Makefile调用的编译器是$(CROSS_COMPILE)gcc
在配置时需要已经指定过编译器,因为某些内核配置选项取决于编译器的功能。
-
本地编译时: 保持CROSS_COMPILE 变量未定义,内核将使用 默认的gcc 为主机架构进行本地编译。
-
使用交叉编译器时: 为了与本机编译器有所不同,交叉编译器名称的可执行文件以 目标系统、体系结构或着有时是库的名称作为前缀。例如:
- mips-linux-gcc :前缀名称是 mips-linux-
- arm-linux-gnueabi-gcc :前缀名称是 arm-linux-gnueabi-
- riscv64-unknown-linux-gnu-gcc : 前缀名称是 riscv64-unknown-linux-gnu-
- 因此,您可以按如下方式指定您的交叉编译器:export CROSS_COMPILE=arm-linux-gnueabi-
CROSS_COMPILE 其实就是交叉编译工具的前缀名称(gcc、as、ld、objcopy、strip...)。
实际上有两种定义 ARCH 和 CROSS_COMPILE 的方式:
-
方式一:在 make 命令行上传递 ARCH 和 CROSS_COMPILE :
-
make ARCH=arm CROSS_COMPILE=arm-linux- ...
-
缺点:当您运行任何 make 命令时很容易忘记传递这些变量,从而导致您的构建和配置被破坏。
-
-
方式二:定义 ARCH 和 CROSS_COMPILE 作为系统环境变量:
-
export ARCH=arm export CROSS_COMPILE=arm-linux-
-
缺点:它只能在当前 shell 或终端内工作。 您可以将这些设置放在每次开始处理项目时都提供的 文件中。 如果您只使用始终相同的工具链在单一架构上工作,您甚至可以将这些设置放在您的
~/.bashrc
文件中,使它们在任何终端上永久可见,设置后使用source ~/.bashrc
命令生效。
-