如何移植 Linux 内核,得先学习 Linux 内核的顶层 Makefile 文件,顶层 Makefile 控制着 Linux 内核的编译流程。
1.1、 Linux 内核初次编译
编译内核之前需要先在 ubuntu 上安装 lzop 库
sudo apt-get install lzop
移植好的 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

新建“mx6ull_alientek_emmc.sh”的 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
给可执行权限并运行
chmod 777 mx6ull_alientek_emmc.sh
./mx6ull_alientek_emmc.sh
编译的时候会弹出 Linux 图形配置界面,按两下 ESC键退出,退出图形界面以后会自动开始编译 Linux,编译完成

会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件,zImage 就是我们要用的 Linux 镜像文件
arch/arm/boot/dts 下生成很多.dtb 文件,.dtb 是设备树文件
编译 内核的时候可能会提示
“recipe for target ‘arch/arm/boot/compressed/piggy.lzo’ failed”,安装 lzop 库,重新编译内核
sudo apt-get install lzop
脚本 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”,每次都会清理工程,如果通过图形界面配置 Linux,但是还没保存新的配置文件,那么就要慎重使用mx6ull_alientek_emmc.sh 编译脚本了,因为它会把你的配置信息都删除掉
第 3 行,配置工程
第 4 行,打开图形配置界面,对 Linux 进行配置,如果不想每次编译都打开图形配置界面的话可以将这一行删除掉。
第 5 行,执行“make”,编译 Linux 源码。
总的来说先执行“make xxx_defconfig”配置,然后在执行“make”进行编译
1.2、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,
/* 屏蔽掉不用的 DTB 文件 */
"arch/arm/boot/dts/[a-h]*":true,
"arch/arm/boot/dts/[k-z]*":true,
"arch/arm/boot/dts/in*":true,
"arch/arm/boot/dts/imx1*":true,
"arch/arm/boot/dts/imx7*":true,
"arch/arm/boot/dts/imx2*":true,
"arch/arm/boot/dts/imx3*":true,
"arch/arm/boot/dts/imx5*":true,
"arch/arm/boot/dts/imx6d*":true,
"arch/arm/boot/dts/imx6q*":true,
"arch/arm/boot/dts/imx6s*":true,
"arch/arm/boot/dts/imx6ul-*":true,
"arch/arm/boot/dts/imx6ull-9x9*":true,
"arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
},
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": 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,
/* 屏蔽掉不用的 DTB 文件 */
"arch/arm/boot/dts/[a-h]*":true,
"arch/arm/boot/dts/[k-z]*":true,
"arch/arm/boot/dts/in*":true,
"arch/arm/boot/dts/imx1*":true,
"arch/arm/boot/dts/imx7*":true,
"arch/arm/boot/dts/imx2*":true,
"arch/arm/boot/dts/imx3*":true,
"arch/arm/boot/dts/imx5*":true,
"arch/arm/boot/dts/imx6d*":true,
"arch/arm/boot/dts/imx6q*":true,
"arch/arm/boot/dts/imx6s*":true,
"arch/arm/boot/dts/imx6ul-*":true,
"arch/arm/boot/dts/imx6ull-9x9*":true,
"arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
}
}
重点是将各个子目录下的 built-in.o、.a 等文件链接在一起,最终生成 vmlinux 这个 ELF 格式的可执行文件
make zImage 过程
vmlinux 是 ELF 格式的文件,但是在实际中不会使用 vmlinux,而是使用 zImage 或 uImage 这样的 Linux 内核镜像文件
区别
①、vmlinux 是编译出来的最原始的内核文件
②、Image 是 Linux 内核镜像文件,但是 Image 仅包含可执行的二进制数据
③、zImage 是经过 gzip 压缩后的 Image
④、uImage 是老版本 uboot 专用的镜像文件
总结
生成vmlinux ,再将 vmlinux 压缩成我们最常用的 zImage 或 uImage 文件
1497

被折叠的 条评论
为什么被折叠?



