有了之前读写block的基础之后,准备弄个文件系统,之前没有接触过这东西,所以有很多都晕晕的,但是看到fat的源代码之后还是挺有信心的,因为之前一直过uboot,所以这个文件当然是小巫见大巫了。首先来分析一下对应我的SD的FAT16的相关信息吧(暂且就这么称吧,因为我也不是很了解)。 一、引导扇区段 拿比较简单的FAT16文件系统来分析,格式化为FAT16,然后使用Winhex软件打开我的磁盘驱动器。先贴上一张图 这上面可以发现很多有用的信息,首先我们了解一下基本知识,对于我的SD卡来说,从上面的信息可以看出: 1、一个扇区定为512字节。 2、启动扇区为0扇区,同时这也是物理扇区0,但是,从上面可以看出,我的SD卡是没有MBR(主引导记录区)的,所以这个物理扇区0也就是我的DBR(系统引导扇区),也就是所谓的逻辑扇区0吧(这是我个人的理解) 补充一下:如果有MBR的,那么MBR为访问的第一个扇区,该扇区必须负责找到DBR 3、那么下面来分析一下这个DBR吧。看下面一张表,就可以知道它的定义了。下面这张表实在网上找的,所以和我的SD卡描述的不一样,我把我的SD描述的情况补充在后面。 自然从这个表上面我们可以获取如下主要信息: 每扇区字节数:0x0200 = 512字节 每簇扇区数: 0x20 = 32扇区 保留扇区数: 1扇区 FAT表份数: 0x02 = 2份 根目录项数: 0x0200 = 512,所以做多能存放的文件或者文件夹数目 = 512. 每个FAT表所占的扇区:0x00f3 = 243个扇区 FAT表所在的分区前面隐藏的扇区数:0x00 = 0,再次验证了我之前的猜测。没有MBR的,只有DBR。 卡的容量(总的扇区数): 0x1e5c00 = 1989632 ,那么换算成M就是: 1989632 * 512B = 971.5M 卡的ID: 0x980b5f1f FilesysType :0x31544146就是FAT16的ASCII码。
可执行代码:从0x3c 开始的 347和字节都是可执行代码。 继续看表格。 DBR的偏移 0x5A开始的数据为引导代码。这是由偏移 0x00 开始的跳转指令所指向的。 所列出的偏移 0x00~0x02 的跳转指令"EB 3c 90"清楚地指明了引导代码的偏移位置。jump 3cH加上跳转指令所需的位移量,即开始于 0x3c。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。从头到尾梳理一遍,我们的FAT16文件系统框架就是这样: 引导扇区段
[csharp] view plain copy
print?
- 字节位移 字节长度 字段名称
- 0x00 3 跳转指令
- 0x03 8 OEM ID
- 0x0b 2 BPB
- 0x24 24 扩展BPB
- 0x3c 448 引导代码
- 0x1fe 4 扇区结束标识符
|