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. Android百度地图相关内容汇总

    Android百度地图知识讲解 1.百度地图开发环境搭建    http://www.apkbus.com/android-116050-1-1.html 2.Android百度地图系列教程    h ...

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

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

  3. Redis学习之路(007)- Redis学习手册(实例代码)

    在之前的博客中已经非常详细的介绍了Redis的各种操作命令.运行机制和服务器初始化参数配置.本篇博客是该系列博客中的最后一篇,在这里将给出基于Redis客户端组件访问并操作Redis服务器的代码示例. ...

  4. c语言之函数参数传递之数组篇(转)

    在VC中写程序都习惯了,一般数组作为函数实参时,最常用的方法就是引用和指针的方法,但是到C语言中就没有引用了,还有一种比较常用的方法: #include <stdio.h>void sor ...

  5. POJ 2230 Watchcow (欧拉回路)

    Watchcow Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5258   Accepted: 2206   Specia ...

  6. .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片

    .NET压缩图片保存   需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用 ...

  7. Linux 性能測试工具

    Linux 性能測试工具 linux performance 查看系统配置 查看CPU信息 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64- ...

  8. 【转载整理】Hibernater的锁机制

    转载原文:http://www.cnblogs.com/otomedaybreak/archive/2012/01/27/2330008.html 概要:数据库事务,事务并发,hibernate悲观锁 ...

  9. Android studio的一些常用快捷键

    Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如g ...

  10. Web安全之XSS(Cross Site Scripting)深入理解

    XSS的含义 XSS(Cross Site Scripting)即跨站脚本.跨站的主要内容是在脚本上. 跨站脚本 跨站脚本的跨,体现了浏览器的特性,可以跨域.所以也就给远程代码或者第三方域上的代码提供 ...