效数据的目标块的选择等。这类算法从统计学的角度出发,实现在大量处理之后磨损的均匀分布。算法思想简单,不需要消耗大量的系统资源来记录块的擦写情况,如块的擦除次数,块上存放数据的“冷热”情况等,因此执行效率高,磨损均衡处理对系统影响程度小,但均衡各块的擦除次数的效果受随机性影响较大,应用广泛的JFFS2 文件系统和Ban提出的算法都属于这一类。
Ban的算法在每次写或擦操作后,按照1/1000的概率来触发磨损均衡处理。并按照均匀分布的随机概率来选择某个块执行擦除操作。这样,不管块上放的是“冷”数据还是“热”数据,都可以让每个块得到相等的擦除机会。最后将选中块上的有效数据复制到空块后擦除此块。将数据移动到哪个空闲块上,也是随机选择,因为没有记录块的擦除情况,也许会将“冷”数据又移动到一个“冷”块上,结果此块并没有增加擦除次数,这种情况尤其会发生在有大量“冷”数据的系统里。论文网
2.2 确定性磨损均衡算法
这一类算法在处理过程中不带有随机性,称为确定性磨损均衡算法。这类算法依赖于复杂的数据结构,记录各块的擦除次数和数据的存放时长等用于磨损均衡处理的全局信息,来明确地给出选择策略。磨损均衡处理的效果明显,但需要占用大量的系统资源,比如内存。闪存在每次初始化的时候,都需要将块的擦除情况读入到内存中,闪存的容量越大,占用的内存也越多。Assar,Lee,Lofgren,Chang,Yuan-Hao Chang,潘沁 ,L-i Pin Chang等人都提出了自己的算法。
确定性算法按实现方式又可以分成两类。
2.2.1 周期型算法
这一类算法将闪存的寿命看作是由一个接一个的磨损均衡处理周期构成的。在一个处理周期中,已达到规定的擦除次数的块在这一轮周期中将不会再被选中,这样就能使各个块都达到相同的擦除次数,然后再开始下一个擦除周期。在一个周期中,每一块能够被选中擦除的次数可由系统对磨损均衡的要求程度来决定。如果每块可以得到较多的擦除次数,则在某段时间内会导致磨损的不均衡性。相反,如果限制每块的擦除次数为一个较小值时,整个闪存在任何时刻都能够达到理想的磨损均衡,但系统的性能会受到很大影响,因为要频繁启动磨损均衡处理。
2.2.2 全局型算法
这一类算法并不划分处理周期,而是在一个全局范围内控制块的磨损均衡。当任何两个块的擦除次数之差超过一个给定的阈值时,或者当某块的擦除次数超过了所有块的平均擦除次数时,启动磨损均衡处理,将擦除次数少的块上数据和擦除次数多的块上数据进行交换。因为一般认为如果块上存放的是“冷”数据,即数据很少被更新,则该块上的数据不易变脏,因此该块很少得到擦除的机会。相反,如果该块上存放的是“热” 数据,则该块上的数据经常被更新,因此该块经常得到擦除脏数据的机会。根据这个原理来交换“冷热” 数据,从而实现磨损均衡。
3 源代码分析
分析的源代码是导师提供的来自国民技术股份有限公司的Z8HM2的一个固件源代码Zi1209_Firmware。
这里只关注他的nandflash 管理模块代码。
3.1 一些比较重要的表结构描述
3.1.1 量产表
量产表是U盘量产时候写好的,包含U盘的各类基本信息,其中关注的是每个Block(物理块)中有多少Sector(逻辑扇区)、每个Page(物理页)中有多少个Sector、一个块多少个页、索引表块的起始块位置、索引块的最大块号、坏快替换标志。文献综述