Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1592169
  • 博文数量: 354
  • 博客积分: 8137
  • 博客等级: 中将
  • 技术积分: 5137
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 15:40
文章分类

全部博文(354)

文章存档

2010年(300)

2009年(54)

分类:

2010-07-21 06:47:43

发信人: 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,电子盘等存储介质上.
......
阅读(1566) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~