佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1600|回复: 2

【分享】 本人刚学习关于FAT16 运作拿来分享给大家。

[复制链接]
发表于 15-5-2013 12:35 AM | 显示全部楼层 |阅读模式
什么是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 编辑

图 一

图 一

图 二

图 二

图 三

图 三

图 四

图 四

图 五

图 五

图 六

图 六

评分

参与人数 1积分 +50 收起 理由
pic + 50 原创内容

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 15-5-2013 01:06 AM | 显示全部楼层
在图三, 我圈的后面有写 03 00 00 00 其实是等于 3byte 的意思。 另一个是 5B 0B 00 00 是等于 00000B5B = 2907byte的意思。。  
回复

使用道具 举报

 楼主| 发表于 20-5-2013 11:14 PM | 显示全部楼层
前几天做好的,SD 卡 直接读的视频演戏。

http://www.youtube.com/watch?v=7JtlyspCMn4

目前测试过16MB,64MB,1GB卡可以读没有问题。 程式用去大约1.2KB。RAM用到七七八八了 大约60-80byte没有去算。 里面可能存有一些bug。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 26-4-2024 10:33 AM , Processed in 0.081459 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表