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通知內核