新闻  |   论坛  |   博客  |   在线研讨会
SD卡文件系统设计(note)
mayer | 2009-09-06 13:46:32    阅读:5861   发布文章

SD卡文件系统设计(note)

SD卡文件系统设计(note)
 
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,电子盘等存储介质上.
......

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客