加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【转】内核移植之vivi分区问题

发布时间:2020-12-15 06:11:20 所属栏目:百科 来源:网络整理
导读:实验环境要改成Linux 2.6内核,但实验室里的arm2410s开发板安装的Linux内核都是2.4的,不得不将所有开发板重新烧写内核! 由于内核镜像和根文件系统的改变,需要修改flash分区,即修改vivi源码smdk.c文件中的 mtd_partition_t?default_mtd_partitions[],重

实验环境要改成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了。

?

?

?

1、part add 命令用于添加一个MTD 分区。
命令的详细格式如下:
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 使用。
?
2、bon part 命令用于建立系统的BON 分区表。
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
所指示的就是分区中的坏块数目。
例子:bon part 0 128K 1M 4M 24M
表示(64M没有坏块的情况下)
分区号(NO.)???? 起始地址(offset)?????? 大小(size)
0??????????????????????????????0x0000 0000????????????????? 0x0002 0000(128K)
1??????????????????????????????0x0002 0000???????????????? 0x000e 0000(896K)
2????????????????????????????? 0x0010 0000????????????????? 0x0030 0000(3M)
3????????????????????????????? 0x0040 0000????????????????? 0x0140 0000(20M)
4????????????????????????????? 0x0180 0000????????????????? 0x0280 0000(40M)
摘自:http://blog.chinaunix.net/u3/94039/showart_1933995.html
今天碰到了问题,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, {
????????name:????????"kernel",
????????offset:????????0x00030000,
????????size:????????0x000C0000, {
????????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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读