本文主要是介绍bon、mtd在vivi中的不同,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天碰到了问题,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
|
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(1193) | 评论(5) | 转发(0) |
上一篇:向vivi中添加自己的命令
下一篇:根文件系统制作小记
相关热门文章
- 万维网之父:警惕政府正在接管...
- 扑克透视眼镜 牌九透视眼镜...
- 武汉麻将透视眼镜 黄金色子...
- ubuntu下vsftpd配置详细篇 ...
- 痠奶菌多就必定好嗎?...
- linux 常见服务端口
- 什么是shell
- linux socket的bug??
- linux的线程是否受到了保护?...
- 一个适用于windows和linux的抓...
- debian7系统与ATI X2300显卡...
- ubuntu sysklogd之配置文件介...
- 自己用的ubuntu环境搭建(一)...
- linux 学习心得
- 用户输入操作和数据的显示...
给主人留下些什么吧!~~
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
回复 | 举报
这篇关于bon、mtd在vivi中的不同的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!