Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1645966
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: LINUX

2009-05-20 19:14:54

  今天碰到了问题,vivi启动内核后,提示无法找到根文件系统,如下:
 
   FAT: unable to read boot sector
   Kernel panic: VFS: Unable to mount root fs on 61:01
 
   使用part show 显示如下:
 

vivi> part show
mtdpart info. (5 partitions)
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00100000 0 1M
root : 0x00130000 0x01400000 4 20M
usr : 0x01530000 0x02acc000 8 42M+816k

vivi、kernel、根文件镜像都是正常下载,怎么会找不到那?

查看vivi参数:param show

vivi> param show
Number of parameters: 9
name : hex integer
-------------------------------------------------------------
mach_type : 000000c1 193
media_type : 00000003 3
boot_mem_base : 30000000 805306368
baudrate : 0001c200 115200
xmodem_one_nak : 00000000 0
xmodem_initial_timeout : 000493e0 300000
xmodem_timeout : 000f4240 1000000
ymodem_initial_timeout : 0016e360 1500000
boot_delay : 00020000 131072
Linux command line: noinitrd root=/dev/bon/1 init=/linuxrc console=ttyS0

这里显示也是正常的,问题在那?

bon part show 显示如下:

vivi> bon part show
BON info. (3 partitions)
No: offset size flags bad
---------------------------------------------
 0: 0x00000000 0x00030000 00000000 0 192k
 1: 0x00030000 0x00100000 00000000 0 1M
 2: 0x00100000 0x03ecc000 00000000 0 62M+816k

现在知道了原来vivi下part show 中的root地址是0x00130000,而在bon下的root为0x0010000,这样,虽然给kernel传递的参数是root=/dev/bon/2,但bon的第三个分区的地址和实际的vivi根文件镜像的地址是不一样,当然无法找到文件系统了。

  这里怎么来解释两个不同的分区,part show 与bon part show 的不同,首先需要明白的是,vivi中的part show 显示的实际是nand的mtd分区,在vivi中mtd分区一般有5个,分别用于存放vivi、kernel、root、param、usr。 在vivi的load flash vivi/kernel/root x/y ,这类的命令实质是将输入写入mtd相对应分区中去,所以执行

load flash root x后,实际的根文件系统实质是写入到mtd的root分区,而这个分区的地址是0x00130000,而vivi给kernel传递的参数是bon/2,这个地址是0x0010000, 当然没办法找到文件系统了,在vivi的源码中,关于 mtd分区的定义在文件:arch/s3c2410/smdk.c中,代码:

#ifdef CONFIG_S3C2410_NAND_BOOT
mtd_partition_t default_mtd_partitions[] = {
    {
        name:        "vivi",
        offset:        0,
        size:        0x00020000,
        flag:        0
    }, {
        name:        "param",
        offset:        0x00020000,
        size:        0x00010000,
        flag:        0
    }, {
        name:        "kernel",
        offset:        0x00030000,
        size:        0x000C0000,
        flag:        0
    }, {
        name:        "root",
        offset:        0x00100000,
        size:        0x00140000,
        flag:        MF_BONFS
    }
};
#endif

这里就是mtd分区的信息。

那么bon分区是什么? 这里需要明确一个概念,mtd分区仅在下载文件时有用,相当与电脑下载东西,把文件放在那个盘相似,需要注意,我们存放数据是在nand flash中,而在kernel下,这是几个文件,可以在/dev/bon下看到三个或者2个设备,这与你分区的数量有关,我们有3个分区,所以其下有三个设备文件0 1 2 ,而vivi传递给内核的参数是:
Linux command line: noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0

这句话给了四条信息,noinitrd这条我不知道,而root=/dev/bon/2是告诉内核文件系统在、/dev/bon/2的设备下,实质是告诉内核文件系统在nand flash中的区域的首地址,init=/linuxrc是告诉内核,启动首先执行的脚本是linuxrc.从上边我们可以看到bon分区中的bon/2的地址与mtd中的root的地址是不一样的,所以内核就找不到文件系统,提示:

FAT: unable to read boot sector
Kernel panic: VFS: Unable to mount root fs on 61:01


怎么来解决这个问题:

很简单,对nand flash重新分区,bon part 0  XX  XX ,这里的地址一定要对应vivi中的相应分区,

 

vivi> bon part show
BON info. (3 partitions)
No: offset size flags bad
---------------------------------------------
 0: 0x00000000 0x00030000 00000000 0 192k
 1: 0x00030000 0x00100000 00000000 0 1M
 2: 0x00100000 0x03ecc000 00000000 0 62M+816k

vivi> part show
mtdpart info. (5 partitions)
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00100000 0 1M
root : 0x00130000 0x01400000 4 20M
usr : 0x01530000 0x02acc000 8 42M+816k

我们需要做的工作让bon分区的root区首地址和mtd分区的root首地址相对应。mtd 中root的首地址为0x00130000,转换为十进制为:1245184
 所以对bon分区: bon part 0 192k 1245184,然后param save ,在冲下vivi kernel  根文件系统,一切OK!
  在kernel/drivers/mtd/mand/smc_s3c2410.c中也有 mtd分区的信息,不知道有什么用,等待高人知道。代码如下:
 

static struct mtd_partition smc_partitions[] = {
    {
        name:        "kernel",
        size:        0x000c0000,
        offset:        0x0,
        mask_flags:    MTD_WRITEABLE,    /*force read-only */
    }, {
        name:        "root",
        size:        0x00a00000,
    //    size:        0x00a00000,

        offset:        0x00100000,
    //    offset:        MTDPART_OFS_APPEND,

        mask_flags:    MTD_WRITEABLE, /* force read-only */
    }
};
#endif

阅读(2199) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

tastesweet2009-08-17 10:28:02

在vivi中,会有一个bon分区和mtd分区,这两个东西需要去仔细辨别下, 在启动过程中,bootloader会给kernel传递一些参数告诉kernel根文件系统所在分区,可以在 shell下: cat /proc/cmdline看到这些参数。 一个分区是没有办法让kernel查找到的, 你仔细检查下

fly_with_linux2009-08-16 10:50:06

但是,我只分一个区,也就是bon part 0 为什么内核就能找到呢

skyily2009-06-23 11:01:45

我到你这里来找我落下的课程了,哈哈,

skyily2009-06-23 11:01:36

我到你这里来找我落下的课程了,哈哈,

chinaunix网友2009-05-22 14:04:12

好服月租型IT服务台登录中国,诚邀阁下莅临体验! 月租型ITSM软件,注册即可使用! 详情请登录官方网站:http://www.servicezon.com