接着之前的说
step6:
1:接下来调用 jffs2_build_filesystem 函数去建立文件系统,首先是设置scan flag位,进入scan.c中进行扫描,调用的函数是jffs2_scan_medium
其中有个配置是关于nand flash的CONFIG_JFFS2_FS_WRITEBUFFER,我使用的是nor,所以用不到,在网上找到解释如下
JFFS2_FS_WRITEBUFFER + bool "JFFS2 write-buffering support" + depends on JFFS2_FS + default y help - This enables the experimental support for NAND flash in JFFS2. NAND - is a newer type of flash chip design than the traditional NOR flash, - with higher density but a handful of characteristics which make it - more interesting for the file system to use. Support for NAND flash - is not yet complete and may corrupt data. For further information, - including a link to the mailing list where details of the remaining - work to be completed for NAND flash support can be found, see the - JFFS2 web site at <http://sources.redhat.com/jffs2>. + This enables the write-buffering support in JFFS2. - Say 'N' unless you have NAND flash and you are willing to test and - develop JFFS2 support for it.2: 它会找一个大小去尝试建立一个buffer,这个buffer会用来作为读buffer,看里面有多少个连续的0xff,PAGE_SIZE的概念。这个定义machine/param.h中,arm架构这个是4k一个页。所以它用这个大小来建立buffer
它会按照PAGE_SIZE分配空间。然后大循环每个sector,为什么根据4k大小去擦除每个64k的sector,现在还不清晰,可能就是个尝试吧。其实只是分配了这么多空间而已,进入到函数jffs2_scan_eraseblock后。每次按照EMPTY_SCAN_SIZE(256个) 对每个sector读回数据填入buffer,如果都是ff那么认为是空的,所以是可以擦除的。这个时候的状态是BLK_STATE_ALLFF
当然,如果在256的前面一些是ff,后面不是了,那么free space就是前面一些,这个时候调用
if ((err = jffs2_prealloc_raw_node_refs(c, jeb, 1)))
return err;
if ((err = jffs2_scan_dirty_space(c, jeb, ofs)))
return err;
注意如果第一个成功,才会执行第二个函数。这种情况说明里面有数据了,所以要研究这两个函数,看怎么去擦除。这部分放到后面去研究
因为我是第一次擦除,所以都是0xff,所以直接就退出jffs2_scan_eraseblock了。接着进行下一个sector的scan。如果返回都是ff,那么说明这一区间满足我们认为的空block的条件。但其实这时候不能够确定整个块是完全被擦除的。所以我们将其标记为要擦除。并加入到要擦除的list中。scan这一部分就是粗略的方法判断flash中的块是否应该标记为可擦除。
接下来将擦除的这个list加入到erase_pending_list中