• SD卡文件系统设计(转)


    发信人: autoca (听姐一席话,胜读十年书.), 信区: Embedded
    标 题: SD卡文件系统设计(note)
    发信站: 郁金香BBS站 (2006年08月06日15:45:38 星期天), 站内信件

    Common Sense of SD FS Design
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    闪存功耗低,密度高,体积小,可靠性高,可擦除,可重写,容量大,便宜(how much?).

    以块为单位对SD卡进行管理. 屏蔽硬件操作细节,为应用开发者提供统一的API调用.

    文件系统分5层(由下往上): SD卡的底层驱动层, 磁盘高速缓存Cache层,逻辑盘,文件系
    统和应用层.

    1. SD 卡的底层驱动层
    ~~~~~~~~~~~~~~~~~~~~~~
    包括对SD 卡的初始化,读/写操作. 操作通过对SD 卡发送命令信号来实现. SD 卡标准
    定义了两种命令: Application – specific Command(ACMD)和General
    Command(GEN-CMD). 普通命令直接发送,所由ACMD命令在发送前必须先发CMD55作为标识.
    SD 卡接收命令后响应. 命令和响应都遵循一定格式(SD Memory Card Spec. Part2
    File System version 1.0.SD Group, 2000).

    MMC与SD卡 的插槽一样,具体实现稍有区别. SD 卡初始化流程如下:
    zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
    1) 配置SD 卡的控制寄存器中断寄存器

    2) 判断: 有卡插入?有,下一步; 无,等待.
    3) 判断: 发送命令ACMD41: 判断插入的卡是不是SD卡? 是,下一步;否,返回.
    4) 发送命令CMD2: 获取卡的CID(每个卡都有自己特有的CID号,由厂商定义;接
    收到CID后,卡进入认证状态)

    5) 发送命令CMD3: 分配卡的相对地址RCA(即为本系统对卡的访问提供一个临时的访
    问地址)

    6) 发送命令CMD16:设置数据块的大小
    7) 发送命令ACMD6: 设置数据总线宽度(可选,默认数据宽度为4位)
    zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

    SD 卡读写数据是以块为单位进行的.

    对卡读一个或多个块通过发送CMD17/CMD18命令来实现;
    对卡写一个或多个块通过发送CMD24/CMD25命令来实现.
    这些数据在末尾附有CRC校验码,如果校验码失败,则所传输的数据都会被丢掉,数据的读/
    写操作也会被中止.

    2.Cache层
    ~~~~~~~~~~~~~
    Cache原理: 使用较快的存储装置保留一份从较慢速存储装置中所读数据, 使读/写动作
    先在较快速的装置上完成,这样可以提升系统的响应速度. Cache越大,响应速度越快.

    决定处理器成本的最主要的因素就是处理器芯片的面积.

    缓存的主要结构如下:

    typedef struct _Disk_Cache {
    U8 Drive; //表示Cache数组中某个元素的存储状态
    U8 Flag; //表示某个元素可以被某种方式访问: 只读/只写/读||写
    U8 RW_ID; //计数器,表示元素有多久没被访问了
    U32 SecIndex; //记录被缓存的扇区的逻辑扇区索引
    U8 buf[DISK_CACHE_SIZE]; //存放被缓存的扇区的具体内容
    } Disk_cache;

    当有读/写的需求时, 从SD卡读取的数据copy一份放到Cache数组的空闲扇区中;
    如果系统继续要求读取/写入同一份数据或同一扇区时, 系统就可以直接从Cache中进行
    读/写, 从而大大提高系统存取速度.
    每次访问Cache时, Cache数组中所有元素的RW_ID值会被加1,直至最大值;
    当某个元素被访问时, 这个元素的RW_ID值被清零;
    当cache数组的所有元素都已分配又有新的扇区被访问时, 找出Cache模块中RW_ID值最大
    的元素分配给新的扇区作为缓存(需要回写的内容进行回写后再分配给新的扇区).

    需要注意的是: 这种技术如果仅用于读数据是没问题的. 但用于写数据, 即如果写入cac
    he的数据不能立即写回SD卡的物理内存中, 则一旦断电会丢失数据; 若每次都将数据回
    写到SD上, 则影响写速度.

    基于这种情况,将Cache写入的方式分为直写式和回写式.

    a) 直写式: 每次写入cache的同时, 把数据回写到SD卡物理内存中, 以保证cache的内容
    和SD卡物理内存中相应单元的数据保持一致.
    b) 回写式: 只把数据写入cache(这样有可能出现cache中数据得到更新但物理内存中
    数据陈旧的情况), 并在cache中通过设置Flag标明该缓冲区的数据是否需要回写; 等
    系统空闲或进行cache替换时,再将数据回写到SD卡上.

    3.逻辑盘管理
    ~~~~~~~~~~~~~~
    所谓逻辑盘指通过扇区映射吧SD卡物理存储数据的地址隐藏起来, 上层通过对逻辑扇区
    的操作实现对物理扇区的存取.
    这个模块存有逻辑盘的基本信息, 如文件系统类型, 每簇扇区数, 根目录,FAT表和数据
    区的开始扇区号, 以及占用的扇区个数等信息.

    4.文件系统层
    ~~~~~~~~~~~~~
    负责组织文件在SD卡上存放的具体位置, 采用链式存储. 它直接与应用程序接口, 实现
    文件的逻辑结构以及为用户提供打开,关闭,读,写等操作, 设置文件访问权限, 还实现目
    录的添加,删除, 和重排等操作. 该层内部结构如下图:

    zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
    PSN LSN
    (物理扇区号) (逻辑扇区号)
    1.分区区域: MBR(主引导记录)和分区表 0~38 ----

    2.规则区域:
    a)系统区域: 分区引导扇区 39 0
    FAT表1和FAT表2 40~63 1~24

    b)用户区域: 根目录区 64~95 25~56
    用户数据区 96~129791 57~129752

    zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

    SD卡的文件结构与硬盘结构相同(参考FAT文件系统原理及实现).
    1) MBR区装有用于启动系统的代码和有关文件系统的重要信息;
    在主引导扇区的末尾处含有分区表, 分区表用于标识每个分区开始和结束的表项, 最多
    可以有4个分区, 每个分区可以包含不同的文件系统.
    2) 分区引导扇区记录各个分区启动的引导程序.
    3) FAT表记录SD存储卡以簇为单位进行记录的存储空间的信息,簇的大小根据实际系统的电
    子盘特性设定.
    4) 根目录区记录文件名和目录名.
    5) 用户数据区用于存放用户数据及子目录.

    5.应用程序层
    ~~~~~~~~~~~~~~
    直接使用文件系统层提供的接口API函数对文件和目录进行操作, 而不需要考虑所使用函
    数的细节问题以及底层硬件的相关问题.

    6. 小结
    ~~~~~~~~
    功能:
    兼容FAT12,FAT16,FAT32;
    只需对底层驱动进行简单修改就可以移植到CF卡,Flash,电子盘等存储介质上.
    。。。

  • 相关阅读:
    vs利用正则表达式统计代码行数
    C/C++/MFC的include搜索顺序
    afxwin.h afx.h afxver.h afxv_w32.h windows.h包含顺序
    C/C++中内存块置0的三种方法:memset,ZeroMemory,SecurZeroMemory
    关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
    vs2008工程设置里添加宏
    使用共享网卡的NAT模式配置VMware中的CentOS的上网功能
    VMware10 安装centos6.7 设置NAT模式
    《大道至简》第7,8章读书笔记
    ie11浏览器和chrome浏览器对于bgsound和background的一些区别
  • 原文地址:https://www.cnblogs.com/yuanfang/p/1914891.html
Copyright © 2020-2023  润新知