Flash上的FAT文件系统,写FAT表前不用先擦除吗?

guozengzhu   2009-10-16 22:12 楼主
对于Flash来说,写操作必须在空白区域进行,若此区域有数据,则必须先擦除(erase)然后才能写,切擦除是以块(block)为单位进行的。
对于FAT32文件系统来说,FAT表存在于保留扇区和根目录之间,对Flash里文件的读写几乎都要修改FAT表里的数据,那么,如果写某个位置时该位置上已经有数据,是否需要擦除FAT表?
我个人的估计是先把FAT表复制到某个block,然后擦除FAT表所在的block,再把FAT表“搬”回来,只是FAT所在的block没有block号,如何操作?
请高手指教!

回复评论 (15)

要的。
点赞  2009-10-16 22:47
对于文件系统本身来说,不需要考虑擦除的问题,在它看来,透过驱动接口操作的存储设备就类似与一片ram
存储设备驱动本身来做擦除等操作的工作
当然,你可以把这一部分工作放到文件系统中来做,前提是你不怕麻烦,呵呵
点赞  2009-10-16 22:49
楼上说的对,FAT文件系统设计时并没有考虑到要用到寿命有限的flash上,自然也不会涉及这个问题。但对于实际的应用上,必须要这么做,只是我不知道它是如何做的,所以才来求教。
“gooogleman”朋友说“要的”,能说得具体点吗?
点赞  2009-10-16 23:10
实际在Flash 上使用的一般都是exFAT或者TexFAT。
点赞  2009-10-16 23:22
而对于wear leveling,有不同的做法,有的是放在文件系统里(如JFFS),有的是放在block device驱动里(如FAL),也有的是直接放在NAND controller里(如Tegra)
点赞  2009-10-16 23:23
codewarrior
对文件系统真的比较了解

点赞  2009-10-16 23:48
回复codewarrior:谢谢你的回复。不过网上说exFAT有专利,非windows OS,如Linux,目前只能读、不能写,且微软尚未发布exFAT的说明书,我也确实没搜到它的资料,所以没有将其列为深究对象。
目前我“被迫”要深究FAT文件系统,此刻除了我提的这个问题,别的都基本搞懂了。

情况是不是这样的呢?内存中其实保存着即时的FAT表,每次需要修改FAT表中某字节时,先修改内存中的FAT表,然后写进FLASH上的FAT表,如果该字节上已经有数据,则(偏移“保留扇区数*每扇区字节数”个字节找到FAT表)将其(2个FAT表)复制到某空闲block,再erase 原FAT表所在的block,最后再把搬到别处的FAT表再搬回来。可是,这样的话就存在一个问题:FAT表占用的N个sector是没有block号的,而且N个sector也不一定就刚好占整数个block,那就无法实行“以block为单位进行erase操作”。

还请列为兄台解疑。
点赞  2009-10-17 09:10
1. 为什么FAT表占用的N个sector是没有block号?
2. 应该不需要像LZ想的那么麻烦要搬过来,搬过去. 只需要找一个空闲的block,把要修改block复制到内存,修改,然后写到空闲的block,同时把原来的block标记为 脏或者空闲. 然后FAL维护一个物理sector和逻辑sector的对应表,更新一下这个表就可以了.记录下每个block的使用次数,在选择空闲block的时候尽量选择使用次数少的,同时可以完成负载均衡.
点赞  2009-10-17 10:56
如果是我来写FATFS驱动,FAT表为什么不放到内存里做一个缓冲?为什么每次操作文件都要去做两次Flash操作?
点赞  2009-10-17 11:25
FATFS 驱动是 Flash 驱动上层的驱动, FATFS驱动中是否要把FAT表放在内存中做缓冲,是FATFS驱动的事情,对于Flash驱动来说,它并不知道那个block或者sector放的是FAT表,哪个放的是文件.
FATFS驱动中应该也是有内存缓冲的,这种缓冲也带来一定的不安全性,比如意外断电造成文件系统错误
点赞  2009-10-17 11:59
引用: 引用 10 楼 reallyu 的回复:
FATFS 驱动是 Flash 驱动上层的驱动, FATFS驱动中是否要把FAT表放在内存中做缓冲,是FATFS驱动的事情,对于Flash驱动来说,它并不知道那个block或者sector放的是FAT表,哪个放的是文件.
FATFS驱动中应该也是有内存缓冲的,这种缓冲也带来一定的不安全性,比如意外断电造成文件系统错误

最安全最合理的做法
点赞  2009-10-17 12:03
回复Reallyu:用WinHex查看磁盘(如U盘,或硬盘某FAT分区)就能看到FAT表的block号是N/A,根目录所在的block号是2,剩余扇区(小于一簇)也没有block号。由于FAT表的位置是固定的,所以FAT32并不能把保留扇区和FAT表标记为脏,这个区域是专用的,不能作为一般的block来使用,不参与GC和wear leveling。

如此说来,我提的问题已经不属于FAT文件系统的范畴了?而是FAT FS驱动、抑或是Flash驱动的事。对于研究FAT文件系统,其实不用考虑这个问题,只需知道“NAND Flash写数据时如果目标位置已经有数据,则须erase,而erase要以block为单位进行”的事实就可以了。
点赞  2009-10-17 12:44
是的, 不要把文件系统驱动FATFS和存储介质驱动FLASH驱动混在一起了.
对于FATFS驱动,它不需要关心介质是flash,硬盘还是别的什么,也不需要关心写之前是否要擦除,是否需要负载平衡,对于文件系统来说FAT表的位置是固定的,但是这个位置只是逻辑扇区号.下层的驱动如何操作硬件对于文件系统来说是透明的.
如果你是在无操作系统下裸奔,文件系统驱动和存储设备的驱动分层没有这么清晰,就会存在你说的问题.但是还是尽量实现成以上分层的驱动,更利于移植和管理. 文件系统操作的都是逻辑地址, 存储设备驱动实现逻辑地址与物理地址的转换和具体的读写操作.
在wince上 Flash驱动分为FAL+FMD, FAL层的作用就是来处理逻辑地址物理地址转换,负载均衡,写之前erase等事情的.
点赞  2009-10-17 14:57
OK,明白了。
多谢大家的关注!
点赞  2009-10-17 15:25
为什么要搬回来
点赞  2009-10-18 21:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复