1.获取Linux内核
Linux由Linux基金会管理和发布。 Linux的官方网站是org,因此如果您获得最新版本的Linux,可以从该网站下载。 网站界面如右图所示:
通常半导体厂商会从官网下载某个版本的Linux内核,移植到自己的CPU上,测试成功后开放给半导体厂商的CPU开发人员。 开发人员下载他们提供的Linux内核,然后将其移植到他们的产品中。
在本文中,我们使用NXP提供的Linux源代码,文件名为:
linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
2.Linux内核的第一次编译
在编译内核之前,需要在ubuntu上安装lzop库。 另外,图形化配置工具还需要ncurses库的支持。 安装命令为:
sudo apt-get install lzop
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
在Ubuntu中新建一个文件夹,然后将linux内核压缩包复制到该文件夹中并解压。 解压命令为:
tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
解压后进入该文件夹,新建build.sh脚本文件进行编译linux源码无法编译,脚本内容如下:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
授予脚本可执行权限,然后运行它。 编译时会弹出Linux图形配置界面。 这里不需要做任何配置,只需按两下ESC键即可退出图形界面
以后您将手动开始编译Linux内核并等待编译完成。 完成后会显示在右侧
编译完成后,会在arch/arm/boot目录下生成一个zImage文件,该文件就是要使用的Linux镜像文件。另外,在arch/arm/boot/dts下还会生成很多.dtb文件。 这种.dtb就是设备树文件
vmlinux、Image、zImage、uImage的区别:
3.Linux内核源码结构
Linux内核编译过程会生成一些文件。 我们看一下编译前后的内核源码结构。 可以看到,多了一些编译好的文件。
编译后的内核源代码比未编译的源代码有更多的文件。 此类文件或文件夹的含义如下表所示:
上表中很多文件夹和文件不需要关注,需要关注的文件夹或文件如下
arch目录:与架构相关的目录,如arm、arm64、avr32、x86等。每种架构对应一个目录,该目录下有很多子目录,如boot、common、configs等。
block目录:block是Linux下块设备的目录。 SD卡、EMMC、NAND、硬盘等存储设备都属于块设备。 块目录存放管理块设备的相关文件
Crypto目录:存放加密文件,如常见的crc、crc32、md4、md5、hash等加密算法
文档目录:存放Linux相关文档。 如果你想了解Linux的某个功能模块或者驱动框架的作用,可以查看Documentation目录下是否有对应的文档。
Drivers目录:驱动程序目录文件。 该目录按照不同类型的驱动程序进行排序。 比如drivers/i2c是I2C相关的驱动目录,drivers/gpio是GPIO相关的驱动目录,需要注意。
固件目录:该目录用于存放固件
fs目录:存放文件系统,如fs/ext2、fs/ext4、fs/f2fs等,分别是ext2、ext4、f2fs等文件系统
include目录:头文件目录
init目录:存放Linux内核启动时的初始化代码
ipc目录:IPC就是进程间通信,ipc目录是进程间通信的具体实现代码
kernel目录:Linux内核代码
lib目录:lib的意思是库,lib目录是一些常用的库函数
mm目录:存放显存管理相关代码
net目录:存放网络相关代码
Samples目录:存放一些示例代码文件
scripts目录:脚本目录,Linux编译时会用到很多脚本文件,此类脚本文件就保存在该目录下
security目录:存放安全相关文件
sound目录:存放音频相关的驱动文件,音频驱动文件并不存放在drivers目录下,而是一个单独的目录
tools目录:存放编译时使用的一些工具
usr目录:存放initramfs相关代码
virt目录:存放虚拟机相关文件
.config文件:和uboot一样,.config保存了Linux的最终配置信息,编译时会读取这个文件中的配置信息。最后根据配置信息linux源码无法编译,选择编译什么模块和函数
Kbuild文件:一些Makefile读取这个文件
kconfig文件:图形配置界面的配置文件
Makefile:Linux顶层的Makefile,建议仔细阅读这个文件
README文件:该文件详细说明了如何编译Linux源码以及Linux源码的目录信息