一、环境、源码包准备:
OS:Linux x86_64
Compiler:arm-linux-gnueabihf-gcc
Compiler Target: 32-bit
Source: busybox1.30.1
编译命令:make ARCH=arm menuconfig,配置交叉编译所需的lib路径,如下:
编译完成后,生成的二进制可执行文件在 _install 目录下,仅包含文件系统基本的命令,构建根文件系统还需要添加很多必要的配置文件(如:/etc/inittab、/etc/fstab等),这些文件依据当前板卡的需求进行生成,一般芯片厂商会提供SDK,带有根文件系统,如果实在没有,建议从现有x86或者ARM板卡上拷贝一份,以此为依据进行修改和调整。
二、制作rootfs镜像
根文件系统目录构建完成后,需要新建ext4空白镜像,命令:
必须在32Bit的linux下,命令:
i、dd if=/dev/zero of=tmp.img bs=一次复制的字节数 count=复制的次数
ii、mkfs.ext4 tmp.img
iii、mount tmp.img /mnt/ -o loop (其中-o loop在某些系统下会出现)
iv、cp ./* /mnt (将根文件系统所有文件夹及文件拷贝到镜像中)
v、umount /mnt (至此,ext4格式的文件系统制作完成,合并镜像时不需要gzip压缩)
三、合并镜像
此处以UBoot推荐的FIT镜像为示例:
命令: ./mkimage -f image_make.its tmp.img
命令参数:mkimage:UBoot编译后生成的工具软件
-f :从文件读取镜像配置信息
image_make.its:制作FIT镜像的描述文件
tmp.img:最终生成的二进制镜像文件名(拓展名是自定义的,依需修改)
其中依赖的 image_make.its文件内容可参考下方:
/dts-v1/;
/ {
description = "ARM Board Base System Images";
#address-cells = <1>;
/* 当前镜像中二进制文件列表 */
images
{
/* ARM内核32Bit处理器,型号:LS1021A */
Kernel-Linux
{
description = "ARM32 Linux Kernel";
data = /incbin/("zImage");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x41000000>;
entry = <0x41000000>;
};
/* ARM处理器设备树文件 */
FDT-Linux
{
description = "ARM Device Tree";
data = /incbin/("Demo.dtb");
type = "flat_dt";
arch = "arm";
compression = "none";
};
/* ARM处理器的文件系统 */
Rootfs-Linux
{
description = "ARM Board Ramdisk";
data = /incbin/("ramdisk.gz");
type = "ramdisk";
arch = "arm";
os = "linux";
compression = "gzip";
};
};
/* 当前镜像中启动配置的镜像信息 */
configurations
{
default = "Demo";
Demo
{
description = "ARM-Board Base System Images";
kernel = "Kernel-Linux";
fdt = "FDT-Linux";
ramdisk = "Rootfs-Linux";
};
};
};
四、在UBoot下调试FIT镜像
4.1、UBoot引导FIT镜像命令:
setenv FIT_ADDR=0x10000000
bootm $FIT_ADDR
4.2、UBoot查看FIT镜像信息:
setenv FIT_ADDR=0x10000000
imls $FIT_ADDR
4.3、非FIT镜像UBoot下启动命令配置
bootm $load_addr $ramdisk_addr $ftd_addr)
或者
bootcmd=cp.b $kernel_addr $load_addr $kernel_size;bootm $load_addr $ramdisk_addr $ftd_addr;
4.4、UBoot中的shell功能
在UBoot下输入 \ 即可进入shell命令行模式,和linux的ssh终端类似,UBoot也实现了bash的功能,可以解释shell脚本。
以上,有问题欢迎指正,谢谢。