Flash存储器

——》Flash存储器是近几年来发展最快的存储设备,通常也称作闪存。Flash属于EEPROM(电可擦除可编程只读存储器),是一类存取速度很高的存储器。

——》它既有ROM断电可保存数据的特点,又有易于擦写的特点。Flash可以在断电的情况下长期保存信息,因此被广泛的应用在PC机的BIOS和嵌入式系统的存储设备。


Linux Flash驱动结构

——》Linux内核对Flash存储器有很好的支持。内核设计了一个MTD结构支持Flash设备,用户只需要按照MTD的要求设置Flash设备的参数并且提供驱动就可以让Flash设备很好的工作。


MTD概述

——》MTD是英文Memory Technology Device的缩写,中文可以直接译为内存技术设备。

——》MTD是Linux内核为支持闪存设备的一个驱动中间层。

——》对内核其他部分来说,MTD屏蔽了闪存设备的细节;对于闪存设备驱动来说,只需要向MTD中间层提供接口就可以向内核提供闪存设备支持。


MTD系统结构

——》Linux内核MTD设备相关代码在drivers/mtd目录下,设计MTD的目的是让新的闪存设备使用更简单。MTD设备可以分层四层。

——》如图所示,内核 MTD从上到下可以分成设备节点、MTD设备层、MTD原始设备层和硬件驱动层在内核中,文件系统和根文件系统都可以建立在 MTD基础上。


设备节点层

——》通过 mknod命令可以在 /dev目录下建立 MTD字符设备节点(主设备号 90)和 MTD块节点(主设备号 31),通过设备节点可以访问 MTD字符设备和块设备。


MTD设备层

——》MTD设备层基于 MTD原始设备,向上一层提供文件操作函数,如 lseek()、open()、close()、read()、write()等。

——》MTD块设备定义了一个描述 MTD块设备的结构 mtdblk_dev,并且申明了一个 mtdblks数据用于存放系统所有注册的 MTD块设备。


MTD原始设备层

——》MTD原始设备层由两部分组成,一部分包括 MTD原始设备的通用代码,另一部分包括特定的 Flash数据,如闪存分区等。MTD原始设备的 mtd_info结构描述定义了有关 MTD的大量数据的操作函数。

——》drivers/mtd/mtd_core.c文件定义了 mtd_table全局变量作为 MTD原始设备列表,drivers/mtd/mtd_part.c定义了 mtd_part全局变量作为 MTD原始设备分区结构,其中包含 mtd_info结构。

——》在内核中每个 MTD分区都被当作一个 MTD原始设备加入到 mtd_table中进行处理。

——》drivers/mtd/maps目录存放的是特定的闪存数据,该目录下每个文件都对应一种类型开发板上的闪存。通过调用内核提供的 add_mtd_device()函数可以建立一个 mtd_info结构并加入到 mtd_table中,通过 del_mtd_device()函数可以从 mtd_table中删除一个闪存设备。


硬件驱动层

——》硬件驱动层负责在系统初始化的时候驱动闪存硬件。

——》Linux内核 MTD技术中,比较难理解的是设备层和原始设备层的关系,如下所示

——》一个 MTD原始设备可以通过 mtd_part结构被分成多个 MTD原始设备,然后注册到 mtd_table中。

——》mtd_table列表中,每个 MTD原始设备都可以注册为一个 MTD设备。其中,字符设备的主设备号是 90,次设备号奇数是只读设备,偶数是可读写设备;块设备的主设备号是 31,次设备号为连续的自然数。


Flash设备基础

——》NAND和NOR是两种不同的Flash存储技术,它们各有不同,适合不同的工作范围。编写一个闪存设备的驱动不仅需要了解MTD的结构,还需要知道闪存设备的硬件原理。


存储原理

——》NAND和NOR闪存都使用三端器件作为存储单元,和模拟电子技术里面的一种叫做场效应管的器件原理类似。三端器件分别有源极、漏极和栅极,栅极利用了电场效应控制源极于漏极之间的通断。

——》从上可以看出,三端器件的底部是一个硅基,用来存放材料,浮置栅极是由氮化物夹在两层二氧化硅中间构成的,中间的氮化物可以存储电荷,达到存储数据的目的。

——》程序向数据单元写入数据的过程就是向浮置栅极中间注入电荷的过程。

——》从物理角度看,写入数据有热电子注入(Hot Election Injection)和 F-N隧道效应(Fowler Nordheim Tunneling)。这两种技术的区别是,一种通过源极给浮置栅极充电,另一种通过硅基给浮置栅极充电。通常 NOR Flash使用热电子注入方式,而 NAND Flash使用 F-N隧道效应充电。

——》Flash存储器在写入数据前必须把数据擦除,从物理角度看就是把浮置栅极的电荷释放掉。两种Flash都是通过 F-N隧道效应放电。

——》对程序来说,向浮置栅极注入电荷表示写入了二进制数据 0,没有注入电荷表示二进制 1.因此,擦除 Flash数据是写 1,而不是写 0,这点与传统的存储设备不同。

——》NOR和 NAND Flash具有相同的存储单元,工作原理也相同,每次按照一定大小的块读取数据会降低存取时间,NAND Flash只能按照串行读取数据,而 NOR Flash可以按照块读取数据。为了读取数据,必须对存储单元进行编址。NAND Flash把存储单元分成若干块,每个块又可以分成页,每个页是 512字节大小。NOR Flash的地址线是并联方式的,因此 NOR可以使用直接寻址方式存取数据。


性能比较

——》NOR闪存的特点是支持片内执行(Execute In Place),应用程序不必加载到RAM就可以直接运行,简化了软件开发。NOR闪存的读取速率非常高,但是容量通常不大,因为容量大成本会显著增大。此外,NOR闪存的写入和擦除速度非常慢,不利于大量数据存储。

——》NAND Flash特点是存储密度高,写入和擦除速度都比NOR Flash快,适合大数据量存储。但是,NAND Flash需要特殊的存储电路控制,并且空的或者已经擦除的单元才能写入数据,所以必须在写入数据之前先擦除块。


NOR Flash设备驱动框架

——》Linux内核提供了map_info结构描述NOR Flash设备,驱动程序围绕该结构操作,通过内核提供的注册函数把芯片的信息提交给内核,并且提供必要的操作函数。

——》在一个 NOR Flash设备驱动程序中,主要需要考虑到初始化和清除两个部分。

——》Linux内核 NOR Flash驱动程序与 MTD层的关系

——》典型的 NOR Flash驱动模型


NAND Flash设备驱动框架

——》NAND Flash设备使用nand_chip结构描述。该结构与 MTD层的关系如图所示。

——》在 MTD层的映射下,编写 Linux系统 NAND Flash设备驱动工作量相对较小,主要集中在向内核提供必要的设备硬件信息。

——》注意:内核提供了 ECC校验算法,如果硬件没有提供 ECC,则 nand_chip结构中的 calculate_ecc成员函数不需要设置。

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1229779

【驱动】Flash设备驱动基础·NOR·NAND的更多相关文章

  1. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...

  2. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...

  3. spi驱动框架全面分析,从master驱动到设备驱动

    内核版本:linux2.6.32.2  硬件资源:s3c2440 参考:  韦东山SPI视频教程 内容概括:     1.I2C 驱动框架回顾     2.SPI 框架简单介绍     3.maste ...

  4. LinuxI2C核心、总线驱动与设备驱动

    I2C体系结构分为三个部分:I2C核心.总线驱动.设备驱动 I2C核心: I2C核心提供了一组不依赖硬件的接口函数,I2C总线驱动和设备驱动之间依赖于I2C核心作为纽带 (1)增加/删除i2c_ada ...

  5. 【驱动】linux设备驱动·字符设备驱动开发

    Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...

  6. Linux字符设备驱动--Led设备驱动

    ①驱动源码 #include <linux/module.h> #include <linux/init.h> #include <linux/cdev.h> #i ...

  7. 《Linux设备驱动开发具体解释(第3版)》进展同步更新

    本博实时更新<Linux设备驱动开发具体解释(第3版)>的最新进展. 2015.2.26 差点儿完毕初稿. 本书已经rebase到开发中的Linux 4.0内核,案例多数基于多核CORTE ...

  8. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

  9. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

随机推荐

  1. 阿里云安装jdk,tomcat,maven,svn,git,nginx

    1. 首先通过xftp等工具上传安装包 2. 配置目录 cd usr mkdir java cd java mkdir jdk mkdir tomcatmkdir maven 3. 安装jdk 3.1 ...

  2. [转载]DB2与ORACLE、MYSQL比较2

    原文地址:DB2与ORACLE.MYSQL比较2作者:欣颖 4.2 Oracle9i  Oracle的产品战略是每12到18个月发布一个主要版本.主要发行版本所遵循的命名战略在PC领域中更为常见,它不 ...

  3. 【DeepLearning】UFLDL tutorial错误记录

    (一)Autoencoders and Sparsity章节公式错误: s2 应为 s3. 意为从第2层(隐藏层)i节点到输出层j节点的误差加权和. (二)Support functions for ...

  4. iOS 优秀开源框架 开源包 开发包 from : Podfile of chatsecure ---待完善

    前段时间发现chatsecure的podfile中使用了很多非常优秀的开源包 和 大公司的sdk. 拿出来分享下. 各个类库的作用待完善. platform :ios, "7.0" ...

  5. 跟我学SharePoint2013视频培训课程——设置列表名称、描述、导航等基本信息(12)

    课程简介 第12天,怎样在SharePoint 2013设置列表名称.描述.导航等基本信息. 视频 SharePoint 2013 交流群 41032413

  6. PowerShell 获取Site Collection下被签出的文件

    由于权限的设置,当文件被签出时导致别人不可见了,这对校验文件个数的人来说着实是件烦恼的事.幸好利用PowerShell,可以获取Site Collection下被签出的文件. Resolution A ...

  7. 配置IISserver

    我们自己开发站点的时候   要在自己的电脑上写网页 然后我们怎么能像我们浏览互联网上的网页一样.而不是直接双击打开网页呢   这时候就要配置IISserver  让自己能够 预览自己站点的效果 以下是 ...

  8. matlab入门笔记(一):常用快捷键

    摘自<matlab从入门到精通>胡晓东 matlab命令窗口常用快捷键与命令 matlab的工作空间和变量编辑窗口 搜索命令help和look for

  9. Python 爬虫编码格式问题 gb2312转换utf8

    遇到的问题是:爬取网页得到的结果如下(部分)  里面的中文出现乱码. <!DOCTYPE html> <html lang='zh-CN'> <head> < ...

  10. zTree变异篇:如何让同级树节点平铺而非垂直显示

    昨天有一个zTree的使用者在实际的项目中有着这样一个特殊的需求,要求同级树节点能够水平显示,根据设定的宽度自动换行,效果图如下所示:   通过在浏览器调试模式下观察其同级节点的css为: 这个dis ...