记录_第三十五章

如何移植 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 文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是不想再当小白的黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值