2.7.1 NF_ReadSector 11
2.7.2 NF_WriteSector 14
2.7.3 两个基本扇区读写函数中调用到的函数概述 17
2.8 逻辑读写的实现 18
2.8.1 缓存块时间戳 18
2.8.2 LDT_UpdateEarlyOneBlock 18
2.8.3 LDT_SuperUpdate 18
2.8.4 LDT_WritePage 20
2.8.5 LDT_ReadPage 25
3 简单评估所分析的源代码 25
3.1 假设模拟写操作,分析负载均衡效果 26
3.2 简单做比较 28
结 论 29
致 谢 30
参考文献 31
1 绪论
闪存( flash memory)已经成为当今最为流行的存储介质之一,大有要超越硬盘的趋势。它具有许多有非易失、防震、节能、体积小、容量大等等有点,但也有其局限性。闪存块的读写单位是页,擦除单位是块,一个块包含很多页,要写一个页,就必须先擦除该页所在的块。而闪存的瓶颈就在块擦除操作上,不仅耗时长,更重要的是擦除次数有限。
因此闪存多采用异地更新策略,需要维护物理地址和逻辑地址的映射表关系,并且尽可有分散擦除操作到每个块上,以延长使用寿命。作者主要查看各种相关资料,然后对导师给的一个u盘固件代码中的flash管理模块进行剖析,并分析使用的负载均衡方法,简单与资料中的方法进行比较。
1.1 背景
U盘的存储体主要使用NAND Flash memory(闪存),它具有许多优点,存储容量大、体积小、掉电数据不易丢失以及可多次擦写等,但也有其自身的限制。
闪存由若干个闪存块(block)组成,每个闪存块又分为若干个物理页(page)。闪存块是擦除操作的最小单位,而读和写都是以页为单位的。
闪存采取异地更新的策略,更新的数据会被放到别的物理页上,而不是覆盖原来的数据。包含新版本数据的页被称为有效页,新版本数据被称为有效数据。包含旧版本数据的页被称为无效页,或称为脏页,脏页经过擦除操作后成为空闲页,才可以重新写入数据。因为闪存是以块为单位执行擦除的,因此需要将脏页所在块上的所有的物理页都擦除, 在擦除之前需要检查此块上是否存在有效页,如果存在就必须先转移到其他块上。因为每个闪存块的擦除次数有限,一般是在10万次到100万次之间,只要有块的擦除次数达到了上限,闪存数据存储就会变得不可靠。
由于闪存采用异地更新的缘故,逻辑页与物理页的对应关系一直在改变,所以要正确存取数据就必须建立一个物理页和逻辑页的映射表。这样,数据更新后只需改变映射表中物理页的地址,并将原版本数据所在的物理页标示为无效。
综上说述,就需要用一个算法来维护映射表,并使得擦除操作均匀地发生在每个块上。
这一类算法叫做磨损均衡(wear-leveling)算法,用字来实现闪存页面置换,和块擦除维护工作。
2 算法综述
磨损均衡算法按照处理过程中是否带有随机性可以分成两类。
2.1 随机性磨损均衡算法
这类算法在以下几个策略中体现随机性:均衡处理触发条件,处理块的选择,转移有