linux kernel version :4.4.38
hardware :exynos4412-tiny4412
起因:我将linux kernel从3.5升级到4.4后,发现之前的方法挂载rootfs行不通了(之前是将rootfs放在了SD卡的分区),linux kernel无法发现rootfs导致系统无法启动(怀疑4.4内核启动顺序,挂载rootfs前sd卡驱动还没有驱动导致无法发现rootfs对应的分区),于是尝试ramdisk的方式挂载。
之前有博客介绍了最小rootfs的制作方法(https://www.cnblogs.com/ethandlwang/p/14789266.html),这里拿来用
创建一个目录my_rootfs(根据自己需要命名),将最小rootfs目录放在这个目录下
以下命令都在my_rootfs下执行
sudo dd if=/dev/zero of=ramdisk bs=1k count=8192
生成一个叫ramdisk的空文件,大小为8M
sudo mkfs.ext4 -F ramdisk
将其初始化为ext4文件系统格式
sudo mkdir -p ./initrd sudo mount -t ext4 ramdisk ./initrd
创建initrd文件夹,将ramdisk的文件系统挂载到initrd
sudo cp rootfs/* ./initrd -raf
将最小文件系统里面的所有文件拷贝到ramdisk文件系统
sudo mknod initrd/dev/console c 5 1 sudo mknod initrd/dev/null c 1 3
创建必要的字符设备
sudo umount ./initrd
卸载文件系统
sudo gzip --best -c ramdisk > ramdisk.gz
压缩并打包成ramdisk.gz
sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
最后使用mkimage命令生成ramdisk.img即为我们需要的ramdisk文件系统。
bootargs=root=/dev/ram0 rw ramdisk=8192 initrd=0x42000040,8M console=ttySAC0,115200 init=/linuxrc mem=1024M
在uboot里面使用bootargs参数将rootfs信息传递给kernel
bootcmd=movi read kernel 0 40600000; movi read rootfs 0 42000000 800000; movi read dtb 0 43000000; bootm 40600000 42000000 43000000
uboot使用bootcmd将rootfs读入内存,并将地址通过bootm通知内核