引子
最近有一个项目需要在NAND FLASH裸片上建立文件系统,由于必须通过USB给Windows访问,所以FAT是唯一的选择。由于FAT不是为Flash设计,因此需要透过FTL(Flash Translation Layer)来访问NAND FLASH。
原本以为FTL的支持在嵌入式Linux下是很成熟的,因为在编译内核时,MTD下就有可选的FTL和NFTL可供选择,但是dig进去才发现原来事情比想象的复杂。
首先科普一下:
1) FLASH的擦除循环寿命比较有限。对于NOR FLASH大约100万次,对于NAND FLASH大约10万次(SLC)或几万次(MLC)。
2)NAND FLASH出厂时可能存在坏块,而且在使用中有可能不断地产生新的坏块。所谓“坏块”其实通常从仅有一个bit(SLC)或数个bits(MLC)出错开始。一般可以通过ECC,BCH或RS算法还原数据来大幅度提升NAND FLASH的寿命(10倍左右)。
3)可擦除块: FLASH与磁盘的一个重要区别,就是FLASH在写入之前必须先进行擦除。经过擦除后的FLASH,内容全部为‘1’。写入的过程就是把一些'1'的比特改成'0'。对于FLASH存储器,内容为'0'的比特数据需要擦除为‘1’后才能再次写入(变为'0')。对于NAND FLASH还更复杂些,NAND FLASH的存储单位被组织成页,页的大小一般为512/1024/2048/4096字节,同一个页的写入次数有限制(称为'写入区',‘写入区’的个数就是页写入的最大次数),通常为2次。FLASH的可擦除块一般在数十k到几百k。
4)FTL: FLASH传输层软件,有两个作用, 一是对FLASH写入进行负载均衡,由此提升FLASH的寿命;二是提供类似传统磁盘大小的块(512 bytes)访问界面,以便可以在FLASH上使用为磁盘存储介质而设计的文件系统,如FAT。
5)NFTL:适合NAND FLASH的FTL。与NOR FLASH相比,增加了坏块管理,页管理,以及ECC等纠错措施。
为什么要FTL?
由于传统的文件系统不是为Flash而设计的,如果直接在Flash上运行会很快使Flash局部老化而丢失数据,或崩溃。另外由于FLASH的块比较大,如果直接映射成块设备的话,空间利用率低。
FTL的作用就是解决负载均衡与提供适合传统文件系统的,大小合适(如512字节)的块设备。
MTD
很多刚接触Linux MTD系统的人,很容易把mtd和FTL搞混了。mtd设备是一个字符设备(或者叫"flash"设备),它提供了访问FLASH存储器的通用界面。MTD还带了一个简单的模拟块设备:mtdblock。虽然mtdblock提供了大小合适的块,但它不具备负载均衡的能力,也不具备坏块管理的能力。我们可以通过mtdblock设备安装传统文件系统(如FAT文件系统),但是如果在上面进行写入操作的话,会迅速磨损FLASH。(如果安装的是一个只读文件系统,则没有问题)
许多Flash-aware-filesystem,如JFFS和YAFFS,通过mtd来访问FLASH;而要在FLASH上使用传统文件系统,一个可靠的FTL是一定需要的。
Linux下的FTL和NFTL
Linux内核的MTD子系统中带有FTL和NFTL,但它们实际上不是通用的FTL,有诸多的限制。更要命的是它的许可证:
写道
LEGAL NOTE: The FTL format is patented by M-Systems. They have
granted a license for its use with PCMCIA devices:
"M-Systems grants a royalty-free, non-exclusive license under
any presently existing M-Systems intellectual property rights
necessary for the design and development of FTL-compatible
drivers, file systems and utilities using the data formats with
PCMCIA PC Cards as described in the PCMCIA Flash Translation
Layer (FTL) Specification."
Use of the FTL format for non-PCMCIA applications may be an
infringement of these patents. For additional information,
contact M-Systems (http://www.m-sys.com) directly.
在嵌入式系统中,FLASH通常是直接与CPU通过内存总线通讯,而不是PCMCIA接口,因此这个许可证就使得通过非PCMCIA接口使用FTL有可能侵权。
也许是因为这个原因,FTL和NFTL代码中并不提供对非DiskOnChip(PCMCIA) 设备的支持。
UBI
UBI原本是为了实现更好的负载均衡(全片负载均衡)和更好的扩展性。UBI架构在MTD之上,它要完成的工作就是实现透明的负载均衡和坏块管理,让上层的文件系统从这两部分繁重的工作中释放出来。
看起来与FTL很接近了,只可惜它提供的不是我们需要的块设备。与MTD一样,它提供的界面是"flash"设备,供flash-aware-filesystem使用。例如可以在UBI之上使用JFFS2(据说可以获得更好的负载均衡特性),或者专门设计的UBIFS。
UBI是由Nokia开发人员发起的项目,开发者声称基于UBI建立FTL很容易...容易到他们都不屑于去实现它了。我们悲哀地发现,虽然UBI项目已经有好几年了,也进入main stream内核了,却还看不到基于它的FTL。
其实并不是没有人需要FTL,在google上搜一下就会发现有大把的人在寻找在Linux下可用的FTL,最终得到的答案要么是“没有”,要么是“基于UBI很容易实现FTL”云云。
其实从技术上讲基于UBI实现FTL确实是省了很多事。事实上确实有人做过,也把patch发到UBI项目,但被拒了,好像是由于几个很小的问题,包括代码格式等等。其实那些UBI家伙根本不想(或这不屑?)去实现FTL界面,他们的逻辑是:FTL是给legacy filesystem用的,既然有更好的flash-aware-filesystem,为什么不用?FAT?不是应该扔垃圾堆了么?....他们在无视某些东西。
丑陋的妥协方案
项目不能等UBI家伙们实现FTL,而自己实现时间上不允许。只能用丑陋的妥协方案:
1)在NAND上安装YAFFS2(over mtd)
2)在YAFFS2分区上创建一个文件,attach一个loop device到这个文件。
3)对这个loop device运行fdisk创建分区,格式化等。
4)重新attach loop device到这个文件(从分区偏移量处开始)。
5)mount FAT到这个loop device上进行读写。
6)要通过USB访问时,指定usb mass storage模块的file参数到此文件上即可。
这些工作通过几个简单的脚本即可完成。
这个方案的优点是借用YAFFS2实现了负载均衡,缺点是透过loop device来安装FAT文件系统性能差。实际测试,通过USB传输大约仅300KB/s (ARM9, 200MHZ, USB 2.0 full speed)。而如果通过mtdblock而不是loop mount的话,可以达到700KB/s.
分享到:
相关推荐
标题提到的“应用于nandflash存储设备的快速读写方法”是针对这种存储技术优化访问性能的关键技术。 NAND Flash的结构基于浮栅晶体管,其数据存储依赖于电子在浮动门中的陷阱状态。与传统的NOR Flash相比,NAND ...
该芯片集成了先进的NAND闪存管理算法,包括ECC(错误校正码)技术,以确保数据的稳定性和可靠性。 “黑片”一词在U盘行业中通常指未经过品牌厂商认证或未标明具体生产信息的闪存芯片。这些芯片可能来自于非正规渠道...
它采用NAND型闪存,分为SLC(Single-Level Cell)、MLC(Multi-Level Cell)、TLC(Triple-Level Cell)和QLC(Quad-Level Cell)等多种类型,每种类型在容量、速度和寿命上有所不同。 2. **TRIM命令**: TRIM是...
2. **NAND闪存**:这是SSD的主要存储技术,分为SLC(单层单元)、MLC(多层单元)、TLC(三重层单元)和QLC(四层单元),不同类型的NAND在耐用性和性能上有所不同。 3. **TRIM命令**:TRIM是一种用于优化SSD性能的...
OpenGL是一种强大的图形库,用于创建2D和3D图形,广泛应用于游戏开发、科学可视化、工程设计等领域。在这个项目中,我们看到一个基于OpenGL的机械臂运动仿真程序,它能够实现机械臂在四个方向上的旋转。这样的模拟对于理解机械臂的工作原理、机器人控制算法以及进行虚拟环境中的机械臂运动测试具有重要意义。 我们需要了解OpenGL的基础知识。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D矢量图形。它提供了大量的函数来处理图形的绘制,包括几何形状的定义、颜色设置、光照处理、纹理映射等。开发者通过OpenGL库调用这些函数,构建出复杂的图形场景。 在这个机械臂仿真程序中,C#被用来作为编程语言。C#通常与Windows平台上的.NET Framework配合使用,提供了一种面向对象的、类型安全的语言,支持现代编程特性如LINQ、异步编程等。结合OpenGL,C#可以构建高性能的图形应用。 机械臂的运动仿真涉及到几个关键的计算和控制概念: 1. **关节角度**:机械臂的每个部分(或关节)都有一个或多个自由度,表示为关节角度。这些角度决定了机械臂各部分的位置和方向。 2. **正向运动学**:根据关节角度计算机械臂末端执行器(如抓手)在空间中的位置和方向。这涉及将各个关节的角度转换为欧拉角或四元数,然后转化为笛卡尔坐标系的X、Y、Z位置和旋转。 3. **反向运动学**:给定末端执行器的目标位置和方向,计算出各关节所需的理想角度。这是一个逆向问题,通常需要解决非线性方程组。 4. **运动规划**:确定从当前状态到目标状态的路径,确保机械臂在运动过程中避免碰撞和其他约束。 5. **OpenGL的使用**:在OpenGL中,我们首先创建几何模型来表示机械臂的各个部分。然后,使用矩阵变换(如旋转、平移和缩放)来更新关节角度对模型的影响。这些变换组合起来,形成机械臂的动态运动。 6. **四向旋转**:机械臂可能有四个独立的旋转轴,允许它在X、Y、Z三个轴上旋转,以及额外的绕自身轴线的旋转。每个轴的旋转都由对应的关节角度控制。 7. **交互控制**:用户可能可以通过输入设备(如鼠标或键盘)调整关节角度,实时观察机械臂的运动。这需要将用户输入转换为关节角度,并应用到运动学模型中。 8. **图形渲染**:OpenGL提供了多种渲染技术,如深度测试、光照模型、纹理映射等,可以用于提高机械臂模拟的真实感。例如,可以添加材质和纹理来模拟金属表面,或者使用光照来增强立体感。 这个项目结合了OpenGL的图形渲染能力与C#的编程灵活性,构建了一个可以直观展示机械臂运动的仿真环境。通过理解并实现这些关键概念,开发者不仅能够学习到图形编程技巧,还能深入理解机器人学的基本原理。
android11 udpate-engine 系统升级模块源码下载
内容概要:本文详细介绍了如何在MATLAB环境中实现SVM二分类算法,涵盖数据预处理、参数寻优及结果可视化的全过程。首先进行数据归一化处理,确保各特征在同一量纲下参与模型训练。接着采用网格搜索法对SVM的关键参数c(惩罚系数)和g(核参数)进行自动化寻优,利用5折交叉验证评估每组参数的表现。最后通过等高线图和3D曲面图直观展示参数与准确率之间的关系,并完成最终模型的训练与预测。 适合人群:具有一定MATLAB编程基础的研究人员和技术爱好者,尤其是从事机器学习、数据分析领域的从业者。 使用场景及目标:适用于需要快速搭建SVM二分类模型并进行参数调优的项目。主要目标是在短时间内获得较高准确度的分类结果,同时掌握SVM的工作原理及其在MATLAB中的具体应用方法。 其他说明:文中提供了完整的代码示例,便于读者直接上手实践。此外还提到了一些常见的注意事项,如数据格式要求、类别不平衡处理以及特征工程的重要性等。
ffmpeg
江科大CAN入门教程,万字长文理解
内容概要:本文详细介绍了基于新唐N79E814单片机的移动电源设计方案,涵盖硬件架构、PCB原理图、电路设计、代码实现等方面。移动电源主要由电池、充电电路和输出电路构成,文中重点讲解了5V1A和5V2.1A两路输出的设计思路,包括同步整流、PWM控制、充电管理等关键技术。同时,文章还探讨了PCB布局、烧录注意事项、效率优化等内容,并提供了具体的代码示例和调试建议。 适合人群:具有一定电子技术和单片机开发基础的工程师和技术爱好者。 使用场景及目标:适用于希望深入了解移动电源设计原理和实现方法的人群,旨在帮助读者掌握从原理图绘制到实际产品制作的全过程,提升电路设计和调试能力。 其他说明:文章不仅提供了理论知识,还包括大量实践经验分享,如常见的调试陷阱和解决方法,有助于读者在实践中少走弯路。
动漫角色分割_基于深度学习实现的高精度动漫角色分割算法_附项目源码_优质项目实战
javacv实现的支持多种音视频播放的播放器,比如MP4、avi、mkv、flv、MP3、ogg、wav、au等多种音视频格式,非常好用。
开发调试demo,简单的自动登录功能,插件开发入门参考
内容概要:本文详细介绍了通过修改Windows注册表来启用和配置被禁用的用户账户(如WDAGUtilityAccount)的过程。首先,通过计算机管理界面查看被禁用的用户账户,并进入注册表编辑器定位到HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users路径下的相应用户条目。接着,通过对特定用户的二进制数据进行编辑,包括复制和修改关键字段,实现对被禁用账户的克隆与重新启用。最后,验证账户状态的变化,并通过远程桌面连接测试新配置的有效性。 适合人群:具备一定Windows系统管理基础的技术人员,尤其是负责企业内部网络和用户账户管理的IT管理员。 使用场景及目标:①当需要恢复或重新配置被禁用的用户账户时;②在进行系统故障排除或安全审计时,了解如何通过注册表直接操作用户账户;③确保特定用户能够正常登录并访问远程桌面服务。 阅读建议:本文涉及较为底层的系统操作,建议读者在实际操作前充分备份系统和注册表,避免误操作导致系统不稳定。同时,对于不熟悉注册表编辑的用户,应先在测试环境中练习,确保掌握相关技能后再应用于生产环境。此外,建议结合官方文档或其他权威资料,加深对Windows用户账户管理机制的理解。
2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。
内容概要:本文详细介绍了基于西门子S7-1200 PLC的两部六层电梯控制系统的设计与实现。主要内容涵盖前期准备工作,如选择合适的PLC型号和配置硬件;核心逻辑部分深入讲解了梯形图编程的具体实现方法,包括楼层呼叫逻辑、电梯运行方向控制以及两部电梯之间的协同工作;此外,文章还探讨了仿真测试的方法及其重要性,提供了许多实用技巧和注意事项。通过具体实例展示了如何利用博途V15软件进行电梯系统的开发,并分享了一些实际操作中的经验和常见问题解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些对PLC编程有兴趣或者正在参与类似项目的从业者。 使用场景及目标:适用于需要理解和掌握S7-1200 PLC编程技能的人群,尤其是希望通过实际案例加深对梯形图编程理解的学习者。目标是在实践中提高编程能力,能够独立完成类似的工程项目。 其他说明:文中不仅包含了详细的理论解释,还有丰富的代码片段供读者参考。对于初学者而言,建议先从单部电梯开始练习,逐步过渡到复杂的双梯联调。同时,作者强调了仿真测试的重要性,指出这是验证程序正确性和优化性能的关键步骤。
2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。
内容概要:该资源为大学英语四级听力练习音频 MP3,包含丰富多样的听力素材。涵盖四级考试常见的各类场景,如校园生活(课程学习、社团活动等)、日常社交(聚会、聊天等)、工作求职(面试、职场事务等)、旅行交通(出行方式、景点介绍等)、饮食健康(餐厅点餐、健康养生等)。音频内容依照四级听力考试题型和难度精心录制,有短对话、长对话、短文听力等形式,且语速、口音等符合四级考试要求,助力考生熟悉考试形式与节奏。 适合人群:正在备考大学英语四级考试,希望提升听力水平的学生;英语基础中等,需要通过针对性练习来适应四级听力难度、提升听力理解能力的学习者;对英语听力学习有需求,想通过大量练习积累场景词汇、熟悉英语表达习惯的人群。 能学到什么:①熟悉四级听力考试的各类场景词汇,增强词汇储备并提升在听力语境中的反应速度;②掌握不同场景下的英语常用表达和句式,提升英语语言运用能力;③锻炼听力理解技巧,如抓取关键词、推断隐含意思、梳理篇章逻辑等;④适应四级听力考试的语速、口音和题型设置,增强应试能力和自信心。 阅读建议:制定系统的练习计划,定期定量进行听力练习,如每天安排 30 - 60 分钟;第一遍泛听,了解大致内容和主题;第二遍精听,逐句听写或分析不懂的词汇和句子;对照听力原文,明确错误和没听懂的地方,积累生词和表达;定期进行模拟测试,利用该音频模拟考试环境,检验学习效果并调整学习策略。
2000-2017年各省天然气消费量数据 1、时间:2000-2017年 2、来源:国家统计j、能源nj 3、指标:行政区划代码、城市、年份、天然气消费量 4、范围:31省
内容概要:本文详细介绍了基于西门子PLC1200的自动化控制系统,涵盖了PLC与库卡机器人通过Profinet通讯、PTO模式控制松下伺服、36路模拟量处理(包括压力检测、位置检测及压力输出)、以及26个温控器通过485总线通讯的关键技术和实现方法。此外,还包括了昆仑通态触摸屏的人机交互界面设计,提供了详细的硬件组态、软件编程指导和设备操作说明。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些负责多设备协同控制项目的设计和实施的专业人士。 使用场景及目标:适用于需要整合多种设备(如PLC、机器人、伺服系统、温控器等)的复杂自动化生产线。主要目标是提高生产效率、增强系统的稳定性和可靠性,同时降低维护成本。 其他说明:文中不仅提供了具体的编程实例和硬件配置指南,还分享了许多实际调试过程中积累的经验教训,有助于读者在实际应用中少走弯路。