在移植Linux内核早期时,如果flash等存储设备的驱动还没写好,可以将文件系统放到内存中运行。
【资料图】
此时可以使用ramfs和ramdisk,即将内存的一部分用作文件系统。
ramfs就是将文件系统和内核一起编译,编译出来的镜像就包括 内核本身和文件系统。
内核打开ramfs:
在Initramfs source file(s)选项中,填入文件系统的路径即可。
最后,uboot的bootargs中需要将init=/sbin/init修改为rdinit=/sbin/init,主要就是init和rdinit的区别。
ramdisk也是将内存的一部分用作文件系统,只不过不用像上面一样要重新编译内核。
ramdisk制作可以使用genext2fs工具或者mke2fs等工具制作。
genext2fs安装:
sudo apt-get install genext2fsramdisk制作脚本:
genext2fs -b 16384 -d /home/book/rootfs ramdisk.imagegzip –v9 ramdisk.imagemkimage -A arm-O linux -T ramdisk -C gzip -n "xx ramdisk filesystem" -d ramdisk.image.gz uramdisk.image.gz先使用genext2fs把/home/book/rootfs制作成一个名为ramdisk.image的ramdisk然后使用gizp压缩ramdisk.image,得到ramdisk.image.gz最后用mkimage工具生成uramdisk.image.gz给uboot使用ramdisk制作脚本:
dd if=/dev/zero of=ramdisk.image bs=1k count=15360mke2fs –F –v –m 0 ramdisk.imagemount –o loop ramdisk.image /mnt/loopcp -a rootfs/* /mnt/loopumount /mnt/loopgzip –v9 ramdisk.imagemkimage -A arm -O linux -T ramdisk -C gzip -n "xx ramdisk filesystem" -d ramdisk.image.gz uramdisk.image.gz过程类似,只不过是先制作一个空的镜像,然后拷贝文件系统的内容。
修改uboot的环境变量:
setenv initrd_high=0xffffffffsetenv bootargs console=ttyS0,115200 root=/dev/ram rw init=/sbin/init; bootm ${loadaddr} ${ramdiskaddr} ${fdtaddr}initrd_high为0xffffffff,表示将initrd加载到最高的可用内存地址上。这样可以确保在启动过程中有足够的内存空间来加载initrd文件。
bootargs中,主要是这句:root=/dev/ram rw init=/sbin/init要对。
bootm启动中,loadaddr是内核的加载地址,ramdiskaddr是ramdisk的加载地址,fdtaddr是设备树的加载地址
制作好的uramdisk.image.gz文件系统,可以在uboot中,先通过tftp命令将uramdisk.image.gz加载到某段内存,例如tftp 82000000 uramdisk.image.gz。最后通过bootm启动。
打开ramfs支持:
General setup --- > [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support打开ext2文件系统支持:
File systems --- > < * > Second extended fs support打开ram block支持,并设置大小:
Device Drivers --- > [*] Block devices --- > < * > RAM block device support (16) Default number of RAM disks (65536) Default RAM disk size (kbytes)正确配置后,uboot启动时,能够看到类似如下ramdisk加载的过程:
## Loading init Ramdisk from Legacy Image at 42000000 ... Image Name: Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size: 2168875 Bytes = 2.1 MiB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK 标签: