今天碰到了问题,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) |