cramfs用于nand flash
发布时间:2020-12-15 06:10:42 所属栏目:百科 来源:网络整理
导读:cranfs诞生于nand flash之前,针对的是标准块设备。 nand flash是以页为读的单位,以块为擦除单位,以页为写单位; 而标准块设备是以卷为读写单位,没有块及其擦除的概念。 cramfs做为只读文件系统不涉及擦写的操作, 但是nand flash规范中允许存在少了坏块
cranfs诞生于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));
/* 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 failn");
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++)
{
// ?-?·?òμ???ò???o??é
while(mtd->block_isbad(mtd,mtd->erasesize * j) && j < block_num)
{
printk(KERN_WARNING "cramfs: scan bad block %s:%dn",(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接口实现的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |