目录
前言
在本讲内容之前,我们一共15篇博客来讲解了如何移植 uboot 到 I.MX6U-ALPHA 开发板上,从本讲内容开始,我们学习如何移植 Linux 内核。
Linux 内核初次编译
编译内核之前需要先在 ubuntu 上安装 lzop 库,命令如下:
sudo apt-get install lzop
我使用的正点原子开发板,将官方提供的linux压缩包发送到虚拟机里,解压:
tar -vxjf linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7.tar.bz2
解压完成的结果如图:
新建名为“mx6ull_alientek_emmc.sh”的 shell 脚本,然后在这个 shell 脚本里面输入如下所示内容:
#!/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
- 执行“make distclean”,清理工程,所以 mx6ull_alientek_emmc.sh 每次都会清理一下工程。如果通过图形界面配置了 Linux,但是还没保存新的配置文件,那么就要慎重使用这个编译脚本了,因为它会把你的配置信息都删除掉。
- 执行“make xxx_defconfig”,配置工程。
- 执行“make menuconfig”,打开图形配置界面,对 Linux 进行配置,如果不想每次编译都打开图形配置界面的话可以将这一行删除掉。
- 执行“make”,编译 Linux 源码。
可以看出, Linux 的编译过程基本和 uboot 一样,都要先执行“make xxx_defconfig”来配置一下,然后在执行“make”进行编译。如果需要使用图形界面配置的话就执行“make menuconfig”。
使用 chmod 给予 mx6ull_alientek_emmc.sh 可执行权限,然后运行此 shell 脚本,命令如下:
./mx6ull_alientek_emmc.sh
编译的时候会弹出 Linux 图形配置界面,如图:
直接按两下 ESC键退出,退出图形界面以后会自动开始编译 Linux。等待编译完成,完成以后如图:
编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件, zImage 就是我们要用的 Linux 镜像文件。
另外也会在 arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。
Linux 工程目录分析
我们在分析 Linux 之前一定要先在 Ubuntu 中编译一下 Linux,因为编译过程会生成一些文件,而生成的这些恰恰是分析Linux 不可或缺的文件。编译后的目录结果如图:
编译完成以后使用 tar 压缩命令对其进行压缩并使用 Filezilla 软件将压缩后的 uboot 源码拷贝到 Windows 下。
目录总览
其中,重要的文件夹或文件的含义见表:
关键分析
核心构建文件
文件/文件夹 | 作用说明 |
---|---|
| 当前内核配置:包含所有 |
| 顶层构建控制:定义编译规则、目标架构、编译器参数等全局设置 |
| 模块构建配置:控制内核模块的编译行为和各子系统的配置选项 |
| 原始内核镜像:未压缩的ELF格式可执行文件,包含所有符号和调试信息 |
| 内核符号表:记录所有函数和变量的内存地址,用于调试和内核Oops分析 |
架构与子系统代码
目录 | 关键内容 |
---|---|
| CPU架构代码:如 |
| 核心子系统:进程调度、定时器、信号处理等基础机制 |
| 内存管理:虚拟内存、页表、SLAB分配器等实现 |
| 设备驱动:按类型分类(如 |
| 文件系统:Ext4/Btrfs等文件系统的实现代码 |
| 网络协议栈:TCP/IP、套接字、网络设备驱动等 |
构建生成文件
文件/文件夹 | 作用说明 |
---|---|
| 临时文件:编译过程中生成的中间文件(如 |
| 模块符号表:记录内核模块的导出符号,用于模块间依赖解析 |
| 模块编译顺序:控制内核模块的构建顺序 |
| 内置模块列表:标记哪些模块被直接编译进内核(而非动态加载) |
工具与辅助文件
目录/文件 | 作用说明 |
---|---|
| 构建脚本:包含 |
| 开发工具:perf调试工具、BPF编译器、内核自测试工具等 |
| 内核文档:API说明、驱动开发指南、特性文档(实际需手动生成HTML/PDF) |
许可证与维护信息
文件 | 作用说明 |
---|---|
| 许可证文本:通常为GPL-2.0协议全文 |
| 贡献者名单:记录对内核有重大贡献的开发者和组织 |
| 维护者列表:注明各子系统的维护者及邮件列表 |
| 项目概述:简要说明如何编译和安装内核 |
特殊用途文件
文件/文件夹 | 作用说明 |
---|---|
| 设备固件:部分硬件驱动需加载的二进制固件(如WiFi芯片固件) |
| 用户空间工具:如 |
| IDE配置:VS Code编辑器的项目设置(非内核原生,由开发者添加) |
关键文件关系图:
注意事项
在 arch/arm/configs 中就包含有 I.MX6U-ALPHA 开发板的默认配置文件: imx_v7_defconfig,执行“make imx_v7_defconfig”即可完成配置。
arch/arm/boot/dts 目录里面是对应开发平台的设备树文件,正点原子 I.MX6U-ALPHA 开发板对应的设备树文件如图:
arch/arm/boot 目录下会保存编译出来的 Image 和 zImage 镜像文件,而 zImage 就是我们要用的 linux 镜像文件。
arch/arm/mach-xxx 目录分别为相应平台的驱动和初始化文件,比如 mach-imx 目录里面就是 I.MX 系列 CPU 的驱动和初始化文件。
.config 文件
跟 uboot 一样, .config 保存着 Linux 最终的配置信息,编译 Linux 的时候会读取此文件中的配置信息。最终根据配置信息来选择编译 Linux 哪些模块,哪些功能。
下一讲内容我们来分析一下 Linux 的顶层 Makefile。