目录
- Linux 内核获取
- Linux 内核初次编译
- Linux 内核源码目录分析
- 1、arch 目录
- 2、block 目录
- 3、crypto 目录
- 4、Documentation 目录
- 5、drivers 目录
- 6、firmware 目录
- 7、fs 目录
- 8、include 目录
- 9、init 目录
- 10、ipc 目录
- 11、kernel 目录
- 12、lib 目录
- 13、mm 目录
Linux 内核获取
关于Linux 的起源以及发展历史,这里就不啰嗦了,网上相关的介绍太多了!即使写到这也只是水一下教程页数而已,没有任何实际的意义。有限的时间还是放到有意义的事情上吧,Linux 由Linux 基金会管理与发布,Linux 官网为https://www.kernel.org,所以你想获取最新的Linux 版本就可以在这个网站上下载,网站界面如图35.1.1 所示:
从图35.1.1 可以看出最新的稳定版Linux 已经到了5.1.4,大家没必要追新,因为4.x 版本的Linux 和5.x 版本没有本质上的区别,5.x 更多的是加入了一些新的平台、新的外设驱动而已。
NXP 会从https://www.kernel.org 下载某个版本的Linux 内核,然后将其移植到自己的CPU上,测试成功以后就会将其开放给NXP 的CPU 开发者。开发者下载NXP 提供的Linux 内核,然后将其移植到自己的产品上。本章的移植我们就使用NXP 提供的Linux 源码,NXP 提供Linux源码已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码->4、NXP 官方原版Uboot和Linux-> linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
Linux 内核初次编译
编译内核之前需要先在ubuntu 上安装lzop 库,否则内核编译会失败!命令如下:
sudo apt-get install lzop
先看一下如何编译Linux 源码,这里编译以I.MX6U-ALPHA 开发板移植好的Linux 源码,已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码-> 3、正点原子Uboot 和Linux出厂源码-> linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2,注意,正点原子出厂系统在不断的更新,因此内和压缩包的名字可能不同,一切以实际为准!
在Ubuntu 中新建名为“alientek_linux ”的文件夹,然后将linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2 这个压缩包拷贝到前面新建的alientek_linux 文件夹中并解压,命令如下:
tar -vxjf linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
解压完成以后的Linux 源码根目录如图35.2.1 所示:
以EMMC 核心板为例,讲解一下如何编译出对应的Linux 镜像文件。新建名为“mx6ull_alientek_emmc.sh”的shell 脚本,然后在这个shell 脚本里面输入如下所示内容:
示例代码35.2.1 mx6ull_alientek_emmc.sh 文件内容
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
第3 行,执行“make distclean”,清理工程,所以mx6ull_alientek_emmc.sh 每次都会清理一下工程。如果通过图形界面配置了Linux,但是还没保存新的配置文件,那么就要慎重使用mx6ull_alientek_emmc.sh 编译脚本了,因为它会把你的配置信息都删除掉!
第4 行,执行“make xxx_defconfig”,配置工程。
第5 行,执行“make menuconfig”,打开图形配置界面,对Linux 进行配置,如果不想每次编译都打开图形配置界面的话可以将这一行删除掉。
第6 行,执行“make”,编译Linux 源码。
可以看出,Linux 的编译过程基本和uboot 一样,都要先执行“make xxx_defconfig”来配置一下,然后在执行“make”进行编译。如果需要使用图形界面配置的话就执行“make menuconfig”。
使用chmod 给予mx6ull_alientek_emmc.sh 可执行权限,然后运行此shell 脚本,命令如下:
./mx6ull_alientek_emmc.sh
编译的时候会弹出Linux 图形配置界面,如图35.2.3 所示:
Linux 的图行界面配置和uboot 是一样的,这里我们不需要做任何的配置,直接按两下ESC键退出,退出图形界面以后会自动开始编译Linux。等待编译完成,完成以后如图35.2.4 所示:
编译完成以后就会在arch/arm/boot 这个目录下生成一个叫做zImage 的文件,zImage 就是我们要用的Linux 镜像文件。另外也会在arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。
Linux 内核源码目录分析
将正点原子提供的Linux 源码进行解压,解压完成以后的目录如图35.3.1 所示:
图35.3.1 就是正点原子提供的未编译的Linux 源码目录文件,我们在分析Linux 之前一定要先在Ubuntu 中编译一下Linux,因为编译过程会生成一些文件,而生成的这些恰恰是分析Linux 不可或缺的文件。编译完成以后使用tar 压缩命令对其进行压缩并使用Filezilla 软件将压缩后的uboot 源码拷贝到Windows 下。
编译后的Linux 目录如图35.3.2 所示:
表35.3.1 中的很多文件夹和文件我们都不需要去关心,我们要关注的文件夹或文件如下:
1、arch 目录
这个目录是和架构有关的目录,比如arm、arm64、avr32、x86 等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如boot、common、configs 等等,以arch/arm 为例,其子目录如图35.3.2 所示:
图35.3.2 是arch/arm 的一部分子目录,这些子目录用于控制系统引导、系统调用、动态调频、主频设置等。arch/arm/configs 目录是不同平台的默认配置文件:xxx_defconfig,如图35.3.3所示:
在arch/arm/configs 中就包含有I.MX6U-ALPHA 开发板的默认配置文件:imx_v7_defconfig,执行“make imx_v7_defconfig”即可完成配置。arch/arm/boot/dts 目录里面是对应开发平台的设备树文件,正点原子I.MX6U-ALPHA 开发板对应的设备树文件如图35.3.4 所示:
arch/arm/boot 目录下会保存编译出来的Image 和zImage 镜像文件,而zImage 就是我们要用的linux 镜像文件。
arch/arm/mach-xxx 目录分别为相应平台的驱动和初始化文件,比如mach-imx 目录里面就是I.MX 系列CPU 的驱动和初始化文件。
2、block 目录
block 是Linux 下块设备目录,像SD 卡、EMMC、NAND、硬盘等存储设备就属于块设备,block 目录中存放着管理块设备的相关文件。
3、crypto 目录
crypto 目录里面存放着加密文件,比如常见的crc、crc32、md4、md5、hash 等加密算法。
4、Documentation 目录
此目录里面存放着Linux 相关的文档,如果要想了解Linux 某个功能模块或驱动架构的功能,就可以在Documentation 目录中查找有没有对应的文档。
5、drivers 目录
驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c 就是I2C相关驱动目录,drivers/gpio 就是GPIO 相关的驱动目录,这是我们学习的重点。
6、firmware 目录
此目录用于存放固件。
7、fs 目录
此目录存放文件系统,比如fs/ext2、fs/ext4、fs/f2fs 等,分别是ext2、ext4 和f2fs 等文件系统。
8、include 目录
头文件目录。
9、init 目录
此目录存放Linux 内核启动的时候初始化代码。
10、ipc 目录
IPC 为进程间通信,ipc 目录是进程间通信的具体实现代码。
11、kernel 目录
Linux 内核代码。
12、lib 目录
lib 是库的意思,lib 目录都是一些公用的库函。
13、mm 目录
此目录存放内存管理相关代码。
14、net 目录
此目录存放网络相关代码。
15、samples 目录
此目录存放一些示例代码文件。
16、scripts 目录
脚本目录,Linux 编译的时候会用到很多脚本文件,这些脚本文件就保存在此目录中。
17、security 目录
此目录存放安全相关的文件。
18、sound 目录
此目录存放音频相关驱动文件,音频驱动文件并没有存放到drivers 目录中,而是单独的目
录。
19、tools 目录
此目录存放一些编译的时候使用到的工具。
20、usr 目录
此目录存放与initramfs 有关的代码。
21、virt 目录
此目录存放虚拟机相关文件。
22、.config 文件
跟uboot 一样,.config 保存着Linux 最终的配置信息,编译Linux 的时候会读取此文件中的配置信息。最终根据配置信息来选择编译Linux 哪些模块,哪些功能。
23、Kbuild 文件
有些Makefile 会读取此文件。
24、Kconfig 文件
图形化配置界面的配置文件。
25、Makefile 文件
Linux 顶层Makefile 文件,建议好好阅读一下此文件。
26、README 文件
此文件详细讲解了如何编译Linux 源码,以及Linux 源码的目录信息,建议仔细阅读一下此文件。