|
先介绍一下我的板子,是基于S3C2410的开发板,1M的nor flash, 64M的nand flash。
这块板子更新系统的方法是
1. 使用NFS启动系统
2. 使用bk命令对flash进行分区,并烧写bootloader和kernel
3. 重启后使用bs命令对flash进行格式化,并安装根文件系统
bk的脚本如下:
/bin/imagewrite /dev/mtd/0 -part 0 192k 1216k
/bin/imagewrite /dev/mtd/0 vivi:0
/bin/imagewrite /dev/mtd/0 zImage:192k
bs的脚本如下:
/bin/mkyaffs /dev/mtdblock/0
/bin/mount /dev/mtdblock/0 /mnt
cd /mnt
/bin/tar xzvf /fa-yaffs-v5.tgz
bk的脚本好理解,对flash进行分区,分成了3个区
1. 一个192k的存放vivi的分区
2. 1M存放kernel
3. 剩下的flash一个区
这是在2.4内核/drivers/mtd/nand/smc2410.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,
offset: MTDPART_OFS_APPEND,
mask_flags: MTD_WRITEABLE, /* force read-only */
}
};
看到这里问题就出现了!
在这个文件中mtd被分为了两个区,一个是kernel一个是root,这两个分区的大小和地址都和前面bk脚本的不一样,而且更新系统执行到bs脚本时,他的第一条命令是格式化flash,这样不就把vivi和kernel删除了吗?
但是按照这种步骤走下来系统是能正确启动的,进入linux后,执行
[root@fa /]# cat /proc/mtd
dev: size erasesize name
mtd0: 04000000 00004000 "Samsung K9D1208V0M" (mtd设备只有一个)
[root@fa /]# cat /proc/partitions
major minor #blocks name
(分区信息为空)
看到这些我就晕了,想不出怎么解释这种分区情况,难道是系统把nor flash看成是字符设备存储器,nand flash是块设备存储器,在bk脚本的第一句分区信息是给1M的nor flash分区,然后把vivi和kernel烧录到上面,然后再执行bs脚本时格式化快设备存储器,即格式化nand flash是自然就不会删除vivi和kernel。但这样解释有几点还是搞不明白
1. 如何在1M的nor flash上进行这样的分区 0 192k 1216k,已经超出了存储范围
2. smc2410.c中tmd分区结构体中的分区划分不管大小还是地址都和上边的猜测不符
3. 为什么/proc/mtd分区设备只有一个
4. 为什么分区信息/proc/partitions为空
我是初学,说得不对大家可八要笑话我。
希望大虾能给我解除这个困惑!!谢谢!! |
|