1.开发环境
主机:Ubuntu 18.04.5
交叉编译链:aarch64-none-elf-
linux内核:4.19.165
2.配置Linux内核
1)Initial RAM filesystem and RAM disk (initramfs/initrd) support
使内核支持以ramdisk文件系统作为根文件系统启动。
从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_BLK_DEV_INITRD=y
2)RAM block device support
使内核支持虚拟块设备节点,选中这个,/dev/目录下才会出现ramX的虚设块设备节点,,才能将这个节点作为根文件系统挂载。
从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_BLK_DEV_RAM=y
3)Default RAM disk size (kbytes)
ramdisk默认大小,这个大小应该适配你制作的ramdisk的大小。
从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_BLK_DEV_RAM_SIZE=4096
4)Second extended fs support(可选)
从menuconfig下图所在位置配置,或者直接在配置文件添加CONFIG_EXT2_FS=y
ramdisk采用ext4格式文件系统也可以挂载,不过要保持一致性
3.制作根文件系统
1)建立必要的根文件系统目录结构
mkdir ramdisk
cd ramdisk
mkdir bin dev etc home lib mnt proc root sbin sys tmp usr var
mkdir usr/bin usr/sbin usr/lib lib/modules
2)添加控制台设备文件
mknod -m 666 console c 5 1 (备注:创建控制台设备文件)
3)添加配置文件
可以复制busybox\examples\bootfloppy\etc目录下的配置文件
4)编译busybox
busybox包含linux常用命令,如ls、cp、cat等等等
下载:
可以在busybox官网挑选稳定版本下载源码(建议选择较高版本的busybox,会省很多事,常用的命令都已经默认配置了,就不需要自己再去配置)。
busybox官网地址:https://busybox.net/
配置:
下载并解压后,进入busybox根目录,执行menuconfig进行配置
busybox静态编译,可以不需要再关心动态库(非必选,看情况,我这里是除了busybox,没有其他可执行程序需要用到动态库,懒得去配置动态库了)
工具链,如aarch64-linux-gnu-
sysroot:指定sysroot路径,避免找不到交叉编译的库和头文件
编译
make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-
安装
通过CONFIG_PREFIX指定安装目录,如安装到上一级的install目录
make CONFIG_PREFIX=…/install install
最后将busybox安装目录中的内容拷贝到ramdisk目录下即可
4.制作ramdisk镜像
#通过dd命令制作指定大小的文件,bs表示一次读写大小,count表示读写次数,bs*count要等与之前在内核配置的ramdisk大小
dd if=/dev/zero of=ramdisk.img bs=1K count=4096
#格式化为ext2文件系统,-d 选项指定文件系统根目录为之前建立的ramdisk目录
mkfs.ext2 -i 4096 ramdisk.img -d ramdisk
#尽可能压缩文件系统,此步骤为可选项,压不压缩只影响ramdisk文件的大小
gzip -9 -f ramdisk.img
5.在嵌入式开发板启动ramdisk
在uboot配置环境变量
setenv bootargs initrd=0x52000000,0x400000 root=/dev/ram0 rw rootwait rootfstype=ext2
setenv bootcmd mmc dev 1; ext4load mmc 1:1 Image; ext4load mmc 1:1 0x48000000 my.dtb; ext4load mmc 1:1 0x52000000 ramdisk.img.gz; booti 0x48080000 - 0x48000000
最后输入boot即可启动ramdisk。
参考:https://blog.csdn.net/u014213012/article/details/51582826