1 概述
在开发过程中,我们常常需要配置和构建特定的Linux内核,以将需要用到的模块编译进内核,不用的模块不编译进内核,实现内核的最大精简。这篇文章介绍了如何解压U-boot和Linux内核源码以及如何使用Buildroot配置Linux内核。配置完成后的内核是标准内核,如果想增加某些模块,可参考ADI Linux指引手册的后半部分。
2 解压源代码
在工作开始之前,我们需要把U-boot源代码和Linux内核源代码复制到指定位置,这里将目录~/sc5xx_dev作为指定位置。
mkdir ~/sc5xx_dev
2.1 解压u-boot源代码
执行以下命令将u-boot源代码解压到工作目录~/sc5xx_dev。
$ cd ~/sc5xx_dev
$ cp /opt/analog/cces-linux-add-in/1.3.1/uboot-sc5xx-1.3.1/src/ubootsc5xx-1.3.1.tar.gz ./
$ tar -zxvf uboot-sc5xx-1.3.1.tar.gz
现在源码已经存放在目录~/sc5xx_dev/uboot下了。
2.2 解压buildroot和Linux内核源代码
执行以下命令将Linux内核源码解压到工作目录~/sc5xx_dev。
$ cd ~/sc5xx_dev
$ cp /opt/analog/cces-linux-add-in/1.3.1/buildroot-sc5xx-1.3.1/src/buildroot-sc5xx-1.3.1.tar.gz ./
$ tar -zxvf buildroot-sc5xx-1.3.1.tar.gz
现在源码已经存放在目录~/sc5xx_dev/buildroot下了。
3 配置并编译u-boot
3.1 配置u-boot
$ cd ~/sc5xx_dev/uboot
$ make distclean
$ make sc589-ezkit_defconfig
3.2 编译u-boot
$ make
3.3 生成的文件
文件 | 描述 |
---|---|
u-boot.ldr | 用于引导的u-boot镜像 |
u-boot | 可执行的u-bootELF文件 |
4 按照默认配置编译Linux内核与Buildroot
4.1 默认配置
$ cd ~/sc5xx_dev/buildroot
$ make distclean
$ make sc589-ezkit_defconfig
4.2 编译
以下代码会同时编译Linux内核与Buildroot
$ cd ~/sc5xx_dev/buildroot
$ make
5 定制编译Linux内核与Buildroot
5.1 使用Linux-menuconfig定制Linux内核
$ cd ~/sc5xx_dev/buildroot
$ make linux-menuconfig
执行命令后会进入Linux-menuconfig配置菜单:
根据ADI官方Linux用户指南中各驱动的要求按Y激活相应的选项,全部配置完成后选择save选项保存,之后退出。
$ make linux-rebuild
执行以上指令后,Linux内核会被重新配置。
5.2 在buildroot中启用新package
$ cd ~/sc5xx_dev/buildroot
$ make menuconfig
执行以上命令会出现menuconfig菜单:
在菜单中激活你需要的package,之后选择save选项,退出。
$ make
使用以上命令后,会重新编译buildroot。
5.3 生成文件位置
位置 | 描述 |
---|---|
output/images/uImage | 生成的Linux可引导镜像 |
output/images/vmImage | Linux内核镜像 |
output/images/sc589-ezkit.dtb | 编译出的设备树文件 |
output/images/rootfs.ext3 | ext3格式的根文件系统镜像 |
output/target/ | 根文件系统的内容 |
output/build/linux-custom/ | Linux源代码树的build输出 |
output/build/ | 各种包的build输出 |
6 生成能从非易失性存储介质(如SD卡)启动的内核镜像
在如何将u-boot和Linux内核移植到ADSP-SC589上中,我们已经演示了如何从SD卡中引导Linux内核镜像vmimage。然而,要想从SD卡中引导我们自己构建的Linux内核,还需要执行以下操作,并且使用内核镜像uimage来替代vmimage。
在buildroot目录下执行命令make menuconfig
,进入可视化配置窗口:
进入Filesystem images选项:
找到initial RAM filesystem linked into linux kernel选项并确保该选项没有被选中。
保存并退出。
执行命令make linux-menuconfig
,进入内核配置窗口:
进入General setup选项,确保其中的选项 Initial RAM filesystem and RAM disk (initramfs/initrd) support没有被选中。
保存并退出
之后重新编译内核与文件系统。
$ make
注意:
如果还想使用原来与文件系统编译在一起的uImage,请在重新使能 Initial RAM filesystem and RAM disk (initramfs/initrd) support选项后,在Initramfs source file(s) 选项中输入你想要编译的cpio格式文件系统镜像的路径,之后重新编译。
7 一些Buildroot小技巧
7.1 清除之前的编译输出
有时我们想要运行make clean或make distclean来从头开始执行一个干净的构建。这两个命令会删除上次构建期间的所有输出,以及dl文件夹,备份dl文件夹是一个很好的做法,因为下载它们需要很长时间。
7.2 重新构建更新的package
有时我们会对package或package的源码(位于output/package目录)的配置进行更改。如果仅仅在更改后执行make
命令是没用的,取而代之的是我们需要执行make <pkg>-rebuild
命令。