sector:硬件(磁盘)上的最小的操作单位,是操作系统和块设备(硬件、磁盘)之间传送数据的单位
block由一个或多个sector组成,是软件(OS、文件系统)中最小的操作单位;操作系统的虚拟文件系统从硬件设备上读取一个block,实际为从硬件设备读取一个或多个sector.对于文件管理来说,每个文件对应的多个block可能是不连续的;block最终要映射到sector上,所以block的大小一般是sector的整数倍。不同的文件系统block可使用不同的大小,操作系统会在内存中开辟内存,存放block到所谓的block buffer中。
=======================================================================
扇区组成物理块,物理块对应逻辑块,逻辑块与文件相对应。
扇区是硬件被操作时软件使用的最小的操作单元,就是一个扇区一个扇区进行操作(扇区的大小在存储设备生产时就设计好)。
块是上层软件中(操作文件时)使用的最小的操作单元,就是(操作文件时)一个块一个块进行操作(块的大小格式化时可以设置【如linux、fatfs等等】)。
如fatfs的格式化函数(即在存储设备上建立文件系统)
创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fsck扫描的速度和文件删除以及读操作的速度。另外,在ext2的文件系统中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"将它改为1%并以块大小4096byte创建文件系统。
使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte空间。如果使用 1024byte 的块大小,平均每一个文件会浪费927byte空间。在性能和磁盘的代价上如何平衡,要看具体应用的需要。
第1组命令:
mkfs.ext3 -T news /dev/sda5 (指定该分区文件系统的块大小为4096)
mkfs.ext3 -b 4096 /dev/sda5
norflash有地址线与数据线,可以通过芯片对应的手册查到该norflash的扇区的大小。
nandflash使用复用的接口线,它内部有一个页寄存器(一个页:大小一般为512字节),nandflash内部存储管理使用的块大小是多少个页。它的扇区一般为一个页的一半大小。
=======================================================================
winhex的使用:
打开对应磁盘
如上图所示,为打开一个磁盘后的数据,这时的偏移地址是相对磁盘的存储起始地址而言,上图所示,磁盘有一个分区(FAT16),还使用了一个扇区。
在通过KEIL4读SD卡时,给一个偏移地址0x11400,读取到的数据就是这个根目录下的偏移地址。如果点击打开Partion 1,那么这是显示的offset就是相对Partion 1的偏移地址。
=======================================================================
我们把Ext2、Minix、Ext等实际可使用的文件系统称为具体文件系统。具体文件系统管理的是一个逻辑空间,这个逻辑空间就象一个大的数组,数组的每个元素就是文件系统操作的基本单位——逻辑块,逻辑块是从0开始编号的,而且,逻辑块是连续的。与逻辑块相对的是物理块,物理块是数据在磁盘上的存取单位,也就是每进行一次I/O操作,最小传输的数据大小。我们知道数据是存储在磁盘的扇区中的,那么扇区是不是物理块呢?或者物理块是多大呢?这涉及到文件系统效率的问题。
如果物理块定的比较大,比如一个柱面大小,这时,即使是1个字节的文件都要占用整个一个柱面,假设Linux环境下文件的平均大小为1K,那么分配32K的柱面将浪费97%的磁盘空间,也就是说,大的存取单位将带来严重的磁盘空间浪费。另一方面,如果物理块过小,则意味着对一个文件的操作将进行更多次的寻道延迟和旋转延迟,因而读取由小的物理块组成的文件将非常缓慢!可见,时间效率和空间效率在本质上是相互冲突的。
因此,最优的方法是计算出Linux环境下文件的平均大小,然后将物理块大小定为最接近扇区的整数倍大小。在Ext2中,物理块的大小是可变化的,这取决于你在创建文件系统时的选择,之所以不限制大小,也正体现了Ext2的灵活性和可扩充性,一是因为要适应近年来文件的平均长度缓慢增长的趋势,二是为了适应不同的需要。比如,如果一个文件系统主要用于BBS服务,考虑到BBS上的文章通常很短小,所以,物理块选的小一点是恰当的。通常,Ext2的物理块占一个或几个连续的扇区,显然,物理块的数目是由磁盘容量等硬件因素决定的。逻辑块与物理块的关系类似于虚拟内存中的页与物理内存中的页面的关系。
具体文件系统所操作的基本单位是逻辑块,只在需要进行I/O操作时才进行逻辑块到物理块的映射,这显然避免了大量的I/O操作,因而文件系统能够变得高效。逻辑块作为一个抽象的概念,它必然要映射到具体的物理块上去,因此,逻辑块的大小必须是物理块大小的整数倍,一般说来,两者是一样大的。
通常,一个文件占用的多个物理块在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可供使用。因此,必须提供一种方法将一个文件占用的多个逻辑块映射到对应的非连续存储的物理块上去,Ext2等类文件系统是用索引节点解决这个问题的,具体实现方法后面再予以介绍。
为了更好的说明逻辑块和物理块的关系,我们来看一个例子。
假设用户要对一个已有文件进行写操作,用户进程必须先打开这个文件,file结构记录了该文件的当前位置。然后用户把一个指向用户内存区的指针和请求写的字节数传送给系统,请求写操作,这时系统要进行两次映射。
(1)一组字节到逻辑块的映射。
这个映射过程就是找到起始字节到结束字节所占用的所有逻辑块号。这是因为在逻辑空间,文件传输的基本单位是逻辑块而不是字节。
(2)逻辑块到物理块的映射。
这个过程必须要用到索引节点结构,该结构中有一个物理块指针数组,以逻辑块号为索引,通过这些指针找到磁盘上的物理块,具体实现将在介绍Ext2索引节点时再进行介绍。
图9.1是由一组请求的字节到物理块的映射过程示意图。
有了逻辑块和物理块的概念,我们也就知道通常所说的数据块是指逻辑块,以下没有特别说明,块或数据块指的是逻辑块。
在Ext2中,还有一个重要的概念:片(fragment),它的作用是什么?
每个文件必然占用整数个逻辑块,除非每个文件大小都恰好是逻辑块的整数倍,否则最后一个逻辑块必然有空间未被使用,实际上,每个文件的最后一个逻辑块平均要浪费一半的空间,显然最终浪费的还是物理块。在一个有很多文件的系统中,这种浪费是很大的。Ext2使用片来解决这个问题。
片也是一个逻辑空间中的概念,其大小在1K至4K之间,但片的大小总是不大于逻辑块。假设逻辑块大小为4K,片大小为1K,物理块大小也是1K,当你要创建一个3K大小的文件时,实际上分配给你了3个片,而不会给你一个逻辑块,当文件大小增加到4K时,文件系统则分配一个逻辑块给你,而原来的四个片被清空。如果文件又增加到5K时,则占用1个逻辑块和1个片。上述三种情况下,所占用的物理块分别是3个、4个、5个,如果不采用片,则要用到4个、4个、8个物理块,可见,使用片,减少了磁盘空间的浪费。当然,在物理块和逻辑块大小一样时,片就没有意义了。
由上面分析也可看出:
物理块大小<=片大小<=逻辑块大小
=========================================================================
NANDFLASH是FLASH存储器的一种,与NOR FLASH相比,NANDFLASH具有更高的存储密度,单片FLASH的存储容量大大增加,也使得NANDFLASH的价格远远低于NOR FLASH。NANDFLASH采用命令方式实现读写和擦除,只需要8或16根数据线及相关的控制线,而且目前相同类型的NANDFLASH芯片都做到了管脚兼容,使得NANDFLASH在不变更电路板的条件下更容易增加或减少容量。另外NANDFLASH还具有读写速度快的特点。NANDFLASH具有以上特点,才使得它得到了广泛的应用。
NANDFLASH存储按页(page)的方式,根据页的大小不同,NANDFALSH可分为大页(每页2048+64字节)和小页(每页512+16字节)两种。目前使用最多最广泛的为大页的FLASH,本文档中如不做特殊说明,则指的是大页的NANDFLASH。
NANDFLASH有2048个块(块为擦除的最小单位),每个块包含64个页,每页有2048+64个字节。数据地址分为行地址和列地址两种,行地址(Row)为页地址,即页的偏移量;列地址(Column)为页内地址,即每个字节的页内偏移量。页内的前2048字节一般用于数据存储,通常被程为data区;后64字节一般用于存储校验数据和文件系统的参数信息,这后64字节通常被称为spare区,而这些字节常被称为冗余字节。NANDFLASH里通常集成了ECC发生器,用于产生ECC校验码。ECC在写操作时产生,写入spare区,读操作时将spare区内的ECC与读数据时产生的ECC比对,来决定读出的数据是否正确。另外ECC还具有纠错能力,根据ECC字节的长度不同,纠错位数也有所不同。一般4字节的ECC,可以纠1个BIT的错误;7字节的ECC,可以纠2—3个BIT的错误。由于NANDFLASH的制造工艺决定了NANDFLASH的所有存储单元不可能都是好的,对于那些坏的存储单元所在的块,需要在spare区里标记为坏块;在进行写操作时,程序要对这些坏块进行判断以避开这些块。
对于三星平台,直接使用NANDFLASH作为手机内的存储器,一个分了7个区(bootloader、nk、systemdata、Userdata、DBData、DBBack、RegData),其中bootloader、nk分区无文件系统,存放的是bootloader和nk程序;其他分区均有文件系统,供wince启动之后是用。对于TI和FREECALE平台,使用mdoc作为手机内的存储器。
FMD层提供的接口有:
FMD_Deinit:驱动卸载时调用,主要用于关闭初始化函数里打开的句柄;
FMD_Init:驱动加载时调用,为设备初始化函数;
FMD_GetInfo:获得该分区的基本信息;
FMD_GetBlockStatus:获得指定块的状态信息;
FMD_OEMIoControl:提供给OEM厂家直接调用的接口;
FMD_PowerUp:驱动唤醒时调用的接口;
FMD_PowerDown:驱动进入待机状态时调用的接口;
FMD_ReadSector:按扇区读取NANDFLASH里的数据;
FMD_WriteSector:按扇区向NANDFLASH里写入数据;
FMD_SetBlockStatus:设定指定块的状态;
FMD_EraseBlock:擦除指定的块;
=========================================================================
在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备。然而近年来Flash 全面代替了ROM(EPROM)在嵌入式系统中的地位。因为相较ROM而言,Flash有成本低,容易改写等优点。
目前Flash主要有两种 NOR Flash 和 NADN Flash 它们在应用上有所不同因此也用于不同的场合。
读取NOR Flash和读取我们常见的SDRAM是一样的。它的所有地址都是可见的,你可以读取它任意随机地址的值。同时它和SDRAM一样你可以直接运行装载在NOR FLASH里面的代码,这就是作谓的XIP(Execute-In-Place)技术。因为NOR Flash有这种特性,所以它非常适用于小型嵌入式系统。你可以把你的代码装载到Flash中,在系统启动的时候直接运行它,而减少SRAM的容量从而节约了成本。
从这种意义上来说,NOR FLASH已经可以代替原先我们一直使用的标准的ROM。并且还具有ROM所没有的特性。
目前市面上的FLASH 主要来自Intel,AMD,Fujitsu,和Toshiba。常用的容量一般在128K到64M之间。
NAND Flash 没有采取内存的随机读取技术。它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节。采用这种技术的Flash比较廉价。但是和所有块设备一样,NAND Flash 比较容易出现坏位。这需要我们采用软件来避免使用这些位。这样以来就增加了软件的复杂度。你不能直接运行NAND Flash上的代码。因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还加上了一块小的NOR Flash来运行启动代码。这样做会增加系统的复杂度。不过最近这种现象有所改观。三星最近生产的一批采用ARM Core的CPU,采用了一个内部的缓冲来存放NAND Flash里读取的东西。以此来直接运行NAND FLASH里面启动代码。比如基于Arm920T和新的S3c2410芯片。
另外,我们最常见的NAND FLASH的应用是嵌入式系统采用的DOC(Disk On Chip)和我们通常用的“闪盘”。
目前生产NAND Flash的主要厂家有Samsung 和Toshiba。最大容量已经突破了1G位。写Flash和写SRAM截然不同。它是通过一系列指令才能完成一个写操作的。而我们用的RAM直接写入即可。无论是NOR Flash 还是NAND Flash都有一个“扇区”的概念。这个“扇区”从8K到256K不等。在写操作中它将作为一个整体来操作。要向某个地址里面写如一个值得先看一下这个地址原先的值是不是全为“1“。如果全为“1”,那么通过一系列指令可以将这个值写入。反之,则先要进行擦除使其全部变为“1”。擦除操作是不能用一个地址来操作的。擦除必须一次擦除一个“扇区“。把这个“扇区”所有的值都变为“1”,然后才能进行写操作。
不同型号的Flash的操作指令不同。具体操作的时候需要仔细阅读所使用产品的产品说明书。
=========================================================================
NandFlash系列之一:NorFlash与NandFlash对比
作者:刘洪涛,华清远见嵌入式学院高级讲师。
FLASH存储器又称闪存,主要有两种:NorFlash和NandFlash,下面我们从多个角度来对比介绍一下。在实际开发中,设计者可以根据产品需求来进行闪存的合理选择。
1、接口对比
NorFlash带有通用的SRAM接口,可以轻松地挂接在CPU的地址、数据总线上,对CPU的接口要求低。NorFlash的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。如uboot中的ro段可以直接在NorFlash上运行,只需要把rw和zi段拷贝到RAM中运行即可。
NandFlash器件使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制、地址和数据信息。由于时序较为复杂,所以一般CPU最好集成NAND控制器。另外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。如果CPU不具备这种特殊功能,用户不能直接运行NandFlash上的代码,那可以采取其他方式,比如好多使用NandFlash的开发板除了使用NandFlash以外,还用上了一块小的NorFlash来运行启动代码。
2、容量和成本对比
相比起NandFlash来说,NorFlash的容量要小,一般在1~16MByte左右,一些新工艺采用了芯片叠加技术可以把NorFlash的容量做得大一些。在价格方面,NorFlash相比NandFlash来说较高,如目前市场上一片4Mbyte的AM29lv320 NorFlash零售价在20元左右,而一片128MByte的k9f1g08 NandFlash零售价在30元左右。
NandFlash生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,这样也就相应地降低了价格。
3、可靠性性对比
NAND器件中的坏块是随机分布的,以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。而坏块问题在NorFlash上是不存在的。
在Flash的位翻转(一个bit位发生翻转)现象上,NAND的出现几率要比NorFlash大得多。这个问题在Flash存储关键文件时是致命的,所以在使用NandFlash时建议同时使用EDC/ECC等校验算法。
4、寿命对比
在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。闪存的使用寿命同时和文件系统的机制也有关,要求文件系统具有损耗平衡功能。
5、升级对比
NorFlash的升级较为麻烦,因为不同容量的NorFlash的地址线需求不一样,所以在更换不同容量的NorFlash芯片时不方便。通常我们会通过在电路板的地址线上做一些跳接电阻来解决这样的问题,针对不同容量的NorFlash。
而不同容量的NandFlash的接口是固定的,所以升级简单。
6、读写性能对比
写操作:任何flash器件的写入操作都只能在空或已擦除的单元内进行。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为1。擦除NOR器件时是以64~128KB的块进行的,执行一个擦除/写入操作的时间约为5s。擦除NAND器件是以8~32KB的块进行的,执行一个擦除/写入操作最多只需要4ms。
读操作:NOR的读速度比NAND稍快一些。
7、文件系统比较
Linux系统中采用MTD来管理不同类型的Flash芯片,包括NandFlash和NorFlash。支持在Flash上运行的常用文件系统有cramfs、jffs、jffs2、yaffs、yaffs2等。cramfs文件系统是只读文件系统。如果想在Flash上实现读写操作,通常在NorFlash上我们会选取jffs及jffs2文件系统,在NandFlash上选用yaffs或yaffs2文件系统。Yaffs2文件系统支持大页(大于512字节/页)的NandFlash存储器。
参考文章:《NAND和NORFLASH技术设计师在使用闪存时需要慎重选择》M-Systems公司 Arie TAL
=====================================================================================
以镁光MT29F4G08BxB Nand Flash为例,这款Flash(如上图)以4个扇区(sector)组成1个页(page),64个页(page)组成1个块(block),4096个块(block)构成整个Flash存储器;由于每个扇区的容量是512 字节(bytes),整个Flash容量为4224M Bit(相当于528M字节),去掉备用区域用于存放ECC数据校验16M(虚线部分),就是这个片子的容量512M字节。其他型号的Flash也是同样由扇区组成页、由页组成块、块组成整个存储设备,只是扇区、页、块的数量多少有区别而已。
在Flash的生产制造过程中,由于生产工艺的缺陷,很容易在Flash中产生不能使用的坏区域,如果在U盘中要使用这样的Flash,就必须使用所谓的“量产工具”;U盘量产工具其实就是一种集坏区域扫描和Flash管理系统装载于一身的工具。常规U盘主控的扫描是以块为单位,扫描即往每一个块里写入数据,然后将读出的数据与写入的数据比较,如果数据有误则把该块标为“坏块”。扫描完成后就是将Flash管理系统装载到Flash里面,Flash管理系统就会利用扫描产生的坏块表对整个Flash进行读写管理,这样就完成了整个量产动作,U盘也就可以正常使用了。所以U盘显示的容量与实际所用的Flash容量差异来源于不能存储信息的坏块和Flash管理系统的占用块。坏块越多,做出的U盘容量越低;而Flash管理系统占用的块是没有办法避免,就像我们的电脑安装操作系统要占用硬盘空间一样。
当然这里还涉及到一个ECC纠错能力的问题,假设对这个Flash进行扫描的定义的ECC纠错能力为1bit,只有数据出现超过1bit错误的块才会被标记为坏块。这个时候需要区分块纠错和扇区纠错的差别,假设任何一个块里有任何一个扇区(512bytes)存在超出1bit的错误,常规主控在扫描的时候就会判断整个块为坏区域,这样将损失整个块128Kbytes的容量;但是当使用扇区纠错的主控时,同样1bit ECC纠错,他会直接去判断这个块里哪些是超出1bit错误的扇区,从而将其剔除,损失的只是每个真正有错误扇区的512bytes容量,从而保留了其余没有错误的扇区,这样Flash的利用率可以得到极大的提高。