在移植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 genext2fs
ramdisk
制作脚本:
genext2fs -b 16384 -d /home/book/rootfs ramdisk.image
gzip –v9 ramdisk.image
mkimage -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=15360
mke2fs –F –v –m 0 ramdisk.image
mount –o loop ramdisk.image /mnt/loop
cp -a rootfs/* /mnt/loop
umount /mnt/loop
gzip –v9 ramdisk.image
mkimage -A arm -O linux -T ramdisk -C gzip -n 'xx ramdisk filesystem' -d ramdisk.image.gz uramdisk.image.gz
过程类似,只不过是先制作一个空的镜像,然后拷贝文件系统的内容。
修改uboot
的环境变量:
setenv initrd_high=0xffffffff
setenv 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
END
来源:嵌入式Linux充电站
版权归原作者所有,如有侵权,请联系删除。
▍推荐阅读
C语言,环形队列
嵌入式开发,要不要接私活?
世界上最流行的软件,抛弃了Git