
在移植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.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
支持,并設置大?。?/p>
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
標簽: