- 浏览: 1474322 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
getelephantbyid:
make 无法通过.....
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
getelephantbyid:
patch -p1 ../php-5.4.7_thttpd-2 ...
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
zander:
zander 写道c 语言是静态类型语言还是动态类型语言阅读理 ...
什么是动态语言和静态语言? -
zander:
c 语言是静态类型语言还是动态类型语言
什么是动态语言和静态语言? -
lunajiayou:
很有道理,赞一个
跟着苍蝇会找到厕所,跟着蜜蜂会找到花朵
MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。将CFI接口的MTD设备分为四层 (从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
Flash 硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux
MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程序则位于/drivers/mtd/nand子目录下
二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。
用于描述MTD原始设备的数据结构是mtd_info,这其中 定义了大量的关于MTD的数据和操作函数。mtd_table(mtdcore.c)则是所有MTD原始设备的列 表,mtd_part(mtd_part.c)是用于表示MTD原始设备分区的结构,其中包含了mtd_info,因为每一个分区都是被看成一个MTD原 始设备加在mtd_table中的,mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part- >master中获得。
在drivers/mtd/maps/子目录下存放的是特定的flash的数据,每一个文件都描述了一块板子上的flash。其中调用 add_mtd_device()、del_mtd_device()建立/删除mtd_info结构并将其加入/删除mtd_table(或者调用 add_mtd_partition()、del_mtd_partition()(mtdpart.c)建立/删除mtd_part结构并将 mtd_part.mtd_info加入/删除mtd_table 中)。
三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。MTD字符设备的定义在mtdchar.c中实现,通过注册一系列file operation函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个 mtd_info一一对应。
四、设备节点:通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点(主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。
五、根文件系统:在Bootloader中将JFFS(或 JFFS2)的文件系统映像jffs.image(或jffs2.img)烧到flash的某一个分区中,在/arch/arm/mach-your /arch.c文件的your_fixup函数中将该分区作为根文件系统挂载。
六、文件系统:内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。
nand flash和NOR FLASH有什么区别。
nand flash和nor flash有许多不同之处,比如具体的存储管理方式,读写速度,价格等,我觉得最重要的一点区别是是NOR FLASH地址线和数据线分开,可以象SRAM一样连接在数据线上,而且NOR FLASH以“字”为基本单位来操作,因此程序可以直接在nor flash里运行,不必把代码COPY到RAM里才运行。所以一般把系统启动代码存放到NOR FLASH里,可以直接从FLASH启动系统。nand flash共用数据和地址线,而且是以块为单位操作数据,很难用来做启动芯片。因此boot代码一般放到nor flash里。
不过2410比较特殊,S3C2410在启动的时候,可以把nand flash前面的启动程序装载到2410里面自己一个4k大小的SRAM(Steppingstone) 里面,这4K SRAM被映射到0X0,从而实现nand flash模式的启动,从nand flash启动比nor flash模式速度要快。
uClinux平台下的Flash存储技术
建议在读这篇文章前,读一下NandFlash和NorFlash的异同
摘要:较为详细地介绍嵌入式操作系统uClinux平台下的Flash存储技术,并给出基于三星S3C4510系统下Dlash存储器具体设计实例。
关键词:Flash存储技术 uClinux平台 S3C4510
1 Flash类型与技术特点
Flash主要分为NOR
flash和NAND flash两类。下面对二者作较为详细的比较。
1.1 性能比较
Flash
闪存是非易失存储器,可以对存储器单元块进行擦写和再编程。任何Flash器件进行写入操作前必须先执行擦除。NAND器件执行擦除操作十分简单;而
NOR则要求在进行擦除前,先要将目标块内所有的位都写为0。擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为
1~5s;擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。执行擦除时,块尺寸的不同近一步拉大了NOR和NADN
之间的性能差距。统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。因此,当选择存储解决方案时,设计师必须权衡以下的各项因素。
*NOR的读取速度比NAND稍快一些。
*NAND的写入速度比NOR快很多。
*NAND的擦除速度远比NOR快。
*大多数写入操作需要先进行擦除操作。
*NAND的擦除单元更小,相应的擦除电路更少。
1.2 接口差别
NORFlash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容的每一字节。
NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。NAND的读和写操作采用512字节的块,这一点有点像硬盘管理此类操作。很自然地,基于NAND的存储器就可以取代硬盘或其它块设备。
1.3 容量和成本
NAND
Flash的单元尺寸几乎是NOR器件的一半。由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。
NOR
Flash占据了大部分容量为1~16MB的内存市场,而NAND Flash只是用在8~128MB的产品当中。
1.4 可靠性和耐用性
采用Flash介质时,一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。
(1)寿命(耐用性)
在NAND闪存中,每个块的最大擦写次数是100万次,而NOR的擦写次数是10万次。NAND存储器除了具有10:1的块擦除周期优势外,典型的NAND块尺寸要比NOR器件小8位,每个NAND存储器块在给定时间闪的删除次数要少一些。
(2)位交换
所有Flash器件都受位交换现象的困扰。在某些情况下(很少见,NAND发生的次数要比NOR多),一个比特位会发生反转或被报告反转了。
一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障就可能导致系统停机。如果只是报告有问题,多读几次就可能解决。
位反转的问题更多见于NAND闪存,NAND的供应商建议使用NAND闪存的时候,同时使用EDC/ECC算法。当然,如果用本地存储设备来存储操作系统、配置文件或其它敏感信息时,必须使用EDC/ECC系统以确保可靠性。
(3)坏块处理
NAND器件中的不坏块是随机分布的。以前做过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,如果通过可靠的方法不能进行这项处理。将导致高故障率。
1.5 易用性
可以非常直接地使用基于NOR的闪存,像其它存储器那样连接,并可以在上面直接运行代码。由于需要I/O接口,NAND要复杂得多。各种NAND
器件的存取方法因厂家而异。在使用NAND器件时,必须先写入驱动程序,才能继续执行其它操作。向NAND器件写入信息需要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。
1.6 软件支持
在NOR器件上运行代码不需要任何的软件支持。在NAND器件上进行同样操作时,通常需要驱动程序,也就是闪存技术驱动程序(MTD)。NAND
和NOR器件在进行写入和擦除操作时都需要MTD。使用NOR器件时,所需要的MTD要相对少一些。许多厂商都提供用于NOR器件的更高级的软件,其中包括M-System的TrueFFS驱动,该驱动被Wind
River System、Microsoft、QNX Sotrware System、
Symbian和Intel等厂商所采用。驱动还用于对DiskOnChip产品进行仿零点和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。
目前,NOR Flash的容量从几KB~64MB不等,NAND
Flash存储芯片的容量从8MB~128MB,而DiskonChip可以达到1024MB。
第1页第2页
2 系统设计
Flash 在每MB的存储开销上较RAM要昂贵,但对于uClinux系统来说,选择Flash作为存储器具有一定的优势。uClinux系统在上电后,需要运行的 程序代码和数据都可以存储在Flash中,甚至放在CPU起始地址中的uClinux启动内核都可以写入Flash中。从一定意义上讲,嵌入式系统只用 Flash就可以完成所需的存储功能。
Flash存储器的分区较硬盘的分区更为简单,分区后的Flash使用起来更加方便。典型的Flash分区如下。
SEGMENT PURPOSE
0 Bootloader
1 factory configuration
2
┆ kernel
X
┆ root filesystem
Y
分区0放置Bootloader,分区1放置factory configuration,分区2到分区X放置系统内核,分区X到分区Y放置根文件系统。Flash的分区可以根据需要划分,uClinux中支持Flash存储器的块设备驱动负责定义上述的分区。
和PC 机下的Linux不同,Flash的分区把系统内核文件和根文件系统单独划分到两个分区中,而PC机的硬盘是把内核文件和根文件系统放在一个分区内。PC 机下Linux的Bootloader是LILO或GRUB。它们在系统启动时能智能地在分区中找到内核文件块,并把它加载到RAM中运行。对于 Flash而言,把内核的镜像文件写进一个单独的分区对嵌入式系统有两大优点:①系统可以直接在Flash上运行;②LILO或GRUB更易找到内核代码并加载,甚至可以不用LILO或GRUB引导而直接运行。
内核文件和根文件系统在Flash中的放置,可以根据系统设计需要适当选择。
3 引导程序选择
系统启动之前的引导过程是CPU初始化的过程。包括ARM和X86在内的许多CPU是从固定地址单元开始运行引导程序 (Bootloader)的。其它的部分CPU是从某个地址单元读入引导程序的入口地址,然后再运行引导程序,譬如M68K和Coldfire系列。所以 这些都影响到Flash中系统启动代码的存放地址。
系统首先要考虑的是在什么地址存放Bootloader,或者说系统从哪个地址单元开始加载运行系统内核代码。
CPU 启动后直接运行系统内核是可以实现的。对于uClinux来说,启动代码必须包括芯片的初始化和RAM的初始化等硬件配置;同时加载内核的代码段到RAM 中,并清除初始化的数据段内容。尽管这些实现起来很直观,但是要具体把启动代码存放在Flash中正确的地址偏移单元内,使CPU一启动便能执行就比较困难了。不过,现在技术比较先进的CPU都将默认的偏移地址设置为0,或者在偏移地址为0的附近存放起始地址。
Bootloader是一段单独的代码,用以负责基本硬件的初始化过程,并且加载和运行uClinux的内核代码。作为系统启动工具, Bootloader经过配置可以加载Flash中的多个内核,甚至可以通过串口和网口来加载内核和系统的镜像到RAM中运行。Bootloader同时 也提供对内核镜像文件的多级别保护,这一点对于以Flash作为存储设备的系统来说非常重要。譬如,当系统进行内核升级和重要数据备份时,系统突然掉电, 正如PC机进行BIOS刷写过程中的旧电一样,都是灾难性的。但是利用Bootloader就可以实现保护性的恢复。
目前运行在uClinux上的免费Bootloader有COLILO、MRB、PPCBOOT和DBUG。也有为特殊需求设计的SNAPGEAR和ARCTURUS NETWORKS。
4 uClinux的块驱动器
对于嵌入式系统的块设备,可选择存储文件系统的块驱动器(Block Driver)主要有三种选择。
①Blkmem driver。Blkmem driver仍是uClinux上使用最普通的Flash驱动器。它是为uClinux而设计的,但是它的结构相对比较简单,并且仅支持NOR Flash的操作,需要在RAM中建立根文件系统。同时它也很难配置,需要代码修改表来建立Flash分区。尽管如此,它还是提供了最基本的分区擦/写操作。
②MTD driver。MTD driver是Linux下标准的Flash驱动器。它支持大多数Flash存储设备,兼有功能强大的分区定义和映像工具。借用交叉存取技术(interleaving),MTD driver甚至可支持同一系统中不同类型的Flash,Linux内核中关于 MTD driver配置有较为详细的选择项。
③RAM disk driver。在无盘启动的标准Linux中,用得最多的就是RAM disk driver;但它不支持底层的Flash存储器,仅对根文件系统的建立有意义,即根文件系统压缩以后存放在Flash的什么地方。
通过上面的比较可以看到,MTD driver提供对Flash最有力的支持同,同时它也支持在Flash上直接运行文件系统,譬如JFFS和JFFS2,而B1kmem driver则不支持。
5 根文件系统
uClinux中的文件系统可以有多种选择。通常情况下,ROMfs是使用最多的文件系统,它是一种简单、紧凑和只读的文件系统。ROMfs顺序存储文件数据,并可以在uClinux支持的存储设备上直接运行文件系统,这样可以在系统运行时节省许多RAM空间。
Cramfs 是针对Linux内核2.4之后的版本所设计的一种新型文件系统,也是压缩和只读格式的。它主要的优点是将文件数据以压缩形式存储,在需要运行的时候进行 解压缩。由于它存储的文件形式是压缩的格式,所以文件系统不能直接在Flash上运行。虽然这样可以节约很多Flash存储空间,但是文件系统运行需要将 大量的数据拷贝进RAM中,消耗了RAM空间。
考虑到多数系统需要能够读/写的文件系统,可以使用MTD driver的JFFS和JFFS2日志式文件在Flash头部建立根文件系统(Root Filesystem)。日志式文件系统可以免受系统突然掉电的危险,并且在下一次系统引导时不需要文件系统的检查。由于JFFS和 JFFS2文件格式是特别为Flash存储器设计的,二者都具一种称为“损耗平衡”的特点,也就是说Flash的所有被擦写的单元都保持相同的擦写次数。 利用这些特有保护措施,Flash的使用周期得到相当大的提升。JFFS2使用压缩的文件格式,为Flash节省了大量的存储空间,它更优于JFFS格式 在系统中使用。值得注意的是,使用JFFS2格式可能带来少量的Flash空间的浪费,这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪 费的空间大小约是两个数据段。
如果使用RAM disk,一般应选择EXT2文件格式,但EXT2并不是一块特别高效的文件存储空间。由于存在RAM disk上,所以任何改变在下一次启动后都会丢失。当然,也有许多人认为对嵌入式存储空间来讲,这是一种优势,因为每次系统启动都是从已知的文件系统状态开始的。
虽然在Linux下有许多的文件格式可供选择,但是对于uClinux一般只选择上述的几种文件格式。另外一点就是如何在目标系统上建立 根文件系统,步骤如下:首先在开发宿主机上建立一个目标机的根文件系统的目录树,然后利用嵌入式根文件系统生成工具在宿主机上生成目录树的二进制文件镜 像,最后下载到目标机上就可以了。对于不同的文件格式有不同的二进制镜像生成工具,譬如JFFS的mkfs.jffs2、ISO9660的 mkisofs。
发表评论
-
理解 chroot
2012-04-06 20:01 1357什么是 chroot chroot,即 change ... -
buildroot中的grub打上ext4支持
2012-04-06 18:29 1625需要使用这里的补丁 http://bugs.debian.o ... -
Linux内核访问外设I/O资源的方式
2012-01-17 15:02 1283我们知道默认外设 I/O 资源是不在 Linux 内核 ... -
C编程经验之全局变量猛于虎
2011-12-26 14:20 1070转自:http://forum.eet-cn.com/FORU ... -
折腾了大半天的问题-交叉编译的时候缺少glibc-static库
2011-12-07 16:12 11034编译ncurses提示/usr/bin/ld: cannot ... -
ctags和cscope参数
2011-11-28 00:10 2862cscope find . -name "* ... -
Linux内核源码的ctags,cscope应用及增强补丁
2011-11-27 23:55 1964我用的是3.1的内核,把内核源码解压到/usr/src/lin ... -
printk 使用方法
2011-08-12 22:28 9894内核通过 printk() 输出的信息具有日志级别,日志级 ... -
VC运行时库的说明
2011-05-05 17:18 1527用vc的时候发现要依懒MSVCR100.dll,需要更改运行库 ... -
Microsoft Visual Studio 2010序列号/注册码
2010-08-18 18:05 3069Microsoft Visual Studio 2010序列号 ... -
英特尔® 架构上的 CPU 耗电量
2010-08-18 09:34 1465介绍 高时钟中断速率 ... -
基于kexec的崩溃转储机制
2010-08-01 22:09 4070设计 === 当一个 ... -
Fedora使用kdump
2010-07-30 11:01 2357kexec是一个快速启动机 ... -
C++ 运算符优先级列表
2010-07-20 16:05 1166The operators at the top of th ...
相关推荐
标题"mtd_mat.rar_MTD FIR_MTd 雷达_matlab雷达MTD_mtd MATLAB_radar" 提供了几个关键概念,包括 "MTD"(Moving Target Detection,移动目标检测),"FIR"(Finite Impulse Response,有限脉冲响应滤波器),"MATLAB...
脉冲压缩和MTD处理是雷达系统中的核心概念,它们对于提高雷达的探测性能,特别是距离分辨率和信噪比具有决定性作用。下面我们将详细探讨这些知识点。 首先,脉冲压缩是现代雷达系统中的一种信号处理技术。在发射...
mtd_read()函数的执行流程分析 在了解mtd_read()函数的执行流程之前,我们需要了解字符设备的驱动程序是...相关概念: * 字符设备驱动程序 * flash设备 * bad block问题 * 文件操作集 * 系统调用 * 用户层 * 内核层
下面将详细阐述这些概念及其在雷达系统中的应用。 首先,MTI雷达系统主要用于消除固定杂波,如地表反射或大气折射产生的干扰,以突出移动目标。MTI处理的核心是利用多普勒效应,通过比较不同时间接收到的回波信号,...
在深入分析MTD技术设备驱动框架之前,我们首先需要理解MTD的基本概念。 MTD是Linux内核为了抽象化各种不同类型的非易失性存储设备而设计的接口层。由于闪存的特性(如块擦除、有限的擦写次数等)与传统的磁盘存储有...
- **库的安装和链接**:了解动态库和静态库的概念,以及如何在编译时链接这些库。 - **系统调用**:MTD-utils与底层硬件交互,需要了解Linux内核提供的系统调用接口。 - **错误诊断和调试**:熟悉日志分析、调试工具...
为解决这一问题,研究者们引入了窗函数的概念,通过在信号处理前施加特定的窗函数,可以有效地控制FFT的旁瓣水平,优化滤波器组的整体性能。 #### 窗函数的选择与优化 文章中讨论了六种不同的窗函数(如矩形窗、...
MTD不直接支持文件系统的概念,而是专注于提供读写、擦除等基本操作,让文件系统开发者能够更专注于数据管理和错误处理。 MTD的工作原理主要包括以下几个关键部分: 1. **设备驱动**:每个特定的非易失性存储设备...
通过深入理解这些概念并实际操作`mtd.m`脚本,学习者可以掌握MTD雷达信号处理的基本原理和方法,为进一步研究雷达系统设计、信号分析和优化提供坚实基础。同时,这种仿真实践也有助于培养解决实际问题的能力,为实际...
在深入分析Linux MTD源代码之前,我们需要理解一些基本概念。 1. **MTD层次结构**:MTD将闪存设备分为几个层次,包括设备层、分区层和块层。设备层直接对应物理设备,如NAND或Nor闪存;分区层是对设备的逻辑划分,...
### MTD分区的概念与作用 MTD分区是基于MTD子系统创建的一种逻辑存储区域。它将物理存储设备划分为多个独立的分区,每个分区可以被分配不同的用途,比如操作系统、应用程序、用户数据、缓存等。通过这种方式,MTD...
本文将深入探讨这两个概念以及它们在雷达系统中的应用。 MTI,动目标指示器,是一种用于消除固定地物回波的雷达处理技术。在雷达扫描时,地面上的固定物体如建筑物、山体等会产生强烈的回波,这些回波会干扰对运动...
在这个主题中,我们主要关注MTD滤波器、多普勒滤波以及与慢速多普勒和脉冲多普勒相关的概念。 MTD滤波器是一种专门设计用于从雷达回波数据中提取移动目标信息的数字信号处理工具。其核心思想是利用多普勒效应,即当...
在学习和使用Linux MTD时,理解以下关键概念至关重要: 1. **eraseblock**:闪存的最小擦除单元,每个eraseblock可以包含多个pages。 2. **page**:闪存的最小读/写单位,通常小于eraseblock。 3. **Bad block ...
在深入探讨Linux MTD源码之前,我们先简要回顾一下MTD(Memory Technology Device)的概念及其在Linux生态系统中的角色。MTD是Linux内核的一个子系统,旨在为访问各类内存设备(如ROM、Flash等)提供统一的接口与...
"Linux MTD源代码分析"文档可能详细解释了这些概念,并通过实例展示了如何理解和调试MTD驱动。文档可能包括了代码片段、流程图和实际操作步骤,帮助读者理解源代码的逻辑。 www.pudn.com.txt文件可能是链接到更详细...
首先,我们需要了解MTD分区的基本概念: 1. **主分区(main partitions)**:这是MTD分区中最主要的部分,通常包括启动分区、系统分区等,用于存储操作系统、应用程序和相关数据。 2. **启动分区(boot partition)*...
提供的MATLAB程序文件"mtd_mtd_解速度模糊"很可能包含了实现上述概念的代码示例,可能涵盖了目标检测的模型训练、速度模糊的图像恢复算法以及MTI相关的信号处理技术。对于深入理解和应用这些技术,直接研究这些...
书中可能讲解了设备驱动的基本概念、驱动模型、内核调用接口,以及如何调试和测试驱动程序。对于MTD部分,读者可能会学到如何编写和维护MTD驱动,以及如何处理闪存特有的问题,比如坏块管理、磨损平衡算法等。 ...
在深入解析mtd-utils-1.4.8源代码之前,我们需要了解一些基本概念。MTD主要处理各种类型的非易失性存储,包括NOR和NAND闪存,EEPROM,智能卡等。与传统的块设备(例如硬盘)不同,MTD设备通常不支持随机读写,而是以...