List of all partitions:
No filesystem could mount root, tried: ext2
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
Backtrace:
[<c003167c>] (dump_backtrace+0x0/0x114) from [<c02c0a64>] (dump_stack+0x18/0x1c)
r6:00008000 r5:c03c8ca4 r4:c03c8ca4
[<c02c0a4c>] (dump_stack+0x0/0x1c) from [<c02c0acc>] (panic+0x64/0x180)
[<c02c0a68>] (panic+0x0/0x180) from [<c0009134>] (mount_block_root+0x260/0x2b0)
r3:00000000 r2:00000020 r1:cf82df60 r0:c035b458
[<c0008ed4>] (mount_block_root+0x0/0x2b0) from [<c00091d8>] (mount_root+0x54/0x6c)
[<c0009184>] (mount_root+0x0/0x6c) from [<c0009360>] (prepare_namespace+0x170/0x1c4)
r5:c00267ed r4:c03c8480
[<c00091f0>] (prepare_namespace+0x0/0x1c4) from [<c0008610>] (kernel_init+0x110/0x150)
r5:c0025dac r4:c03c8420
[<c0008500>] (kernel_init+0x0/0x150) from [<c0049e90>] (do_exit+0x0/0x6d4)
r5:c0008500 r4:00000000
定位步骤:
1、是否内核参数里的initrd的地址和大小不对?
u-boot的处理:setup_initrd_tag,initrd_start/initrd_end是根据bootm参数的第二个地址然后解析头(image_header_t)而得来的,所以这个参数不应该有问题才对。
#ifdef CONFIG_INITRD_TAG
if (initrd_start && initrd_end)
setup_initrd_tag (bd, initrd_start, initrd_end);
#endif
内核的处理:
ATAG_INITRD
static int __init parse_tag_initrd(const struct tag *tag)
{
printk(KERN_WARNING "ATAG_INITRD is deprecated; "
"please update your bootloader.\n");
phys_initrd_start = __virt_to_phys(tag->u.initrd.start);
phys_initrd_size = tag->u.initrd.size;
return 0;
}
__tagtable(ATAG_INITRD, parse_tag_initrd);
bootargs: initrd = start,size
static int __init early_initrd(char *p)
{
unsigned long start, size;
char *endp;
start = memparse(p, &endp);
if (*endp == ',') {
size = memparse(endp + 1, NULL);
phys_initrd_start = start;
phys_initrd_size = size;
}
return 0;
}
early_param("initrd", early_initrd);
优先级也是bootargs>ATAG_INITRD,但是我没有在bootargs里定义initrd参数,所以默认从文件里去读应该不会有什么问题的。
而且加了打印也确认这个start和size是OK的。
2、研究initrd启动流程
由于我使用的是cpi