FAT16 Structure Information

Master Boot Record

The Master Boot Record is the same for pretty much all Operating Systems.  It is located on the first Sector of the Hard Drive, at Cylinder 0, Head 0, Sector 1.  It is the first piece of code that your computer runs after it has checked all of your hardware (POST) and turned control of loading software over the hard drive.  It also contains the partition table, which defines the different sections of your hard drive.  Basically if anything happens to this little 512 byte section, your hard drive is brain dead.  Kinda scary, eh? :)

OffsetDescriptionSize
000hExecutable Code (Boots Computer)446 Bytes
1BEh1st Partition Entry (See Next Table)16 Bytes
1CEh2nd Partition Entry16 Bytes
1DEh3rd Partition Entry16 Bytes
1EEh4th Partition Entry16 Bytes
1FEhExecutable Marker (55h AAh)2 Bytes


Partition Entry (Part of MBR)

OffsetDescriptionSize
00hCurrent State of Partition (00h=Inactive, 80h=Active)1 Byte
01hBeginning of Partition - Head1 Byte
02h Beginning of Partition - Cylinder/Sector (See Below)1 Word
04hType of Partition (See List Below)1 Byte
05hEnd of Partition - Head1 Byte
06hEnd of Partition - Cylinder/Sector1 Word
08hNumber of Sectors Between the MBR and the First Sector in the Partition1 Double Word
0ChNumber of Sectors in the Partition1 Double Word


Cylinder/Sector Encoding

I guess back in the days of 10MB hard drives and 8086's, code was at a premium.   So they did everything they could to preserve space.  Unfortunately now we have to live with it, but luckily they created new ways of translating the system so the 1024 Cylinder Limit (2^10) isn't too big of a problem, for newer computers, at least.   Older ones usually need some sort of Disk Overlay program to make them see the whole hard drive.  

Anyway, to get the Sector out of this, you need to apply an AND mask ($3F) to it.   To get the Cylinder, you take the high byte and OR it with the low byte that has been AND masked with ($C0) and then Shifted Left Two.  It's not very easy to explain, so I'll just show you how I did it with two routines I made (In Pascal) for Encoding and Decoding the Cylinder/Sector.  Hopefully even if you don't know Pascal you'll be able to read it.

Function CylSecEncode(Cylinder, Sector : Word) : Word;
Begin
    CylSecEncode := (Lo(Cylinder) shl 8) or (Hi(Cylinder) shl 6) or Sector;
End;

Procedure CylSecDecode(Var Cylinder, Sector : Word; CylSec : Word);
Begin
    Cylinder := Hi(CylSec) or ((Lo(CylSec) and $C0) shl 2);
    Sector := (CylSec and $3F);
End;

1514131211109876543210
Cylinder Bits 7 to 0Cylinder Bits 9+8Sector Bits 5 to 0


Partition Type Listing

There are more than just these shown, but I've only included that ones relevant to MS Operating Systems.

ValueDescription
00hUnknown or Nothing
01h12-bit FAT
04h16-bit FAT (Partition Smaller than 32MB)
05hExtended MS-DOS Partition
06h16-bit FAT (Partition Larger than 32MB)
0Bh32-bit FAT (Partition Up to 2048GB)
0ChSame as 0BH, but uses LBA1 13h Extensions
0EhSame as 06H, but uses LBA1 13h Extensions
0FhSame as 05H, but uses LBA1 13h Extensions


Reading Multiple Partitions

Since FAT16 is limited to 2GB per partition, drives that use it tend to have multiple partitions.  The first partition is the Primary Partition, and everything else is stored in the Extended Partition.  It's a little tricky when it comes to reading those extra partitions though (not a lot, just a little).  The first record in the partition table shows where the Primary partition is (how big it is, where it starts, and where it ends).  The second entry in the partition table shows where the Entire Extended Partition is (which may include more than just one partition).  To read any more partitions, you go to the where it says the Extended Partition starts, and read the first sector.  It acts just like the MBR.  It'll have blank where the code is supposed to be, and in the partition table it will have for it's first entry the next Partition in the Drive, and if there are anymore, there will be another Extended partition, just like before.  However, all references to Sector Numbers are made using the that new MBR point as the reference, making it a virtual drive.  Just incase this doesn't make much sense (and by the way I explain things I can understand if it doesn't), let me show you how a drive with three partitions is setup.

MBR of Whole Drive

    Entry #1 - Points to Partition #1
    Entry #2 - Points to the Entire Extended Partition

You would read the first sector of that Extended Partition, and see another MBR Structure.

MBR of Extended Partition

    Entry #1 - Points to Partition #2
    Entry #2 - Points to Rest of Extended Partition after Partition #2

Now, all references to Sector Numbers (most specifically the entry at Offset 08h) in those Entries wouldn't be referenced from the start of the drive, but from the start of the Extended Partition.  However, the CHS (Cylinder, Head, Sector) numbers would still be right.

Once again, you would read the first sector of that Extended Partition, and see the next MBR.

MBR of Rest of Extended Partition

    Entry #1 - Points to Partition #3
    No Entry #2, since this was the Last Partition

If there were another partition, the pattern would continue just like before, until the last one was reached.

 


FAT16 Boot Record

This information is located in the first sector of every partition.

OffsetDescriptionSize
00hJump Code + NOP3 Bytes
03hOEM Name8 Bytes
0BhBytes Per Sector1 Word
0DhSectors Per Cluster1 Byte
0EhReserved Sectors1 Word
10hNumber of Copies of FAT1 Byte
11hMaximum Root Directory Entries1 Word
13hNumber of Sectors in Partition Smaller than 32MB1 Word
15hMedia Descriptor (F8h for Hard Disks)1 Byte
16hSectors Per FAT1 Word
18hSectors Per Track1 Word
1AhNumber of Heads1 Word
1ChNumber of Hidden Sectors in Partition1 Double Word
20hNumber of Sectors in Partition1 Double Word
24hLogical Drive Number of Partition1 Word
26hExtended Signature (29h)1 Byte
27hSerial Number of Partition1 Double Word
2BhVolume Name of Partition11 Bytes
36hFAT Name (FAT16)8 Bytes
3EhExecutable Code448 Bytes
1FEhExecutable Marker (55h AAh)2 Bytes



FAT16 Drive Layout

OffsetDescription
Start of PartitionBoot Sector
Start + # of Reserved SectorsFat Tables
Start + # of Reserved + (# of Sectors Per FAT * 2)Root Directory Entry
Start + # of Reserved + (# of Sectors Per FAT * 2) + ((Maximum Root Directory Entries * 32) / Bytes per Sector) Data Area (Starts with Cluster #2)

 

Cluster Meaning (FAT Table Entries)

A Cluster is a Group of Sectors on the Hard Drive that have information in them.   A 16K Cluster has 32 Sectors in it (512*32=16384).  Each Cluster is given a spot in the FAT Table.  When you look at an Entry in the FAT, the number there tells you whether or not that cluster has data in it, and if so, if it is the end of the data or there is another cluster after it.  All Data on a Partition starts with Cluster #2 (Right after Root Directory).    If the FAT Entry is 0, then there is no data in that cluster.  If the FAT Entry is FFFFh, then it is the last entry in the chain. 

FAT Code RangeMeaning
0000hAvailable Cluster
0002h-FFEFhUsed, Next Cluster in File
FFF0h-FFF6hReserved Cluster
FFF7hBAD Cluster
FFF8h-FFFFUsed, Last Cluster in File

Directory Table

Another aspect when looking at a File System at Low Level is the Directory Table.   The Directory Table is what stores all of the File and Directory Entries.  Someone else has already written a good resource for this information on the net, so go here to look at it.  The link doesn't work anymore, but luckily I saved the page a while back, so i'll just post it on my site.

 

Footnotes

1 - LBA = Logical Block Addressing - Uses the Int 13h Extensions built into newer BIOS's to access data above the 8GB                    barrier, or to access strickly in LBA mode, instead of CHS (Cylinder, Head, Sector).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值