• nor flash和nand flash闪存设备的概述


    大多数router都是没有硬盘的,它使用闪存来完成相应的存储功能(包括存储固件以及系统数据),这种非易失性的闪存可以避免掉电丢失的问题。

    我们常接触的闪存主要有两种:NOR flashNAND flash

    如果闪存芯片和SOC直接连接并且又linux直接寻址,我们将它称作raw flash;
    如果在SOC和flash芯片间有多加一个外部控制芯片,我们称它作“FTL (Flash Translation Layer) flash”。


    嵌入式系统中的Flash芯片并不需要单独的控制芯片,因此不是 “FTL”-设备 而是 “raw flash”-设备。
    存储空间是通过操作MTD设备 MTD (Memory Technology Device)加上特定的文件系统filesystems来完成的。

    一般nor flash有4/8/16/32M,相对nand flash来说存储量较小,价格更贵,但是它的优点是不会坏块,
    nand flash一般都是32~256M或者更大,但是它容易坏块

    嵌入式设备中 这由内核 Linux Kernel 来完成,有时候会单独由bootloader来完成存储分区的布局;
    你只需要定义, “kernel分区 由偏移量x起 至偏移量y止”。
    这样做的优点是, 我们之后能直接通过 分区名来定位某个分区,而不用指定数据的精确起始点。

    如果使用的是raw flash,openwrt将会将这个寻址空间看作MTD
    openwrt将会将这个寻址空间看作MTD,我们可以通过在bootload或者kernel中对这块存储空间进行分区的划分,
    我们通常描述为"partitionkernel starts at offsetx and ends at offsety". 一般我们都会对每个分区进行命名,方便更好的操作。

    nand flash的特性:

    操作最小单元为页(Page)/块(Block)。nand flash不同于nor flash,nor可以以字节为单位操作flash
    但是nand的最小读写单元是页,擦除最小单元是块


    擦除寿命限制:nand flash的物理性质决定了其每个块都有擦除寿命的限制,因此驱动必须做到磨损平衡。
    位翻转(bit-filps):nand物理性质使其可能会在使用、保存过程中出现位翻转现象。 所以要不在nand flash的内部,要不在nand flash控制器都会存在ecc校正模块,在位翻转后校正。
    存在坏块(Bad Block):制作工艺和nand本身的物理性质导致在出厂和正常使用过程中都会产生坏块。

     

    nor flash和nand flash区别:https://www.cnblogs.com/iriczhao/p/12128451.html


    闪存设备的特性
    闪存的最小寻址单位是字节(byte),而不是磁盘上的扇区(sector)

    这意味着我们可以从一块闪存的任意偏移(offset)读数据,但并不表明对闪存写操作也是以字节为单位进行的。


    当一块闪存处在干净的状态时(被擦写过,但是还没有写操作发生),在这块flash上的每一位(bit)都是逻辑1
    闪存上的每一位(bit)可以被写操作置成逻辑0


    可是把逻辑 0 置成逻辑 1 却不能按位(bit)来操作,而只能按擦写块(erase block)为单位进行擦写操作
    擦写块的大小从 4K 到128K 不等。从上层来看,擦写所完成的功能就是把擦写块内的每一位都重设置(reset)成逻辑 1。


    闪存的使用寿命是有限的。
    具体来说,闪存的使用寿命是由擦写块的最大可擦写次数来决定的。
    超过了最大可擦写次数,这个擦写块就成为坏块(bad block)了。


    因此为了避免某个擦写块被过度擦写,以至于它先于其他的擦写块达到最大可擦写次数,
    我们应该在尽量小的影响性能的前提下,使擦写操作均匀的分布在每个擦写块上。这个过程叫做磨损平衡(wear leveling)


    闪存转换层
    将磁盘文件系统(ext2, FAT)运行在闪存上的很自然的方法就是在文件系统和闪存之间提供一个闪存转换层(Flash Translation Layer),
    它的功能就是将底层的闪存模拟成一个具有 512字节扇区大小的标准块设备(block device)。
    对于文件系统来说,就像工作在一个普通的块设备上一样,没有任何的差别。

    知行合一
  • 相关阅读:
    Sql 字符串按指定字符转多行(表值函数)
    C# 默认打印机设置
    Sql server 触发器状态查询
    指定周转对应日期
    Java发送HttpRequest
    Java实现手机号码归属地判别
    MySQL导入.sql文件及常用命令
    解释和编译的区别
    Java中的static关键字解析
    内存堆和栈的区别
  • 原文地址:https://www.cnblogs.com/grooovvve/p/14598645.html
Copyright © 2020-2023  润新知