一、Linux移植概述
Linux 的移植主要包括3部分:
- 移植bootloader 代码, Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。 这段bootloader程序会先初始化DDR等外设, 然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。 bootloader 有很多,常用的就是 U-Boot。DDR就是随机存储器的一种,也就是内存。
bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样,bootloader 就相当于 BIOS。 - 移植Linux 内核,Linux内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。内核负责管理系统的硬件设备。
- 移植根文件系统(rootfs),Linux 中的根文件系统更像是一个文件夹或者叫做目录,在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是 Linux 运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等。根文件系统里面包含了一些最常用的命令和文件。
U-Boot、Linux kernel 和 rootfs这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。
二、UBOOT简介
uboot 的全称是Universal Boot Loader,遵循 GPL 协议的开源软件。
uboot 是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。uboot 官网为 https://www.denx.de/wiki/U-Boot/。
但我们移植uboot时一般不会直接用 uboot 官方的源码的,官方的源码是给半导体厂商准备的,半导 体厂商会根据自家的芯片,维护自己芯片对应的uboot。
三、NXP uboot测试
uboot移植并不需要从零开始将 uboot 移植到我们现在所使用的开发板上。因为半导体厂商通常都会自己做一个开发板(原厂开发板), 将uboot移植到他们自己的原厂开发板上,再将这个uboot(原厂BSP 包)发布出去。
市面上的开发板,通常会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,如正点原子和野火的 I.MX6ULL 开发板参考的就是NXP官方的 I.MX6ULL EVK 开发板做的硬件。
四、编译环境搭建
1、交叉编译工具链下载并设置
2、编译原厂uboot
首先、在Ubuntu中下载解压原厂uboot源码,然后编译uboot。
编译uboot使用下面3条指令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
这3条命令中 :
ARCH=arm
设置目标为 arm 架构CROSS_COMPILE
指定所使用的交叉编译器。- 第1条命令相当于
make distclean
,目的是清除工程,一般在第一次编译的时候最好清理一下工程。 - 第2条指令相当于
make mx6ull_14x14_evk_emmc_defconfig
,用于配置 uboot,配置文件为 mx6ull_14x14_evk_emmc_defconfig。 - 第3条指令相当于
make -j8
,也就是使用8核来编译uboot。
为了方便的执行着3条指令,可以将这些指令写成shell脚本,比如在uboot源码目录下新建一个build.sh文件,写入如下内容:
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
然后编译,编译完成以后uboot 源码多了一些文件,其中u-boot.bin
就是编译出来的 uboot二进制文件。 uboot是个裸机程序, 因此需要在其前面加上头部(IVT、 DCD等数据)才能在I.MX6U上执行,u-boot.imx
文件就是添加头部以后的 u-boot.bin。
u-boot.imx 就是我们最终要烧写到开发板中的 uboot 镜像文件。
3、烧录开发板
这是的烧录开发板,实际是要烧录uboot到SD卡中,然后将SD卡插入开发板,让开发板从SD卡启动(需要在开发板上设置拨码开关来选择启动方式)。
参考资料:安全验证 - 知乎