sd卡与FAT32文件系统
2012-09-06 10:52 至上 阅读(9296) 评论(3) 编辑 收藏 举报先把sd卡格式化,然后新建几个文件放在里面,用于分析,sd卡中文件的存储方式。
使用工具winhex,打开磁盘sd卡。
先分析一下sd卡的第一个扇区,其中的内容为DBR(DOS BOOT RECORD c操作系统引导记录区)
DBR中BPB部分才是这一区域的核心部分,对于FAT32的实现意义很大。
每个红线部分是一个字段,要知道是什么意思,对照表看看就可以啦:
上面的长度是只占的字节数,现在就对照分析一下,
每个扇区字节数是00 02,属于小端存数,读得时候为0x02 00,也就是512字节。
没簇的扇区数是0x08,就是包含8个扇区,大小为4kB。
保留扇区数目为26 00,就是0x0026,保留38个扇区,你会看到fat表放在第38个扇区,前面的空间就只包含了DBR,没有跟文件有关的东西,都是与sd卡本身有关的信息。
fat表数,为02,就是2个,这是fat32文件系统的特色,2个中有一个是备份的。
磁道扇区数为3f 00 就是0x003f,63,一个磁道所含的扇区数为63
磁头数ff 00 就是0x00ff,255
sd卡所含的总扇区数为 00 a0 3a 00 就是0x003aa000 共有3842048个扇区
fat表扇区数为a1 0e 00 00,就是0x0ea1,3745个扇区
跟目录簇号为02 00 00 00,就是2号,其实就是实际存储位置是fat表后面的第一个簇,8个扇区。用于存储根目录。
下面还有一个信息不是很重要。
下面分析fat表:
fat表示从第38个扇区开始,然后占空间3745个扇区。为什么占这么大呢,首先fat表中每4个字节描述一个簇,一个簇中有8个扇区,sd卡可用扇区数是3834520。
(3834520/8)*4/512=3744.6484375,约为3745个扇区。可用扇区数是可以查啊。winhex中的详述技术报告:
接下来看看fat表中的内容吧:
fat表是用来表示一个文件占了多大空间的,都是以簇为单位。哪怕你的文件只有一个字节,也是占一个簇,4kB的空间。或许你会觉得很浪费,不过想想,分得越细,越难查找,所以需要折中。我在sd卡中新建一个文件夹是SEUIC,SEUIC中新建VIM.txt(大小是10.02kB,占空间12KB,就是3个簇),根目录下还有一个文件TEST.txt(大小17个字节,占4KB)。那么fat表怎么表示的呢?
前8个字节表示这里是fat表的开始。后面的红线表示,每出现FF FF FF 0F都表示一个文件的结束,每四个字节为一个簇项,用以标记次簇的下一个簇号。依次解释下,首先sd卡中存储的是跟目录区,占一个簇,簇号是2。后面是一个文件夹目录文件(SEUIC),占一个簇,簇号3。后面是文件VIM.txt,占3个簇,这里就好玩了,第一个簇号是4,你看到的05,就是标记的下一个簇号,表示这两个簇共同记录了同一个文件,所以把他们链接起来。直至第6簇结束,表示文件共占3个簇。最后又是一个只占一个簇的文件(TEST.txt)。其实这里是看不出文件名的。这里只会记录文件在sd卡中的存储。然后在目录区中描述一个文件的时候,只要记录首簇号就可以了,很方便是不是。当你在一个文件中添加内容的时候,随便写在哪个簇,并不需要连续的,然后把簇号添加进上一个簇项里面,就完成任务了。
下面介绍目录区:
先计算目录区所在扇区,由fat表所在第一个扇区38,加上2个fat表所占扇区数就是3745*2(别忘了又一个备份的fat表)。结果是7528,winhex在详细技术报告中也说明这个扇区是第一个数据扇区。
要看懂每个字段的意思,还是要查表的:
一个目录项占32个字节,就是2行喽。可以看出SEUIC的属性是子目录,起始簇号是3,这里把目录当做文件管理,但是这样的文件大小是0;
对于SEUIC子目录下的文件这里是看不到的哦。TEST.txt文件属性是归档,就是文件,起始簇号是7,字节数为17.
那么再去找VIM.txt,首先定位SEUIC所在扇区,他的簇号是3,就是目录区所在扇区加8为7536。所以要找一个文件,是一层一层剥开来得。
好吧,现在去7536扇区看看:
可以看出,VIM.txt属性是归档,首簇号是4,大小为0x28da,10458字节。你可以右击文件属性看一下,肯定是对应的啊。
那么要看VIM中的内容直接去第4簇。我们去看一下TEST.txt文件吧,这个文件比较小,在第7簇,就是7538+4*8=7568.
内容就是this is a test!!!好吧就这么多了。
在linux文件系统中,所要建立的文件索引节点所需的数据就是来自上面的32字节的数据,他记录了文件的名字,属性,大小,地址等信息。
还有就是,文件是一层一层向下找得,那么系统启动挂载sd卡的时候只需要把跟目录区拷贝到内存中就可以了。那么查找的时候,打开一个子目录,就可以找到这个目录下的文件信息了。所以把目录当做文件看待是很有好处的。因为文件本身在哪儿并不重要。