接下来我们就进行内核代码的初次编译,直接使用我们适配好的Linux内核源码进行编译。为了使编译操作更加简单,我们提供了编译脚本,将编译操作命令放进了脚本中执行,直接执行编译脚本文件build.sh即可完成代码的编译。我们先了解一下编译脚本的内容。使用vi命令打开build.sh脚本:
- elf@ubuntu:~/work/linux-4.1.15-elf1$ vi build.sh
build.sh脚本内容如下:- #!/bin/bash
- export CPUS=`grep -c processor /proc/cpuinfo`
- source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
- make distclean
- make imx6ull_elf1_defconfig
- make -j${CPUS}
- rm -rf ./.tmp
- make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/
- cd .tmp/rootfs/
- tar -jcvf modules.tar.bz2 *
第2行,获取到当前Ubuntu虚拟机CPU的核心数量,并赋值给变量CPUS;
第3行,执行环境变量,使用arm的gcc工具编译当前内核。注意:在脚本当中执行的环境变量只在当前脚本内生效,单独编译镜像时仍需要执行环境变量;
第4行,编译前清理工程;
第5行,使用imx6ull_elf1_defconfig配置当前工程,执行后在当前路径下生成.config文件;
第6行,执行”make”,编译Linux源码,后面的”-j${CPUS}”为使用当前虚拟机的所有核心一起编译;
第8-11行,将编译生成的.ko模块使用make modules_install命令安装到./.tmp/rootfs/目录下,并压缩打包,生成modules.tar.bz2。
整体编译内核
- elf@ubuntu:~/work/linux-4.1.15-elf1$ ./build.sh
编译完成之后,会在arch/arm/boot/目录下生成zImage文件,就是内核镜像文件;在arch/arm/boot/dts/下生成多个.dtb设备树二进制文件;以及在某些驱动目录下生成.ko模块。编译完成后,生成的文件以及路径会在下篇文章进行说明。
单独编译内核
在调试过程中我们会经常需要更改内核配置或者单独编译zImage、dtb、ko模块,那么直接执行上面build.sh编译脚本进行全部编译就不太合适了,就需要更改此脚本或者单步编译。
设置交叉编译环境
注意:
设置环境变量之后,只要不更换终端,下次再编译就不需要重新设置。
如果重新打开新终端或者切换账户,编译前需要重新设置环境变量。
设置编译环境主要是指定目标架构和交叉编译工具链,以及编译过程中使用到的一些库的路径等,使用如下命令配置(.后边有空格):
- . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
更改内核配置
Linux内核编译之前需要进行配置,脚本中已经有默认的配置。往往我们需要根据自己的需求进行内核配置,接下来我们看一下如何进行内核配置的更改。更改内核配置就是根据自己的需要,将内核中的驱动、软件包、组件等功能模块进行裁剪或者添加。可使用make menuconfig命令生成图形界面进行修改。如果想要对内核进行重新配置,就需要先执行,make imx6ull_elf1_defconfig命令生成.config,然后使用图形界面进行配置,执行命令:
- elf@ubuntu:~/work/linux-4.1.15-elf1$ make menuconfig
此图形界面所呈现的配置选项的菜单列表来源于Kconfig文件(下面章节会讲到),这些配置选择,就是根据.config读取出来的,我们也可以通过配置选项进行配置:
(1)Y(将该功能编译进内核);
(2)N(不将该功能编译进内核);
(3)M(将该功能编译成可以在需要时动态插入到内核中的模块);
三种选择根据实际需求进行配置,最后在保存退出的时候,会把最新的配置更新到.config中,此时可以把.config文件中配置复制到imx6ull_elf1_defconfig默认配置文件,否则在下次编译前在执行make distclean的时候会把最新的.config清除掉,我们还需要重新配置。
单独编译内核镜像zImage
- elf@ubuntu:~/work/linux-4.1.15-elf1$ make zImage -j4
单独编译设备树- elf@ubuntu:~/work/linux-4.1.15-elf1$ make dtbs –j4
单独编译模块- elf@ubuntu:~/work/linux-4.1.15-elf1$ make modules -j4
安装模块到./.tmp/rootfs/文件夹中- elf@ubuntu:~/work/linux-4.1.15-elf1$ make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/
打包模块- elf@ubuntu:~/work/linux-4.1.15-elf1$ cd .tmp/rootfs/
- elf@ubuntu:~/work/linux-4.1.15-elf1$ tar -jcvf modules.tar.bz2 *