在NAND FLASH上建立YAFFS2文件系统

nandflash烧录文件制作(ubi文件系统) 问题分析: 为了将IPRAN平台的APP烧录到nandflash,需要解决如下问题: linux内核启动后,挂载nandflash设备时,采用的ubi的文件系统。所以,烧录到nandflash的必须是一个ubi格式的文件系统。 挂载后的nandflash,有home和data两个卷,所有,烧录的ubi格式的文件系统必须已经包含home和data两个卷(以下方式不适用与创建两个或者多个分区的情... 阅读详情

在NAND FLASH上建立YAFFS2文件系统(一)

经过了半个多月的努力,终于搞定nandflash的mtd驱动和上层的yaffs2文件系统。这半个多月来几乎每天都要和挫败感斗争,每天都要忍受这个方面,那个方面的bug。想想自己这半个多月来,也算看不少资料,得到不少人的帮助,总算是有点心得。鉴于国内搞yaffs2文件系统方面的资料还是很少,就把自己的心得拿出来与大家共享。
      不说闲话了,先介绍一些背景资料    一. 闪存
我们常说的闪存其实只是一个笼统的称呼,准确地说它是非易失随机访问存储器(NVRAM)的俗称,特点是断电后数据不消失,因此可以作为外部存储器使用。而所谓的内存是挥发性存储器,分为DRAM和SRAM两大类,其中常说的内存主要指DRAM,也就是我们熟悉的DDR、DDR2、SDR、EDO等等。闪存也有不同类型,其中主要分为NOR型和NAND型两大类。
闪存的分类
  NOR型与NAND型闪存的区别很大,打个比方说,NOR型闪存更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而NAND型更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线传送一般,而且NAND型与NOR型闪存相比,成本要低一些,而容量大得多。因此,NOR型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行,手机就是使用NOR型闪存的大户,所以手机的“内存”容量通常不大;NAND型闪存主要用来存储资料,我们常用的闪存产品,如闪存盘、数码存储卡都是用NAND型闪存。
  这里我们还需要端正一个概念,那就是闪存的速度其实很有限,它本身操作速度、频率就比内存低得多,而且NAND型闪存类似硬盘的操作方式效率也比内存的直接访问方式慢得多。因此,不要以为闪存盘的性能瓶颈是在接口,甚至想当然地认为闪存盘采用USB2.0接口之后会获得巨大的性能提升。
  前面提到NAND型闪存的操作方式效率低,这和它的架构设计和接口设计有关,它操作起来确实挺像硬盘(其实NAND型闪存在设计之初确实考虑了与硬盘的兼容性),它的性能特点也很像硬盘:小数据块操作速度很慢,而大数据块速度就很快,这种差异远比其他存储介质大的多。这种性能特点非常值得我们留意。
NAND型闪存的技术特点
  内存和NOR型闪存的基本存储单元是bit,用户可以随机访问任何一个bit的信息。而NAND型闪存的基本存储单元是页(Page)(可以看到,NAND型闪存的页就类似硬盘的扇区,硬盘的一个扇区也为512字节)。每一页的有效容量是512字节的倍数。所谓的有效容量是指用于数据存储的部分,实际上还要加上16字节的校验信息,因此我们可以在闪存厂商的技术资料当中看到“(512+16)Byte”的表示方式。目前2Gb以下容量的NAND型闪存绝大多数是(512+16)字节的页面容量,2Gb以上容量的NAND型闪存则将页容量扩大到(2048+64)字节。
  NAND型闪存以块为单位进行擦除操作。闪存的写入操作必须在空白区域进行,如果目标区域已经有数据,必须先擦除后写入,因此擦除操作是闪存的基本操作。一般每个块包含32个512字节的页,容量16KB;而大容量闪存采用2KB页时,则每个块包含64个页,容量128KB。
  每颗NAND型闪存的I/O接口一般是8条,每条数据线每次传输(512+16)bit信息,8条就是(512+16)×8bit,也就是前面说的512字节。但较大容量的NAND型闪存也越来越多地采用16条I/O线的设计,如三星编号K9K1G16U0A的芯片就是64M×16bit的NAND型闪存,容量1Gb,基本数据单位是(256+ 8) ×16bit,还是512字节。
  寻址时,NAND型闪存通过8条I/O接口数据线传输地址信息包,每包传送8位地址信息。由于闪存芯片容量比较大,一组8位地址只够寻址256个页,显然是不够的,因此通常一次地址传送需要分若干组,占用若干个时钟周期。NAND的地址信息包括列地址(页面中的起始操作地址)、块地址和相应的页面地址,传送时分别分组,至少需要三次,占用三个周期。随着容量的增大,地址信息会更多,需要占用更多的时钟周期传输,因此NAND型闪存的一个重要特点就是容量越大,寻址时间越长。而且,由于传送地址周期比其他存储介质长,因此NAND型闪存比其他存储介质更不适合大量的小容量读写请求。

二.MTD
MTD是memory technology Device的缩写。MTD支持类似于内存的存储器,它是底层硬件和上层软件之间的桥梁。对底层来说,它无论对nor型或是nandflash都有很好的驱动支持,对上层来说,它抽象出文件系统所需要的接口函数。同时由于flash自身的特别之处(既有类似块设备的特点,又有类似字符设备的特点),MTD可以把flash同时为块设备和字符设备。有了MTD,编写flash的驱动变得十分轻松,因为上层的架构都已经做好,我们只用看看flash的datasheet,写最底层的控制时序即可。 
以下内容为翻译自mtd官方网站http://www.linux-mtd.infradead.org/archive/index.html
mtd致力于为存储器,尤其是flash,设计一个通用的linux下的子系统。
设计这个系统的目标在于,通过这个系统所提供的硬件驱动和上层系统之间的接口,我们可以方便的为新的硬件编写驱动。
对于底层的硬件驱动来说,它们所以提供是读,写,擦除的流程。而文件的存储形式是和他们无关的(如FTL,FFS2等等),用恰当的形式存储用户的数据那时上层系统关注的事情。
MTD的用户模块
MTD为用户提供五种可以直接在用户空间使用的模块
字符设备
块设备
flash转换层
nandflash转换层
JFFS2文件系统

三.yaffs2文件系统
针对于flash的文件系统有很多,据我了解有jffs(1,2,3),yaffs(1,2)。还有商业的三星开发的RFS(健壮文件系统),专门针对三星自己的nand和onenand,从底层驱动到上层文件系统一条龙服务,而且号称和fat格式100%兼容。当时看得我直流口水,心里把三星恨的咬牙切齿。 下面主要介绍一下开源的yaffs文件系统。
Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,一般说来,YAFFS对512byte/page以下都有很好的支持,而更大的页就需要YAFFS2了,如2K/page。
Yaffs文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR FLASH的应用场合设计的,而NOR FLASH和NAND FLASH本质上有较大的区别,所以尽管JFFS1/2 文件系统也能应用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。
Yaffs对文件系统上的所有内容(比如正常文件,目录,链接,设备文件等等)都统一当作文件来处理,每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名、Parent Object ID等信息。因为需要在一页内放下这些内容,所以对文件名的长度,符号链接对象的路径名等长度都有限制。
前面说到对于NAND FLASH上的每一页数据,都有额外的空间用来存储附加信息,通常NAND驱动只使用了这些空间的一部分,YAFFS正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。同时由于支持的page变大,YAFFS2使用更多的spare space来存储这些信息。在结构上YAFFS和YAFFS2有一定的不同,具体结构可以去看一看这篇文档http://www.aleph1.co.uk/node/38
那么这个文件系统是如何运作起来呢。
操作文件系统的第一步自然是取得SuperBlock了,Yaffs文件系统本身在NAND Flash上并不存在所谓的SuperBlock块,完全是在文件系统mount的过程中由read_super函数填充的,不过有意思的一点是,由于物理上没有存储superblock块,所以NAND Flash上的yaffs文件系统本身没有存储filesystem的魔数(MagicNum),在内存中superblock里的s_magic参数也是直接赋值的,所以存储在NAND FLASH上的任何文件系统都能被当作yaffs文件系统mount上来,只是数据都会被当作错误数据放在lost+found目录中,不知道这算不算yaffs文件系统的一个bug。
通常一个具体的文件系统在VFS的Super_block结构中除了通用的数据外,还有自己专用的数据,Yaffs文件系统的专用数据是一个yaffs_DeviceStruct结构,主要用来存储一些相关软硬件配置信息,相关函数指针和统计信息等。
在mount过程执行read_super的过程中,Yaffs文件系统还需要将文件系统的目录结构在内存中建立起来。由于没有super块,所以需要扫描Yaffs分区,根据从OOB中读取出的yaffs_tags信息判断出是文件头page还是数据page。再根据文件头page中的内容以及数据page中的ObjectID/ChunkID/serial Number等信息在内存中为每个文件(Object)建立一个对应的yaffs_object对象。
在yaffs_object结构中,主要包含了:
    如修改时间,用户ID,组ID等文件属性;
    用作yaffs文件系统维护用的各种标记位如脏(dirty)标记,删除标记等等;
    用作组织结构的,如指向父目录的Parent指针,指向同级目录中其他对象链表的     siblings双向链表头结构
此外根据Object类型的不同(目录,文件,链接),对应于某一具体类型的Object,在Yaffs_object中还有其各自专有的数据内容
       普通文件:文件尺寸,用于快速查找文件数据块的yaffs_Tnode 树的指针等
       目录:目录项内容双向链表头(children)
       链接:softlink的alias,hardlink对应的ObjectID
除了对应于存储在NAND FLASH上的object而建立起来的yaffs_object以外,在read_super执行过程中还会建立一些虚拟对象(Fake Object),这些Fake Object在NAND FLASH上没有对应的物理实体,比如在建立文件目录结构的最初,yaffs会建立四个虚拟目录(Fake Directory):rootDir, unlinkedDir, deleteDir, lostNfoundDir分别用作根目录,unlinked对象挂接的目录,delete对象挂接的目录,无效或零时数据块挂接的目录。
通过创建这些yaffs_object,yaffs文件系统就能够将存储在NAND FLASH上数据系统的组织起来,在内存中维护一个完整的文件系统结构
另外,我在看YAFFS2的源代码的时候发现,YAFFS2再mount和umount和YAFFS有所区别,增加一个checkpoint机制,每次在umount的时候,YAFFS2会开辟专门几个block用来存取一些信息,等待下次mount的时候就不需要扫描整个flash,而只有找出这几个块就可以了,这样可以大大加速mount的时间。不过仔细的原理我也没有研究过。有兴趣的话可以看一看这封邮件http://www.aleph1.co.uk/pipermail/yaffs/2006q2/002019.html

累了,先到这里,下次写写移植的流程


嵌入式 关于在nandflash上运行yaffs2文件系统出现“No init found. Try passing init= option to kernel” “No init found.  Try passing init= option to kernel”这个问题困扰了我两天才解决,在网上也查了hen'duo 阅读详情

相关推荐

rt-thread驱动篇(08)---STM32F429单片机NAND FLASH驱动

rt-thread驱动篇(08)---STM32F429单片机NAND FLASH驱动

hurryddd 5228

基于nand flash的文件系统的整理

一、            Nandflash简介 基本概念:flash芯片、block、page、附加页 1.1结构 Flash芯片的擦除以块为单位,写以页为单位。在每个flash芯片中包括非常多的块,同款芯片上每个块的大小相同(2MB、4MB..),在每个块上包含多个页,每个页大小相同。在每个页面后都跟随着一个附加页,用来对对应页面进行标记或者对页上的数据进行校验,页面通常的大小为2Kb

Gikor 1万+

yaffs2源代码分析(最新版)

曾经,有位叫斑点的大牛,写了一篇yaffs2源代码分析,全网都在转载,但是我研读这片好文的时候,真心不爽,因为这篇所使用的yaffs2源代码太老了,现在看很多都对不上啊,那就本人自告奋勇的把里面的源码更新一遍,整体重新学习一遍,奉献给大家!

辰子老八 6239

嵌入式linux nand flash常用文件系统

在 Linux 内核中,MTD 子系统负责管理 NAMD Flash 设备,而搭配使用的文件系统可以是 YAFFS、UBIFS、JFFS2 等。:UBIFS 是一个基于 UBI(Unsorted Block Image)的文件系统,专门针对 NAND Flash 设备进行优化。:YAFFS 是一种专为 NAND Flash 设计的文件系统,具有较好的性能和持久性。它支持闪存存储器的特性,如块擦除、写入次数限制等,并且被广泛应用于嵌入式系统中。

gqd0757的博客 884

如何将YAFFS文件系统镜像烧入Nand Flash

和普通文件系统不同,YAFFS文件系统专门为Nand Flash设计,可以使用mkyaffsimage生成文件系统的镜像,但如果要将此镜像烧入Flash,那么有些地方需要注意。 硬件上,Nand Flash的设计已考虑到包含坏块的情况,对于每扇区512字节的Nand Flash,每扇区都有一个16字节额外的扩展区,通常用以存储此扇区的校验数据以及坏块标记等信息(WinCE则使用了其中4字节

noodies的专栏 5252

19_文件系统的制作 -YAFFS2

如果开发板只有Nand Flash, 那么选择最合适的文件系统为YAFFS文件系统。例如,mini2440只有 Nand Flash 没有 Nor Flash,因此选择的文件系统为 YAFFS2 文件系统

Leon的博客 460

YAFFS文件系统移植笔记

基于Linux2.6的YAFFS文件系统移植v1.0,2005-6-6一、YAFFS文件系统简介YAFFS,Yet Another Flash File System,是一种类似于JFFS/JFFS2的专门为Flash设计的嵌入式文件系统。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。它们的不同之处在于:(1)、JFFS是

menuconfig的专栏 1081

Linux学习系列五:Nand Flash根文件系统制作.pdf

Linux学习系列五:Nand Flash根文件系统制作.pdf

YAFFS2文件系统在嵌入式LINUX系统中的应用

<br />1.文件系统简述<br />随着32位CPU价格不断下跌,片上存储设备的容量相比越来越大,越来越多的嵌入式系统开始 应用各种嵌入式操作系统。一般在嵌入式领域,只要应用到操作系统的必然会需要一个,甚至是多个文件系统。所谓文件系统,实际上就是在一个具体的存储设备上 任何文件的组织和目录。这个设备可能是各种RAM、NAND FLASH、NOR FLASH等DOC设备,还有以NAND FLASH 为基础的各种存储卡等[1]。目前,针对不同的设备和应用有很多文件系统可供选择,例如EXT2、TEMP

685

CV领域交叉注意力机制:QKV在图像特征增强中的核心作用解析

本文深入解析了CV领域中交叉注意力机制的核心组件QKV在图像特征增强中的关键作用。通过通俗类比和实战案例,阐述了Q(查询)、K(键)、V(值)如何协同实现动态权重分配,从而在目标检测、图像分割与生成等任务中显著提升模型性能与语义对齐能力。

weixin_29194817的博客 441

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载)

本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。

weixin_29223603的博客 388

NAND_OOB_BBT

2012-03-15 22:34 在经过研读MTD中关于NANDflash的代码后,文件系统已经成功挂载,U-BOOT没有修改什么,只要保证nand_chip->ecc.mode = MTD_OOB_RAW;即以原始模式模式进行烧写。NAND驱动会调用相应的nand_write_page_raw()进行写NAND,至于TI提供的U-BOOT关于4bit 硬件ECC校验。没有修改,在使用U-

流水 1582

保姆级教程:在STM32CubeIDE上快速部署micro_ros到STM32F407(附常见问题解决)

本文提供了一份详细的保姆级教程,指导开发者如何在STM32CubeIDE上快速部署micro_ros到STM32F407微控制器。内容涵盖从Windows与Ubuntu双环境搭建、micro-ROS静态库编译、STM32CubeIDE工程深度集成,到串口通信联调与常见问题解决的完整流程,旨在帮助读者构建稳定可靠的ROS2与嵌入式设备通信系统。

o4p5q6r7s的博客 324

FAT over NAND Flash

引子 最近有一个项目需要在NAND FLASH裸片上建立文件系统,由于必须通过USB给Windows访问,所以FAT是唯一的选择。由于FAT不是为Flash设计,因此需要透过FTL(Flash Translation Layer)来访问NAND FLASH。   原本以为FTL的支持在嵌入式Linux下是很成熟的,因为在编译内核时,MTD下就有可选的FTL和NFTL可供选择,但是dig进去才...

Step Third 404

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

10X Genomics单细胞数据分析实战:从FASTQ到UMAP可视化的完整流程

本文详细介绍了10X Genomics单细胞数据分析的完整流程,从FASTQ原始数据处理到UMAP可视化。通过Seurat工具包实现数据质量控制、标准化、降维聚类和细胞注释,特别适合生物信息学新手学习。文章包含可复现的代码示例和常见问题解决方案,帮助研究者快速掌握单细胞测序数据分析的核心技术。

weixin_30952535的博客 535

移植u-boot-2021.07-rc3到开发板

本人想在s3c2440的开发板搭建一个基于最新uboot,kernel,busybox_yaffs.fs的linux操作系统,方便学习Linux驱动时有一个自己的实验环境,同时也可以了解最新的Linux

qq_43418840的博客 1157

LangChain与LangGraph核心区别解析

LangChain与LangGraph是当前大语言模型(LLM)应用开发中两个紧密相关且极具影响力的开源框架。它们源于LangChain AI公司,设计哲学互补,旨在解决不同维度的LLM工程化问题,共同构成了构建复杂智能应用的强大工具集。

weixin_35774598的博客 1927

一步一步制作yaffs/yaffs2根文件系统(一)---储备好基础知识再打

版权声明:本文为博主原创文章,未经博主允许不得转载。                             开发环境:Ubuntu 12.04                             开发板:mini2440  256M NandFlash   64M SDRAM                              交叉编译器:arm-linux-

niepangu的专栏 450

从 Non-Unicode 到 Unicode:ABAP 程序切换的坑、原理与工程化落地指南

摘要 老SAP系统中ABAP程序员常假设1字符=1字节,导致大量代码依赖单字节处理逻辑。Unicode系统的引入彻底改变了字符长度、偏移量等底层认知,强制要求程序遵循Unicode规则。关键问题包括:字符/字节语义混淆、结构体访问风险、以及ABAP语言版本的门槛限制。迁移时需要重点关注字符串处理、二进制协议解析等场景,利用UCCHECK、RSUNISCAN_FINAL等工具扫描风险,并通过持续集成机制确保代码质量。建议在Non-Unicode阶段就启用unicode_check参数模拟严格模式,分批次修复问

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3458

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2028

u-boot-2009.08在mini2440上的移植(五)---增加yaffs2文件系统

u-boot-2009.08在mini2440上的移植(五)---增加yaffs2文件系统   移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor f

Seal--学海无涯 1072

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

yaffs2文件系统结构及应用

文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区中的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点(所挂载的目录)。 mount –t filesystemtype  filesystem mountpoint e.g  mount  -t

Junior的专栏 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Linux下minicom的配置和使用方法
下一篇: 在Linux下使用DNW给开发板下载
MacroCrazier
博客等级 码龄19年 39粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值