在嵌入式Linux开发中,经常需要根据不同的硬件平台编译定制内核。Linux支持x86、ARM、RISC-V等架构,不同CPU架构的初始化代码和汇编指令截然不同,这就要求在编译前做好一系列关键设置。很多新手在刚开始编译内核源码时一脸懵,其实只要掌握“三板斧”,编译内核就会变得十分简单:指定架构、指定交叉编译工具链、选择配置文件。下面我们一步步来看。第一板斧:指定目标架构(ARCH)
上期我们说到,Linux内核源码的arch/目录下存放了各个架构的代码,在编译时需要明确告诉系统我们要编译哪个架构。这是通过环境变量ARCH来实现的。例如,我手中的开发板是全志的D1s,属于RISC-V架构的芯片,首先将目录切换到源码目录,就在终端输入:
cd /内核源码路径/export ARCH=riscv
第二板斧:指定交叉编译工具链(CROSS_COMPILE)
嵌入式设备性能往往较弱,无法直接运行本地编译工具,因此需要在PC上使用交叉编译工具链,生成目标平台的可执行代码。那么会有人问交叉编译工具链是什么?一句话总结:在一个平台(PC)上编译出另一个平台(RISC-V)上能运行的文件。
这里简单介绍一下交叉编译器的目录结构。
/你的交叉编译器路径/└── bin/ ├── riscv64-unknown-linux-gnu-gcc # C 编译器 ├── riscv64-unknown-linux-gnu-ld # 链接器 ├── riscv64-unknown-linux-gnu-as # 汇编器 ├── riscv64-unknown-linux-gnu-ar # 静态库打包工具 ├── riscv64-unknown-linux-gnu-objcopy # 格式转换工具 └── ... # 其他工具
指定工具链路径依靠环境变量 CROSS_COMPILE。假设你的交叉编译工具链安装在:
export CROSS_COMPILE=/你的交叉编译器路径/bin/riscv64-unknown-linux-gnu-
第三板斧:选择并应用配置文件
Linux内核支持高度模块化裁剪,不同的板子需要不同的驱动和功能。配置通过一个名为.config 的文件来管理,而预定义的配置文件都放在 arch/$(ARCH)/configs 目录下。如果你是RISC-V架构,配置文件就位于 arch/riscv/configs/。一般芯片或板卡厂商会提供一个默认配置文件defconfig,我们直接用命令指定即可,至于这个配置文件如何编写,初学者暂时无需详细了解。进入内核源码根目录,执行:
最后一步就是编译了,在终端上输入:
make -jx #x是表示同时使用x个线程编译,你可以根据电脑的CPU核心数调整这个数字,加快编译速度。
至此,内核编译的所有步骤就完成了,总结一下。
cd /内核源码目录export ARCH=riscvexport CROSS_COMPILE=工具链前缀make xxx_defconfigmake -jx