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];}
- cramfs用于nand flash
- real6410移植linux2.6.39.4内核(2)-添加nand flash驱动及启动cramfs文件系统
- Nand Flash
- NAND Flash
- nand flash
- NAND FLASH
- NAND FLASH
- nand flash
- Nand Flash
- NAND Flash
- NAND FLASH
- nand flash
- nand flash
- Nand flash
- NAND FLASH
- NAND FLASH
- NAND Flash
- Nand flash
- Android关于view按键音的修改
- Project Server 2010 沟通管理
- 动态链接库DLL基础编程
- Android 程式开发:(三)初识Fragment —— 3.1简介
- 风格化
- cramfs用于nand flash
- android开发网上的重要知识点
- mysql数据库触发器的操作
- Java线程池
- java常用日期问题集锦
- Class.forName()的作用
- Objective-c 基本概念
- Android中的进程和线程
- ListView 包含Button 的事件问题