实验环境要改成Linux 2.6内核,但实验室里的arm2410s开发板安装的Linux内核都是2.4的,不得不将所有开发板重新烧写内核!
由于内核镜像和根文件系统的改变,需要修改flash分区,即修改vivi源码smdk.c文件中的mtd_partition_t default_mtd_partitions[],重新编译vivi,再将vivi烧写到开发板上。但是烧写完vivi后,有些开发板的分区并不正确。其中,vivi是正确的,因为同样的vivi,在一些板上烧成功;但对于某些板上面修改的分区并不起作用,不管你把vivi重新烧上N遍,flash分区还是不正确。这样,我们只能在vivi中使用“bon part ”命令对flash进行重新分区(bon part命令的使用方法见下面)。重新分区后,可以通过“bon part info”命令查看新的bon分区列表(使用“part show”看到的是原来的MTD分区列表)。flash分区正确后,再重新烧写vivi。烧写完vivi后,启动vivi。这时,用“part show”查看到的分区信息就是正确的分区信息了。最后,再将Linux内核镜像和根文件系统烧写到开发板上就OK了。
命令的详细格式如下:
part add name offset size flag
参数name 是要添加的分区的分区名称;
参数offset 是要添加的分区的偏移(相对于整个MTD 设备的起始地址的偏
移,在ARMer9 系统中不论配置的是NOR Flash,还是NAND Flash,都只
注册了一个mtd_info 结构,也就是说逻辑上只有一个MTD 设备,这个MTD
设备的起始地址为0x00000000);
参数size 是要添加的分区的大小,单位为字节;
参数flag 是要添加的分区的标志,参数flag 的取值只能为以下字符串(请注
意必须为大写)或者通过连接符“|”将以下字符串组合起来的组合字符串。
这个标志表示了这个分区的用途
“BONFS” —— 作为BONFS 文件系统的分区;
“JFFS2” —— 作为JFFS2 文件系统的分区;
“LOCK” —— 该分区被锁定了;
“RAM” —— 该分区作为RAM 使用。
BON 分区表被保存到NANDFlash 的最后0x4000 个字节中,即在NAND Flash 的0x03FFC000 ~0x33FFFFFF 范围内,分区表起始于0x03FFC000(注意: BON 分区是只
针对NAND Flash 设备的一种简单的分区管理方式)。
命令的详细格式如下:
bon part offsets1[flag] offsets2[flag] offsets3[flag] ⋯⋯
参数offsetsN 是每个BON 分区的起始地址;
flag 是跟每个BON 分区的起始地址后面的标识符,这个标识的作用是前面数值的单位,‘k’’或‘K’表示kilo,千;‘m’或‘M’表示mega,兆。
如果再跟上‘:’,后面再跟上‘m’或‘M’,表示该分区被标记为MTD 分区,
如果没有‘:’以及后面的字母‘m’ 或‘M’,则表示该分区被标记为BON 分区。
bon part 命令在建立系统的BON 分区表,会检测每个分区是否有坏块
(Samsung 的NAND Flash 芯片K9S1208U0M,一个块含32 个页,一个
页有512 个字节,一个块有16K 字节,即0x4000),如果发现坏块将标记
出来,并且在分区表中体现,分区的大小将减去坏快的容量,得到实际可用
的分区容量。bon part info 命令执行后显示的信息中, number_of_badblock
所指示的就是分区中的坏块数目。
Kernel panic: VFS: Unable to mount root fs on 61:01
|
vivi、kernel、根文件镜像都是正常下载,怎么会找不到那?
查看vivi参数:param show
|
这里显示也是正常的,问题在那?
bon part show 显示如下:
|
现在知道了原来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中,代码:
|
这里就是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中的相应分区,
1: 0x00030000 0x00100000 00000000 0 1M
|
|