我在使 initramfs 与 SAMA5D27 SOM1 评估套件一起运行时遇到一些困难。我正在尝试拥有一个功能齐全的 initramfs。我首先验证了当与 SD 上的文件系统一起使用时我有一个功能正常的 Linux。
我使用了以下 bootcmd:
=> fatload mmc 0:1 0x24000000 uramdisk.img; fatload mmc 0:1 0x22000000 zImage; fatload mmc 0:1 0x21000000 board.dtb; bootz 0x22000000 0x24000000 0x21000000;"
然后我尝试按如下方式制作 initramfs:我为 initramfs 配置了内核:
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="/media/sdc/at91/tmp/at91/initramfs.cpio"
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
创建 ramfs:cd 到 rootfs 并:
创建虚拟磁盘:
# sudo find . | sudo cpio -H newc -o | gzip > ../uramdisk.cpio.gz
# mkimage -A arm -O linux -T ramdisk -n "Label you want" -d ./ramdisk.img ./uramdisk.img
更改引导参数:
setenv bootcmd_boot2 "fatload mmc 0:1 0x23000000 uramdisk.img; fatload mmc 0:1 0x22000000 zImage; fatload mmc 0:1 0x21000000 board.dtb; bootz 0x22000000 0x24000000 0x21000000;"
setenv bootargs "console=ttyS0,115200 atmel.pm_modes=standby,ulp1"
它仍然如下:
=> boot
51725888 bytes read in 3093 ms (15.9 MiB/s)
3903560 bytes read in 243 ms (15.3 MiB/s)
26651 bytes read in 14 ms (1.8 MiB/s)
## Loading init Ramdisk from Legacy Image at 24000000 ...
Image Name: Label you want
Image Type: ARM Linux RAMDisk Image (uncompressed)
Data Size: 51725824 Bytes = 49.3 MiB
Load Address: 24000000
Entry Point: 24000000
Verifying Checksum ... OK
## Flattened Device Tree blob at 21000000
Booting using the fdt blob at 0x21000000
Loading Ramdisk to 24a00000, end 27b54600 ... OK
Loading Device Tree to 249f6000, end 249ff81a ... OK
Starting kernel ...
Booting Linux on physical CPU 0x0
Linux version 4.7.10+ (user@user-VirtualBox) (gcc version 6.4.0 (Buildroot 2018.02-00001-g3ef3174) ) #6 Wed Nov 7 12:20:42 CST 2018
CPU: ARMv7 Processor [410fc051] revision 1 (ARMv7), cr=10c53c7d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine model: Atmel SAMA5D27 SOM1 EK
Memory policy: Data cache writeback
CPU: All CPU(s) started in SVC mode.
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line: console=ttyS0,115200 atmel.pm_modes=standby,ulp1
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 69684K/131072K available (6298K kernel code, 183K rwdata, 1716K rodata, 1024K init, 147K bss, 61388K reserved, 0K cma-reserved)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xc8800000 - 0xff800000 ( 880 MB)
lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.text : 0xc0008000 - 0xc08d3a18 (9007 kB)
.init : 0xc0900000 - 0xc0a00000 (1024 kB)
.data : 0xc0a00000 - 0xc0a2dc20 ( 184 kB)
.bss : 0xc0a2dc20 - 0xc0a52948 ( 148 kB)
...
mmcblk0: mmc0:0007 SS08G 7.21 GiB
mmcblk0: p1 p2
**RAMDISK: Couldn't find valid RAM disk image starting at 0.
VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6**
Please append a correct "root=" boot option; here are the available partitions:
0100 8536 ram0 (driver?)
b300 7563264 mmcblk0 driver: mmcblk
b301 131072 mmcblk0p1 00070105-01
b302 131072 mmcblk0p2 00070105-02
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU: 0 PID: 1 Comm: swapper Not tainted 4.7.10+ #6
Hardware name: Atmel SAMA5
[<c010cb3c>] (unwind_backtrace) from [<c010a640>] (show_stack+0x10/0x14)
[<c010a640>] (show_stack) from [<c0165920>] (panic+0xc4/0x244)
[<c0165920>] (panic) from [<c09011c8>] (mount_block_root+0x1b0/0x280)
[<c09011c8>] (mount_block_root) from [<c09014a4>] (mount_root+0x120/0x128)
[<c09014a4>] (mount_root) from [<c0901628>] (prepare_namespace+0x17c/0x1c4)
[<c0901628>] (prepare_namespace) from [<c0900df0>] (kernel_init_freeable+0x1b0/0x1c0)
[<c0900df0>] (kernel_init_freeable) from [<c06354e4>] (kernel_init+0x8/0x110)
[<c06354e4>] (kernel_init) from [<c0107498>] (ret_from_fork+0x14/0x3c)
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
random: nonblocking pool is initialized
我只有 128MByte 内存(1Gb),也许我不能使用与 u-boot 加载它的地址相同的 ramfs 的加载地址,即使它没有压缩?
答案1
绝对值得检查的一件事是 ramfs 的加载地址。它似乎被 zImage 部分超载。
您的内核大小为 25859560 字节 = 0x018A 95E8。它在 0x22000000 处加载,在 0x238A 95E8 处结束,因此与您的 ramfs 广告 0x23000000 重叠加载
在不详细了解您的主板的情况下,我只会尝试在 0x24000000 处加载 ramdist
答案2
解决如下:
- bootargs 应添加 root=/dev/ram
- 创建 cpio 的 rootfs 应该在里面添加 init (在 /init 中),
关于(2),我应该注意到,我没有找到 init 应该驻留在“/init”中的任何地方(通常在 /sbin/init 中)。