首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S3C2440 flash 分区 nor nand FLASH区别(3)

S3C2440 flash 分区 nor nand FLASH区别(3)

nandflash 特别说明:
nandflash 的 位操作只能从1变为0,所以在写之前需要将芯片进行檫除,使之全部变为1,因此也需要使用异地更新策略
nandflash 檫除以块(block)为单位 读写以页(page)为单位
nandflash 从结构上分:可以分为 小页 大页 FLASH
页是最小的可操作区域,页上面包含两个部分:数据(data)区 和 备份(spare)区
小页:
1page = 512bytes(datafield) +16bytes(Spare Field) 我们算容量时 是不把备份区算入得
大页:1page = 2k bytes(datafield) + 64bytes(SpareField)
1 block = 32 page   sparefield:作用是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,因为nandflash有可能产生位反转 写干扰 读干扰 引入RCC校验码 这个校验码就存放在备份区中 保证数据的正确性
FLASH一般拥有与页容量相同的页寄存器 用于数据缓存,当读取数据时先从flash存储单元把数据读到页寄存器 外部通过访问flashIO端口输入获得页寄存器中的数据(地址自动累加) 但写数据时 外部通过flash io 端输入的数据首先缓存在页寄存器在写命令发出后写入到存储器中
nandflash 每个block 檫写次数有限 SLC为10的6次方 次MLC为10的5次方 次,这样的话 就很有必要引入磨损控制机制,防止一直檫除同一个块以使得每个块均匀檫写

读命令有两个,分别是 Read1,Read2其中Read1用于读取Data Field的数据,而Read2则是用于读取SpareField的数据。对于NandFlash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个 Byte为止(可以包括SpareField)


flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" title="S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" height="373" width="534">


NOR flash采用位读写,因为它具有sram的接口,有足够的引脚来寻址,可以很容易的存取其内部的每一个字节。 NANDflash使用复杂的I/O口来串行地存取数据。8个引脚用来传送控制、地址和数据信息(复用)。NAND的读和写单位为512Byte的页,擦写单位为32页的块。
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5s快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少。
在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
再来看看Nand flash自身的特点(部分摘自August0703的文章):
Nand Flash的数据是以bit的方式保存在memory cell中,一般来说,一个cell 中只能存储一个bit。这些cell以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。多个line(多个位宽大小的数据)会再组成Page。我使用的Nandflash是三星的K9F1208U0M,从datesheet上得知,此flash每页528Bytes(512byte的MainArea + 16byte的SpareArea),每32个page形成一个Block(32*528B)。具体一片flash上有多少个Block视需要所定。我所使用的k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB(SpaerArea)是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。 Nandflash以页(512Byte)为单位读写数据,而以块(16KB)为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
● Column Address:列地址,地址的低8位
● Page Address :页地址
● Block Address :块地址

512bytes理论上被分为1st half和2sdhalf,每个half各占256个字节。528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。第0行为第0Byte ,第1行为第1Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit。

flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" title="S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构">
/////////////////////////
nandflash 拥有与磁盘不同的物理特性,在对其进行读写时,需要使用不同的解决方案,以解决垃圾收集 磨损控制ECC校验等问题
在linux 中 主要分为 :
1:在FTL上挂载普通磁盘文件 系统
2:在原生flash上使用日志 结构文件系统
FTL 层 与原生文件系统 在linux 内核中的整体结构(关系)如下
flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" title="S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" height="389" width="484">

虚拟文件系统:VFS是一个为用户空间提供文件系统相关接口的内核子系统,他主要的设计思想是在底层不同类型的文件系统之上建立一个统一的抽象接口,使用户可以不用关心实际的存储介质与具体部署的文件系统类型,直接使用open()read() write()等系统调用,VFS提供一个unix风格的文件系统原型框架,该原型框架具有一般文件系统的功能和行为,通过定义基本的文件系统功能接口与数据结构,实际文件系统只需要编程这些抽象功能接口与数据结构就可以完成VFS的抽象 VFS实际使用了面向对象的设计思想 在内核使用C代码的指针来完成面向对象的语义
VFS拥有四个主要的数据结构对象:
1:struct super_block 超级块结构对象定义在<linux/fs.h>;
  用于保存特定的文件系统的相关信息,对于磁盘文件系统,超级块结构对象一般存储于磁盘的特定扇区,对于非磁盘文件系统将会现场创建特定的超级块并保存于内存中
2:struct inode索引节点结构对象    定义在<linux/fs.h>;
   索引节点结构对象 包含对特定文件的所有相关信息(如访问权限大小 创建时间等)
3:struct dentry目录项结构对象     定义在<linux/decache.h>
   目录项结构对象 表示路径中的组成方式 用于加速路径名的查找并不包括目录的相关信息(Linux中目录被看成一个普通文件)
4:struct file文件对象             定义在<linux/fs.h>
   用于记录文件对象 文件对象是从进程角度在内存中打开的文件表示它与索引节点结构体对象与目录项对象不同 与文件并不是一一对应的关系
四种结构体对象都以结构体的形式定义了与其相关联的操作 分别是
1:超级块操作   structsuper_operation
  在超级块结构中成员变量名为s_op,用于保存特定文件系统的一些底层操作,包括对索引节点的分配释放 读写删除索引节点释放重写超级块等
2:索引节点操作 struct inode_operation
   在索引节点结中成员变量名为i_op用于描述VFS操作索引节点的所有方法 包括在给定节点上创建移动文件 建立连接 创建删除目录等
3:目录项操作   structdentry_operation
   在目录项对象中成员变量为d_op 用于描述目录项的所有方法包括判断目录对象的有效性 文件名比较等
4:文件操作    struct file_operation
   在文件对象中成员变量名为f_op是一些标准liunx系统调用的基础 包括read write ioctl 等函数的具体实现
我们可以来分析一个实例
linux 内核write() 系统调用最终转换为yaffs2文件系统所注册的write处理函数
1:用户进程要进行write操作 需要打开文件 并在内核中建立一个与文件相对应得struct file对象以向文件写入数据
2:write()系统调用发起后 程序进入内核态 调用sys.write()处理函数 sys.write()函数检测文件对象中f_op成员变量 并调用f_op 结构体中所实现的write()函数这样应用程序中的write()系统调用就转换成了yaffs2文件系统注册的write()处理函数了
在yaffs2文件系统中 f_op ->write()使用的是定义于filemap.c中的generic_file_write()函数
flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" title="S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构">
flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" title="S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" height="424" width="588">
继承事业,薪火相传
返回列表