移植linux内核到s3c6410(根文件系统加载失败问题解决:Kernel panic - not syncing: VFS: Unable to mount root fs)

本文档详细记录了解决Linux内核移植到s3c6410处理器上时遇到的根文件系统加载失败的问题。通过检查内核参数、initrd的加载流程以及分析启动日志,发现错误在于bootargs参数设置不正确以及initrd中文件拷贝错误。最终,通过调整参数、修复脚本错误以及更新编译器配置,成功解决了问题并使内核正常启动。
摘要由CSDN通过智能技术生成
异常打印: 

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值