[PR]当たる!無料占いで仕事鑑定:大人気!無料占い『スピリチュアルの館』

今まではファイルシステムを使いませんでした。
実際の OS ではファイルの管理を行う必要があります。
DOS(MS-DOS,DR-DOS,FreeDOSなど)では FAT と呼ばれるファイルシステムによりファイル管理を行います。
今回は、FAT の構造を説明します。

FAT では、最初に 管理テーブルをおき、その後に ファイル(やディレクトリ)のデータを記録します。
管理テーブルはデータ領域のファイルへの割り当てを管理します。
ディスクに記録されたデータは次の順に並んでいます。

データ内容
セクタ 0(512バイト)ドライブ情報
マスタブートローダです。
管理テーブル 1管理テーブルです。
管理テーブル 2管理テーブルのコピーです。
ルートディレクトリルートディレクトリデータの配列です。
データファイル、ディレクトリのデータ(クラスタの配列)です。

ドライブ情報は次の通りです。
FAT では、ディスクは論理セクタの配列として扱われます。

オフセットサイズ内容
00hbyte [3] 必ず jmp 命令です。
先頭命令が jmp でない場合は FAT として認識されません。
short jmp の場合、次の1バイトは必ず nop です。
03hbyte [8]OEM の名前です。
内容はチェックされません。
0Bh16-bit unsigned論理セクタのバイト数
0Dhbyte1クラスタの論理セクタ数
0Eh16-bit unsigned 管理テーブルの前にある論理セクタ数です。
通常は 1 です。
10hbyte管理テーブルの数です。
通常は 2 です。
11h16-bit unsigned ルートディレクトリのエントリ数です。
(論理セクタのバイト数 / 32)の倍数です。
13h16-bit unsigned 論理セクタ数です。
論理セクタ数が 65536 以上のときは 0 です。
15hbyte メディアの種類を表します。上位 4 ビットは 1111b です。
F0h:1.44MB以上のリムーバブルメディア(FD,MO etc.)
F8h:HDD,F9h-FFh:その他のFD
16h16-bit unsigned 管理テーブルの論理セクタ数です。
18h16-bit unsigned 1シリンダ、1ヘッドあたりのセクタ数です。
1Ah16-bit unsigned 1シリンダあたりのヘッド数です。
1Ch32-bit unsigned 隠れ論理セクタ数です。
HDD ではこのパーティションの前にある論理セクタ数です。
20h (DOS 4以降)32-bit unsigned オフセット 13h が 0 のときの論理セクタ数です。
24h (DOS 4以降)byte ドライブ番号のヒントです。
80hは最初のドライブ、00hはそれ以外を表すようです。
25h (DOS 4以降)byte 予約されています。0 です。
26h (DOS 4以降)byte DOS 4 以降を表す ID (29h)です。
オフセット 20h 〜 35h が正しいことを表します。
27h (DOS 4以降)32-bit unsigned ボリュームシリアル番号(ディスク固有のID)です。
ディスクが交換されたかを調べるために用意されています。
2Bh (DOS 4以降)byte [11]ボリュームラベルです。
36h (DOS 5以降)byte [8] ファイルシステムの名前です。
内容はチェックされません。
'FAT12 'や'FAT16 'と記録します。
3Ehサイズ可変起動コードです。
1FEhbyte [2]起動可能を表す ID です。55h,AAhを記録します。

クラスタはファイルデータを記録する単位です。
クラスタの大きさは論理セクタと同じこともありますが、 論理セクタの倍数のこともあります。
クラスタ番号は、データ領域のクラスタ数が4085(FF5h)以下の場合は 12ビット(FAT12)、4086以上の場合は 16ビット(FAT16)であらわします。
管理テーブルは各クラスタの次のクラスタ番号を記録した、 12ビットまたは16ビットデータの配列です。
クラスタ番号は 2 からはじまります。
第 0 クラスタ、第 1 クラスタは存在しません。
管理テーブルの先頭 3バイト(FAT12)または4バイト(FAT16)は予約されています。
先頭 1 バイトは ドライブ情報のオフセット15hのコピーで、 残りの予約バイトは FFh で埋められます。

内容
000h(FAT12)
0000h(FAT16)
空きクラスタです。
001h(FAT12)
0001h(FAT16)
この値は使われません。
002h〜FF6h(FAT12)
0002h〜FFF6h(FAT16)
クラスタ番号です。
FF7h(FAT12)
FFF7h(FAT16)
不良(スキップ)クラスタです。
このクラスタは使われません。
FF8h〜FFFh(FAT12)
FFF8h〜FFFFh(FAT16)
ファイル、ディレクトリの最終クラスタです。

管理テーブルは通常 2 つあります。
ファイルやディレクトリの書き込みにより 管理テーブルに書き込むときは、 すべての管理テーブルを更新する必要があります。

ディレクトリは ファイル1つにつき32バイトの構造体を記録した配列です。
ルートディレクトリ、サブディレクトリのいずれも構造体の内容は 同じです。
ルートディレクトリの大きさは固定されていますが、 サブディレクトリの大きさは可変です。

オフセットサイズ内容
0byte [8] ファイル名です。
未使用部分はスペースで埋めます。
先頭が 00h:それ以降は未使用
先頭が E5h:削除済み
先頭が 05h:先頭バイトはE5h(通常のファイル)
8byte [3]ファイルの拡張子です。
未使用部分はスペースで埋めます。
11byteファイルの属性です。
01h:read only,02h:hidden,04h:system
10h:directory,20h:archive
12byte [10]予約されています。
2216-bit unsigned時刻です。
ビット割り当て形式は hhhhhmmmmmmsssss です。
2416-bit unsigned日付です。
ビット割り当て形式は yyyyyyymmmmddddd です。
yearは1980年を0とした値です。
2616-bit unsigned開始クラスタ番号です。
2832-bit unsignedファイルサイズです。

ファイルを読み込む場合の流れは次のようになります。

  1. ファイル名の一致するディレクトリエントリを探します。
  2. ディレクトリエントリからファイルサイズ、開始クラスタ番号を読み込みます。
  3. 管理テーブルを参照して、後続のクラスタ番号を読み込みます。
  4. ファイルサイズを超えた分については読み捨てます。


2005-08-27: ChangeLog作成 (最終更新)
Copyright (C) 2005 hoverkid, all rights reserved.
[PR]子育てママさんへ:3年毎に15万円うけとれる保険?