当前位置: 首页 > news >正文

Yaffs文件系统学习

Linux驱动中有字符设备、块设备、网络设备三大设备,其中开发难度也是递增的,网络设备>块设备>字符设备。但是在实际开发过程中,大家可能觉得难度都差不多啊,甚至觉得字符设备仿佛开发工作量更大,而块设备和网络设备往往只需要规规矩矩地把钩子接口填写完毕就可以了。我以前也是这么认为的,但直到近期遇到问题后才明白这三类驱动开发难度区别。块设备和网络设备往往在架构上给你做了大量的集成,再开放出几个钩子函数给你,在原有架构下开发不难,难点在于问题的排查

在块设备架构中,上层应用可通过VFS系统的open、write、read接口实现简易存储操作;中间层由yaffs、jffs2、ext4等文件系统负责Flash管理;底层则通过Linux提供的MTD接口实现,该层由驱动工程师开发,不同的驱动和设备对应不同的MTD控制块,MTD1、MTD2、MTD3...

关键函数1:

函数MTD_BREAD下层即MTD钩子函数,通过此函数调用实现了对具体MTD flash驱动的读取。即此函数为驱动MTD的上一层。

static int yaffs_read_chunk_fn(FAR struct yaffs_dev *dev, int nand_chunk,FAR u8 *data, int data_len,FAR u8 *oob, int oob_len,FAR enum yaffs_ecc_result *ecc_result)
{FAR struct mtd_dev_s *mtd;int nchunk;ssize_t retval;enum yaffs_ecc_result ecc_status;int ret = YAFFS_OK;mtd = yaffs_dev_to_mtd(dev);nchunk = data_len / dev->param.total_bytes_per_chunk;if (data && data_len > 0){retval = MTD_BREAD(mtd, nand_chunk, nchunk, data); // MTD 接口读取if (retval == nchunk){ecc_status = YAFFS_ECC_RESULT_NO_ERROR;   // 无ECC纠错}else{ret = YAFFS_FAIL;if (retval == -EUCLEAN){ecc_status = YAFFS_ECC_RESULT_FIXED;   // ECC 可修复}else if (retval == -EBADMSG){ecc_status = YAFFS_ECC_RESULT_UNFIXED; // ECC 不可修复}else{ecc_status = YAFFS_ECC_RESULT_UNKNOWN;}}}else{ecc_status = YAFFS_ECC_RESULT_UNKNOWN;}if (ecc_result){*ecc_result = ecc_status;}if (oob && oob_len > 0){ferr("### read oob? inband tag should not read oob!\n");}return ret;
}

此函数返回了这个chunk的ECC状态(无ECC纠错/有ECC纠错/ECC无法纠正),将状态反馈给上层,Yaffs文件系统对此chunk做针对性处理。

在yaffs中分配单元为CHUNK(chunk),一般情况,典型情况下其值与一页(page)大小相同(同时可灵活配置)。

垃圾回收机制:通过淘汰低质量块(如频繁出错的老化块),降低未来ECC错误的概率。

将有效数据复制到连续的健康块,形成新的逻辑地址映射。

擦除无效数据所在的块,使其可重新分配。

为什么需要垃圾回收:ECC(纠错码)通过冗余数据检测并修正内存或存储介质中的位翻转错误。当单比特错误发生时,ECC可自动修复;但若错误率持续升高(如因硬件老化、环境干扰),修复操作会频繁触发,此时可能伴随以下问题:

  • 不可修复的错误:当错误超过ECC纠错能力(如多比特错误),数据块会被标记为“坏块”,无法继续使用。
  • 数据迁移的残留:在修复过程中,系统可能将有效数据迁移到新块,而原块因错误被废弃。若频繁发生此类迁移,废弃块数量增加,可能被视为“无效数据”。

为什么要对坏块进行擦除操作?

擦除原理:通过高压脉冲将所有单元的阈值电压重置为“1”状态(未编程),消除残留电荷对后续写入的影响。

擦除作用

因为块并不是不能用了,擦除可以重置其部分状态,使其重新投入使用。

  • 物理层面:清除残留错误源(如电荷陷阱、磁畴紊乱)。
  • 逻辑层面:强制系统重新分配该块,避免继续写入导致错误进一步累积。

 关键函数2:

当Yaffs读取页时,若一个块中有超过三次读到纠错或者无法纠正的数据,则对该块进行坏块标记。但坏块标记信息为全局变量,则需保证在一个完整生命周期内连续读取到这个页才会被标记。即若累积到3次,若出现重启的情况,块也不会被标记。

http://www.dtcms.com/a/301783.html

相关文章:

  • Mysql数据库基础(入门)
  • 智慧施工:施工流程可视化管理系统
  • 【分享】外国使馆雷电综合防护系统改造方案(一)
  • 自动出题与批改系统(数学题生成+OCR识别)
  • Vue入门到实战之第三篇【超基础】
  • 从 .NET Framework 到 .NET 8:跨平台融合史诗与生态演进全景
  • 数据科学专业的行业适配全景图
  • Unity TAA
  • 大数据工程师:职责与技能全景图 -- 从“数据搬运工”到“价值架构师”
  • 三、构建一个Agent
  • Triton IR
  • 【测试报告】思绪网(Java+Selenium+Jmeter自动化测试)
  • 力扣面试150题--二进制求和
  • 五度标调法调域统计分析工具
  • 【笔记】Einstein关系式 D = ukBT 的推导与应用研究
  • 零拷贝 详述
  • Day4.AndroidAudio初始化
  • Linux学习篇11——Linux软件包管理利器:RPM与YUM详解与实战指南,包含如何配置失效的YUM镜像地址
  • 【RH134 问答题】第 2 章 调度未来任务
  • 第1章 AB实验的基本原理和应用
  • 任务提醒工具怎么选?对比16款热门软件
  • Valgrind Helgrind 工具全解:线程同步的守门人
  • Linux 基础命令大全
  • LC振荡Multisim仿真
  • CPA全国青少年编程能力等级测评试卷及答案 Python编程(二级)
  • 金融市场资金波动模拟程序设计与实现
  • 文件IO——目录操作
  • 大模型蒸馏理论概述
  • 【分布式存储】聊聊一致性哈希算法原理和实现
  • Linux图片元数据提取完全指南:从基础到高级的完整教程