概述
Squashfs一般存放于nor flash中,但是也可以使用Nand flash存储squashfs文件系统,但是需要绕过坏块。
算法描述
在bootloader中烧写squashfs分区时,顺序的将squashfs烧到Nand flash中,如果碰上坏块,则顺序写入下一个好块。例如:#2是坏块,则数据写到#1, #3, #4,…上面。
引导linux后,在mtd相应的squashfs分区上面建立一个逻辑块与物理块的映射表。逻辑块表示squashfs要访问的块地址,而物理块表示实际存储的物理块地址。
同上例,#2是坏块,则逻辑块与物理块的映射关系建立如下:
logic[0] = phys[0],
logic[1]=phys[1],
logic[2]=phys[3],
logic[3]=phys[4],
建立映射关系后,就知道squash访问的地址对应的物理地址了。
程序实现:
声明结构:
struct part_map{
struct mtd_info *part_mtd; /* Mapping partition mtd */
unsigned *map_table; /* Mapping from logic block to phys block */
unsigned nBlock; /* Logic block number */
};
修改nandpart.c即可实现。
1. 声明一个partition mapping表。
2. 在add_mtd_partitions()函数中,当mtd分驱创建成功后,创建partition mapping表。
3. 在part_read ()函数中时,如果匹配到partition mapping的part_mtd,则先通过map_table获取到物理地址后,再调用part->master->read_ecc读取nand flash中的数据。
4. 在del_mtd_partitions()函数中,匹配到partition mapping分区,则删除之.
原码补丁如下: