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. Tomcat 访问Manager APP报403错误

    已在conf/tomcat-users.xml中添加用户信息 但是通过外网访问该tomcat的Manager App报403错误 原因是因为tomcat进行了ip限制,导致虚拟机中能够正常进入mana ...

  2. linux下网络配置小节[from 老男孩的linux运维笔记]

    对于linux高手看似简单的网络配置问题,也许要说出所以然来也并不轻松,因此仍然有太多的初学者徘徊在门外就不奇怪了, 这里,老男孩老师花了一些时间总结了这个文档小结,也还不够完善,欢迎大家补充,交流. ...

  3. k8s实战之Service

    一.概述 为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持,k8s中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构,任何 ...

  4. JAVA RSA私钥 加密(签名) 对应 C# RSA私钥 加密(签名)

    非对称密钥RSA算法加解密在C#和Java之间交互的问题,这两天看了很多其他人写的文章,碰到了几个问题,最终解决问题. 参考地址:http://xw-z1985.iteye.com/blog/1837 ...

  5. 【Android】Android实现Handler异步详解

    方式不止一种,这里使用的是Timer类,创建一个定时器.我们经常需要获得移动设备端口的显示屏信息,但是onCreate()方法执行的时候,OnShow()方法不一定执行了,也就是说,在执行Oncrea ...

  6. 域名 ip地址 端口号

    域名默认指定一个ip地址 当用域名访问网站的时候 网站会默认给个端口号80 或者自己指定 其他的 例如数据库 也是会给端口号 例如mysql 3306 域名:80 是访问iis 网站域名:3306 是 ...

  7. MySQL -- 全文检索(布尔全文检索)

    modifier的值为in boolean mode的时候,可以使用布尔全文检索.在布尔全文检索中,有些字符在检索字符串的开头或结尾会有特殊含义.在下面的示例中,+和-操作符表明在匹配的时候,单词必须 ...

  8. SteveY对Amazon和Google平台的吐槽

    Steve Yegge, Amazon的前员工,现任Google员工,其本来想在Google+上和Google的员工讨论一些关于平台的东西,结果不小心把圈子设成了Public,结果这篇文章就公开给了全 ...

  9. Latex中如何设置字体颜色(3种方式)

    Latex中如何设置字体颜色(三种方式)   1.直接使用定义好的颜色 \usepackage{color} \textcolor{red/blue/green/black/white/cyan/ma ...

  10. Zephir入门 —— 语法篇

    概述 Zephir的语法跟PHP很相似,所以这里不会把官网的文档照搬过来翻译一遍,而是会把一些Zephir相较于PHP比较特别的语法挑出来讲一下.如果想要要完整学习Zephir的语法,没有比官网的文档 ...