cramfs用于nand flash

来源:互联网 发布:香港风水大师知乎 编辑:程序博客网 时间:2024/04/30 22:46

cramfs诞生于nand flash之前,针对的是标准块设备。

nand flash是以页为读的单位,以块为擦除单位,以页为写单位;

而标准块设备是以卷为读写单位,没有块及其擦除的概念。


cramfs做为只读文件系统不涉及擦写的操作,但是nand flash规范中允许存在少了坏块,cramfs在进行读操作时需要考虑该问题,

这里做的就是在读操作时处理nand flash的坏块问题:


只读文件系统一次性烧写在存储设备中时,遇到坏块是按照直接跳到紧邻的下个好块来处理的。

在cramfs中进行读操作时需要按照烧写时的坏块处理规则找到存放对应数据的块。


为了减少对cramfs代码逻辑的影响,处理为在读块时,对块ID进行处理,使其映射到物理上正常的对应块,

为此需要知道逻辑块号和物理块号之间的对应关系;

具体在代码中的实现:

1、在加载nand分区时,创建块映射表;

2、在读操作时,使用块映射表得到正确的数据块ID;


代码如下:

/* 在填充分区超级块时建立块映射表 */

sbi = kzalloc(sizeof(struct cramfs_sb_info), GFP_KERNEL);if (!sbi)return -ENOMEM;sb->s_fs_info = sbi;mtd = get_mtd_device(NULL, MINOR(sb->s_dev));    <span style="white-space:pre"></span>/* Nand bad block map */if(MTD_NANDFLASH == mtd->type){    sbi->blk_map = kzalloc((mtd->size >> mtd->erasesize_shift) * sizeof(sbi->blk_map[0]), GFP_KERNEL);    if(!sbi->blk_map)    {        printk(KERN_ERR "cramfs: alloc mem for nand bad block info fail\n");goto out;        }        {            /* bad block scan */            int i = 0;            int j = 0;            int block_num = 0;            block_num = mtd->size >> mtd->erasesize_shift;            for(i = 0, j = 0; i < block_num && j < block_num; i++,j++)            {                // Ñ­»·ÕÒµ½ÏÂÒ»¸öºÃ¿é                while(mtd->block_isbad(mtd, mtd->erasesize * j) && j < block_num)                {                    printk(KERN_WARNING "cramfs: scan bad block %s:%d\n", (mtd->name ? mtd->name : "NULL"), j);                    j++;                }            sbi->blk_map[i] = j;        }    }}
/* 使用块映射表 */
static int get_block_map(struct super_block *sb, int block)
{return ((struct cramfs_sb_info *)(sb->s_fs_info))->blk_map[block];}


其中对nand的操作时通过mtd接口实现的。


原创粉丝点击