一、概述
因squashfs文件系统无法处理坏块,当使用squashfs文件系统时,必须要考虑坏块的影响。
二、解决方案
为解决squashfs无法处理坏块问题,以下有三种解决方案
1.使用nor flash,坏块由硬件保证;
2.使用nand flash, 文件系统使用ubifs, squashfs作为其上的卷,坏块处理由ubifs处理;
3.使用nand flash,文件系统使用squashfs, 在read操作中增加坏块处理;
下面会针对第3种方案提供一种算法。
三、算法描述
1.烧录squashfs镜像时,会跳过坏块
2.文件系统挂载时,在mtd相应的squashfs分区上面建立一个逻辑块与物理块的映射表。
逻辑块表示squashfs要访问的块地址,而物理块表示实际存储的物理块地址。
例,#2是坏块,则逻辑块与物理块的映射关系建立如下:
logic[0] = phys[0],
logic[1] = phys[1],
logic[2] = phys[3],
logic[3] = phys[4],
建立映射关系后,就知道squashfs访问的地址对应的物理地址了。
3.访问时,会通过映射表访问对应物理块,即使遇到坏块,也能访问到正确地址。从而达到预期效果。
四、具体实现
1.文件系统挂载时,做映射表
fs/squashfs/super.c
2.part_read时,对地址进行转换,达到跳过坏块效果
driver/mtd/mtdpart.c
五、注意
4.19 不使用part_read函数,改为使用mtdcore.c中mtd_read函数,需要做相应调整