上节重点讲解了如何移植 uboot 到 I.MX6U开发板上,本节开始我们就开始移植Linux 内核。先来看一下 Linux 内核的顶层 Makefile 文件,因为顶层 Makefile 控制着Linux 内核的编译流程。
Linux 由 Linux 基金会管理与发布,Linux 官网为 https://www.kernel.org,所以你想获取最新的
Linux 版本就可以在这个网站上下载,网站界面如图
可以看出最新的稳定版 Linux 已经到了 5.1.8,但是大家没必要追新,因为 4.x 版本的Linux 和 5.x 版本没有本质上的区别,5.x 更多的是加入了一些新的平台、新的外设驱动而已。NXP 会从https://www.kernel.org 下载某个版本的Linux 内核,然后将其移植到自己的 CPU 上,测试成功以后就会将其开放给 NXP 的 CPU 开发者。开发者下载 NXP 提供的 Linux 内核, 然后将其移植到自己的产品上。
本节的移植我们就使用 NXP 提供的Linux 源码。源码在板子的光盘里可以找到。
编译内核之前需要先在 ubuntu 上安装 lzop 库,否则内核编译会失败!命令如下:
sudo apt-get install lzop
先看一下如何编译 Linux 源码,这里编译以 I.MX6U-ALPHA 开发板移植好的 Linux 源码, 在板子的光盘里可以找到。
在 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
以 EMMC 核心板为例, 讲解一下如何编译出对应的 Linux 镜像文件。新建名为“mx6ull_alientek_emmc.sh”的 shell 脚本,然后在这个 shell 脚本里面输入如下所示内容:
1 #!/bin/sh
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
使用 chmod 给予 mx6ull_alientek_emmc.sh 可执行权限,然后运行此 shell 脚本,命令如下:
./mx6ull_alientek_emmc.sh
编译的时候会弹出Linux 图形配置界面
Linux 的图行界面配置和 uboot 是一样的,这里我们不需要做任何的配置,直接按两下 ESC键退出,退出图形界面以后会自动开始编译 Linux。等待编译完成。
编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件,zImage 就是我们要用的Linux 镜像文件。另外也会在 arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。
编译 Linux 内核的时候可能会提示“recipe for target ‘arch/arm/boot/compressed/piggy.lzo’failed。
看一下编译脚本 mx6ull_alientek_emmc.sh 的内容
1 #!/bin/sh
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
第 2 行,执行“make distclean”,清理工程,所以 mx6ull_alientek_emmc.sh 每次都会清理一下工程。如果通过图形界面配置了 Linux,但是还没保存新的配置文件,那么就要慎重使用mx6ull_alientek_emmc.sh 编译脚本了,因为它会把你的配置信息都删除掉! 第 3 行,执行“make xxx_defconfig”,配置工程。
第 4 行,执行“make menuconfig”,打开图形配置界面,对 Linux 进行配置,如果不想每次编译都打开图形配置界面的话可以将这一行删除掉。
第 5 行,执行“make”,编译 Linux 源码。
可以看出,Linux 的编译过程基本和uboot 一样,都要先执行“make xxx_defconfig”来配置一下,然后在执行“make”进行编译。如果需要使用图形界面配置的话就执行“make menuconfig”。
正点原子提供的Linux 源码进行解压,解压完成以后的目录如图
在 Ubuntu 中编译一下 Linux。编译完成以后使用 tar 压缩命令对其进行压缩并使用 Filezilla 软件将压缩后的 uboot 源码拷贝到Windows 下。
在分析 Linux 的顶层 Makefile 之前,先创建 VSCode 工程,创建过程和 uboot 一样。创建好以后将文件.vscode/settings.json 改为如下所示内容:
{
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.o":true,
"**/*.su":true,
"**/*.cmd":true,
"Documentation":true,
/* 屏蔽不用的架构相关的文件 */
"arch/alpha":true,
"arch/arc":true,
"arch/arm64":true,
"arch/avr32":true,
"arch/[b-z]*":true,
"arch/arm/plat*":true,
"arch/arm/mach-[a-h]*":true,
"arch/arm/mach-[n-z]*":true,
"arch/arm/mach-i[n-z]*":true,
"arch/arm/mach-m[e-v]*":true,
"arch/arm/mach-k*":true,
"arch/arm/mach-l*":true,
/* 屏蔽排除不用的配置文件 */
"arch/arm/configs/[a-h]*":true,
"arch/arm/configs/[j-z]*":true,
"arch/arm/configs/imo*":true,
"arch/arm/configs/in*":true,
"arch/arm/configs/io*":true,
"arch/arm/configs/ix*":true,
31
32 /* 屏蔽掉不用的 DTB 文件 */
33 "arch/arm/boot/dts/[a-h]*":true,
34 "arch/arm/boot/dts/[k-z]*":true,
35 "arch/arm/boot/dts/in*":true,
36 "arch/arm/boot/dts/imx1*":true,
37 "arch/arm/boot/dts/imx7*":true,
38 "arch/arm/boot/dts/imx2*":true,
39 "arch/arm/boot/dts/imx3*":true,
40 "arch/arm/boot/dts/imx5*":true,
41 "arch/arm/boot/dts/imx6d*":true,
42 "arch/arm/boot/dts/imx6q*":true,
43 "arch/arm/boot/dts/imx6s*":true,
44 "arch/arm/boot/dts/imx6ul-*":true,
45 "arch/arm/boot/dts/imx6ull-9x9*":true,
46 "arch/arm/boot/dts/imx6ull-14x14-ddr*":true, 47 },
48 "files.exclude": {
49 "**/.git": true,
50 "**/.svn": true,
51 "**/.hg": true,
52 "**/CVS": true,
53 "**/.DS_Store": true,
54 "**/*.o":true,
55 "**/*.su":true,
56 "**/*.cmd":true,
57 "Documentation":true, 58
59 /* 屏蔽不用的架构相关的文件 */
60 "arch/alpha":true,
61 "arch/arc":true,
62 "arch/arm64":true,
63 "arch/avr32":true,
64 "arch/[b-z]*":true,
65 "arch/arm/plat*":true,
66 "arch/arm/mach-[a-h]*":true,
67 "arch/arm/mach-[n-z]*":true,
68 "arch/arm/mach-i[n-z]*":true,
69 "arch/arm/mach-m[e-v]*":true,
70 "arch/arm/mach-k*":true,
71 "arch/arm/mach-l*":true, 72
73 /* 屏蔽排除不用的配置文件 */
74 "arch/arm/configs/[a-h]*":true,
75 "arch/arm/configs/[j-z]*":true,
76 "arch/arm/configs/imo*":true,
77 "arch/arm/configs/in*":true,
78 "arch/arm/configs/io*":true,
79 "arch/arm/configs/ix*":true,
80
81 /* 屏蔽掉不用的 DTB 文件 */
82 "arch/arm/boot/dts/[a-h]*":true,
83 "arch/arm/boot/dts/[k-z]*":true,
84 "arch/arm/boot/dts/in*":true,
85 "arch/arm/boot/dts/imx1*":true,
86 "arch/arm/boot/dts/imx7*":true,
87 "arch/arm/boot/dts/imx2*":true,
88 "arch/arm/boot/dts/imx3*":true,
89 "arch/arm/boot/dts/imx5*":true,
90 "arch/arm/boot/dts/imx6d*":true,
91 "arch/arm/boot/dts/imx6q*":true,
92 "arch/arm/boot/dts/imx6s*":true,
93 "arch/arm/boot/dts/imx6ul-*":true,
94 "arch/arm/boot/dts/imx6ull-9x9*":true,
95 "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
96 }
97 }
创建好 VSCode 工程以后就可以开始分析 Linux 的顶层 Makefile 了。