当前位置: 代码迷 >> 驱动开发 >> jffs2文件系统的不解
  详细解决方案

jffs2文件系统的不解

热度:38   发布时间:2016-04-28 10:14:11.0
jffs2文件系统的困惑
我的nandflash大小是256M,擦除块大小是128K,在制作文件系统的时候用的命令是:
mkfs.jffs2 -r mtd -o fs.jffs2 -e 0x20000 --pad=0x500000 -s 0x800 –n -l
这样制作出来的文件系统能用,开始也没什么问题,但是后来就越来越多的出现问题了,在终端里,凡是涉及到flash操作的东西,比如cp,甚至程序进行读写文件的时候,有时系统会卡死,而且出错的几率越来越高

我现在有个疑问,在制作时的命令参数中,-pad一项,网上好多解释都说,“用16進制表示所要輸出檔案的大小,也就是root.jffs2的size。很重要的是,為了不浪費flash空間,這個值最好符合flash driver的區塊大小”。

还有一篇日志是说,如果一个文件系统里面的东西只有2M,如果不用这个参数的话,生成的fs只有2M,烧进一个32M大小的nandflash,这样可用的空间仍然只有2M,为了能都用上这32M的空间,需要制定pad大小为32M。

在我的命令中,pad制定为5M,实际上生成的文件系统大约为18M,这样问题就来了:

1、实际文件比制定的pad大小要大,这样pad参数是不是就没有作用了?
2、按照我的命令,pad为5M,烧进一个256M大小的nandflash,我的可用空间为多大?
3、我把这样生成的fs烧进nandflash,曾经存过至少100M的文件,没有出错,这是为什么?
4、我刚才试了一下,把pad参数改成128M和256M,按理说生成的fs是不是应该对应的为128M和256M,剩余空间用1来补齐是吧?可是为什么这样生成的fs大小跟原来的一样啊?


不知道我的理解哪里出了错,有没有清楚的来知道一下啊,分数不多,大家帮帮忙吧
------解决方案--------------------

[[email protected]: /dev/shm
$] mkfs.jffs2 -r mtd -o fs.jffs2 -e 0x20000 --pad=0x500000 -s 0x800 –n -l
mkfs.jffs2: mtd: No such file or directory
[[email protected]: /dev/shm
$] mkdir mtd
[[email protected]: /dev/shm
$] mkfs.jffs2 -r mtd -o fs.jffs2 -e 0x20000 --pad=0x500000 -s 0x800 –n -l
[[email protected]: /dev/shm
$] ls -lh
总用量 5.1M
-rw-r--r-- 1 test test 5.0M 2013-09-05 13:15 fs.jffs2
drwxr-xr-x 2 test test   40 2013-09-05 13:14 mtd
[[email protected]: /dev/shm
$] mkfs.jffs2 -r mtd -o fs.jffs2 -e 0x20000 --pad=0x8000000 -s 0x800 –n -l
[[email protected]: /dev/shm
$] ls -lh
总用量 129M
-rw-r--r-- 1 test test 128M 2013-09-05 13:15 fs.jffs2
drwxr-xr-x 2 test test   40 2013-09-05 13:14 mtd
[[email protected]: /dev/shm
$]

试了一下,--pad是有效的。

关于nand可用空间的问题,这个与你对nand flash所做的分区方式有关系。
通过
cat /proc/mtd

应该能看出来某个mtd设备的大小
通过
df -h

能看挂载之后对应设备的空间大小

1、实际文件比制定的pad大小要大,这样pad参数是不是就没有作用了?
没什么意义

2、按照我的命令,pad为5M,烧进一个256M大小的nandflash,我的可用空间为多大?
如果这个256M空间是做为一个mtd设备来用的,那可用空间就是256-已经使用的空间(但不是pad之后文件的大小,而是其中实际使用空间的大小)

3、我把这样生成的fs烧进nandflash,曾经存过至少100M的文件,没有出错,这是为什么?
同2,如果这个256M空间是做为一个mtd设备来用的,那这个mtd设备的可用空间是大于100M的

4、我刚才试了一下,把pad参数改成128M和256M,按理说生成的fs是不是应该对应的为128M和256M,剩余空间用1来补齐是吧?可是为什么这样生成的fs大小跟原来的一样啊?
操作问题吧,上面我验证是可以用的。



------解决方案--------------------
linux的启动参数中有个"mtdparts="可以用来指定对flash设备的分区方式。
参数的解析和操作是在drivers/mtd/下的代码中做的。

如果是整个flash做为一个mtd设备来用,pad参数最好等于实际的mtd设备的大小(即flash的大小),
这样的话,在把生成的文件烧录到Flash设备上时,实际还实现了一个对flash未使用空间进行格式化的操作。

这样应该能一定程度的减少“随着使用空间变大,中途会比较卡”的问题。