查看: 1600|回复: 2
|
【分享】 本人刚学习关于FAT16 运作拿来分享给大家。
[复制链接]
|
|
什么是FAT?file Allocation Table 其实我对于这个FAT好奇很久,从中学就在书本里看到,看来看去都不明白。。直到最近心血来潮,又在重新读一次,拿以前买的SD卡 64MB来看看里面的sector是真么写的终于给我看明白了。
FAT是什么,其实FAT在MS-DOS或Microsoft系统里用来管理档案的系统。为什么我兴趣学FAT?当然我可以自己设计我的档案管理系统,不过在电脑windows里,我就不能直接把档案储存起来。在软碟也好硬碟也好光驱也好,SD卡也好,不管是什么track,head,都可以当作一个由很多sector组成的。每一个sector都是固定512Byte的。
当电脑开机是,电脑会把sector0 读入进 RAM里的地址 7c00,然后 JMP进那个7c00 执行7c00的程式。然后 那个小程式就会驱动硬碟读其他sector,一直到所有的程式都在RAM里在驱动WINDOWS。Sector 0 除了有那个驱动小程式以外还有记录关于硬碟或SD卡的FAT的规格。
在早起FAT有 FAT 8, FAT12, FAT16 , 在windows里这些都归类为 FAT 。除了FAT32 是比较新的规格以外还有NTFS。据我所知FAT16只能支持 到2GB 也就是一个cluster有 64个sector。我在这里也只解释关于FAT16.
FAT16 意思也是 16bits的 最大也只能记录 65536 段(cluster) , 当SD卡容量32MB以下 ,每一个sector 就是一个cluster,当 SD卡容量大于32MB 就由好几个 Sector组成 一个cluster。
比如
cluster x 最大 FAT (65536) = 最大卡容量
512Byte x 65536 = 33554432Byte。 32MB卡。
如果 64MB 卡
1024byte x 65536 = 67108864byte 64MB卡。
在 64MB卡 ,每一个cluster是由两个sector组成的。不管档案是少于1个cluster容量,也就用去一个cluster,如果cluster容量越大,对于储蓄小容量档案就更加浪费了。
看看图一, 这个就是 FAT16的结构, Sector 0 是记录 Master Boot Record 也就是我刚才说的 Sector0. 然后 就是 FAT1 ,FAT2, Root directory , Cluster 或 free space。 FAT1 和 FAT2 其实是一样的,在软碟里由于软碟容易被破坏,所以增加多一个FAT来做后备。root directory 是由32Byte组成的是记载 档案的名字,时间,和这个档案是从那个cluster开始。然后最后的就是cluster或free space 用来记录档案的资料。
关于 详细的Master Boot Record 可以看看这个网页
http://www.tavi.co.uk/phobos/fat.html
我在这里只是抽出一些主要的。 在sector 0 里的512byte ,
地址
0x0d 是记录了一个cluster是几个sector组成的。
0x0e 是记录了有多少个reserve sector ,这个也包裹Master boot record 。
0x10 是记录了这个媒体有多少个FAT ,在sd卡一般是2 (两个FAT)
0x11 是记录 root directory里可以储存多少个root directory entries(不管是档案名字还是subdirectory)
0x16 是记录了 FAT里用去多少个sector。
以下 图二 图片是我的64MB卡在winhex里显示。在图里可以看到这个卡是FAT16格式,一个cluster有2个sector,一共有4个reserve sector , 有两个FAT,root directory 有 512 entries, 一个FAT用了242 个sector。
当我们有了以上的资料就可以知道,FAT1,FAT2,和root directory 的位置在那一个sector, 在看会图一,Reserve sector 是在开始段, 也就是用了4个sector, FAT1 用了 242 sector, FAT2 也一样用了242 sector, 把这些加起来就是 root directory的位置了。
Rerverse sector + FAT1 + FAT2 = root directory位置
4 +242 + 242 = 488 sector.
请看图三, 这是当我把SD卡的sector 488 读出来的资料。 每一个entries 是用32byte组成的。32byte里也记录了档案还是sub directory,档案时间等。关于详细的资料请看 http://www.tavi.co.uk/phobos/fat.html
在 FAT系统里 是没有cluster 0 和 cluster 1的 所有的 cluster是开始在 2. 在第一个entries里也写这 text1.txt ,开始记录在cluster 2, text2.txt 开始记录在 cluster 3.
如何知道cluster2 在第几个sector? 其实看回 图一就明白了。只要在把,reserve sector + FAT1 + FAT2 + ( root enteris x 32 byte / 512byte) = cluster 2 / freespace
每一个root entries 是由32byte组成, 我的SD卡 是有 512个root entries 也就是 一共在root directory用了16384 byte ,每一个sector又是由512byte 组成的 ,16384/512 = 32 sector 用了 32sector。
4 + 242 + 242 + 32 = cluster 2 的开始地址在520sector 。
在图四 是我用winhex 读进 520sector 的资料。 可以看到 ABC 这个是我预先在 text1 里写的字用了3byte。
text2.txt 是存放在 cluster2 里, 也就是 sector 520 + 2sector(每个cluster是2sector组成上面有介绍过了) = 522
图 五就是我读522 sector的资料。 在 text2.text我存放的档案是3Kbyte左右,可是每一个cluster只有1024byte,接下来的2Kbyte去了那里?
我们在看回FAT1 , 也就是 Reserve sector 4 之后。 请看图六。 这个就是 在sector 4, FAT1 的资料。我们可以看到,我标着cluster 0,1,2,3..7 这个就是代表,每2个byte代表每一个cluster下一个去那一个cluster读。当显示 FFF8 或 FFFF 是代表 end of the file,cluster 0,1是不存在的既然就是FFF8,FFFF 。 cluster 2 也是 FFFF,为什么呢? 记得我的TEXT1.txt 只有3byte,一个cluster已经足够存放了自然就没有必要在有另一个cluster储存。 text2.txt开始在 cluster 3, text2.txt 大约是3kbyte,也就是需要用3个cluster来储存。 所以在cluster 3 位置 就写着 cluster 4, 在cluster 4位置就写这cluster5, 在cluster 5位置写着FFFF,就是档案终止在这里。
为什么需要这样记录呢?试试想一下,如果我们第一个档案用了cluster2, 第2个用了cluster 3,4,5 。 后来我们又删除了档案1 cluster2 。 然后当我们放入新档案需要3个cluster时,系统可以 用cluster2,然后接下来6,7 。 为了储存删除的方便。
不好意思我解释的不是很好,请谅解。 也希望大家对于FAT16 可以有了一定的了解,至于要如何 从SD卡读sector就要看SD卡的指令了。 我还在研究着,虽然网上有一些写好的c语言lib,不过我想试试用assembly 从新写。。 FAT不限于用在SD卡,也可以用在软碟floppy,硬碟harddisk,光驱cd-rom等。只要明白那些指令能读出Sector,就可以用。 我这里写的资料是不齐全的。关于更多 Master boot record, root directory entries ,等 大家可以在网上找吧。。
本帖最后由 sougisyou 于 15-5-2013 12:48 AM 编辑
|
评分
-
查看全部评分
|
|
|
|
|
|
|
楼主 |
发表于 15-5-2013 01:06 AM
|
显示全部楼层
在图三, 我圈的后面有写 03 00 00 00 其实是等于 3byte 的意思。 另一个是 5B 0B 00 00 是等于 00000B5B = 2907byte的意思。。 |
|
|
|
|
|
|
|
楼主 |
发表于 20-5-2013 11:14 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|