破損メモリカードの復元(その2)

さていよいよバイナリエディタを使っての手作業に入る。

(2a)ブートセクタ、FAT領域の切り出し

ディスクイメージの最初の1セクタ(512バイト)分は、ブートセクタと呼ばれていて、論理ディスクに関する情報が入っている。ここが壊れていると少しだけ面倒になる。
今回はここが生きていたので少し楽ができる。


ブートセクタの構造

オフセット 内容 今回のデータ

00h〜02h

x86のジャンプ命令。

EB 3C 90

03h〜0Ah

OEMラベル名

"MSDOS5.0"

0Bh〜0Ch

論理セクタサイズ。普通は512バイト。

0200h

0Dh

セクタ/クラスタ

20h

0Eh〜0Fh

予約セクタ数

0001h

10h

FAT数

02h

11h〜12h

ルートディレクトリエントリ数。

0200h

13h〜14h

全セクタ数(65,536未満の場合)

0000h

15h

メディアディスクリプタ

F8h (固定ディスク

16h〜17h

FATサイズ(セクタ数)

007Dh

18h〜19h

セクタ/トラック数

003Fh

1Ah〜1Bh

ヘッド数

0010h

1Ch〜1Fh

隠しセクタ数

000000E5h

20h〜23h

全セクタ数(65,536以上の場合)

000F861Bh

24h

物理ドライブ番号

80h

25h

Reserved

00h

26h

ブートシグニチャ

29h

27h〜2Ah

ボリュームシリアルID

00000001h

2Bh〜35h

ボリュームラベル

"ZAURUS"

36h〜3Dh

ファイルシステムタイプ

"FAT16"

3Eh〜1FDh

ブートストラップコード


1FEh〜1FFh

BIOSブートシグニチャ

AA55h


最初の3バイトはx86のジャンプ命令だ。ブートストラップコードへのジャンプ命令が書かれている。MS-DOS時代からの名残だが、フロッピーからブートする場合、最初にブートセクタの先頭、ここに制御が移される。この3バイトは通常ブートストラップコードの先頭に相対ジャンプするコードが書かれている。([EB 3C]=JMP SHORT +3Ch、[90]=NOP)


32セクタ/クラスタなので、1クラスタ=32セクタ=16,384バイトとなる。


予約セクタ数はFATよりも前にあるセクタ数のことであり、つまりFATの開始セクタに等しい。今回は 0001h なのでブートセクタの直後からFATが始まることになる。


ルートディレクトリエントリ数からルートディレクトリのサイズが計算できる。
ルートディレクトリのサイズ=(1エントリのサイズ32バイト)×(エントリ数)
今回の場合はエントリ数 512個であるので、ルートディレクトリサイズ=16,384バイト=1クラスタ分に相当。


FAT領域のサイズは、7Dh=125セクタ=FA00hバイトである。FAT数は2(メイン+予備)なので、合計250セクタ、1F400hバイトがFAT領域となる。


全セクタ数は 000F861Bh=1,017,371セクタ。
バイト換算すると520,893,952バイト。


BIOSブートシグニチャはブートセクタの終わりを示すと同時に、ブートセクタが正常であることを示す目印。AA55hなら正常。



ここまでの情報から、ディスクイメージのレイアウトは以下のようになる。

セクタ オフセット 概要
0 00000000h
000001FFh
ブートセクタ
1〜125 00000200h
0000FBFFh
FAT領域1
126〜250 0000FC00h
0001F5FFh
FAT領域2
251〜282 0001F600h
000235FFh
ルートディレクト
283〜1017370 00023600h
1F0C35FFh
データ領域


FAT領域1、2についてもファイルを切り出しておく。今回はFAT領域をざっと眺めてみるとFATが明らかに破損している。どっかのファイルのデータらしきものが入っているようだ。とりあえずそのままにして該当サイズ分だけ切り出す。


FATファイルシステムにおけるクラスタ番号は初心者にはわかりにくいが、0から始まっていない。そもそもデータ領域の開始セクタは283であり、セクタ/クラスタ数で割り切れない。データ領域より前の領域についてはクラスタの概念では管理されておらず、セクタ単位での管理となっている。そしてデータ領域は、クラスタ番号2から唐突に始まることになっている。(0と1は存在しないことになっている)
したがって、セクタ283がクラスタ2の先頭であり、データ領域の先頭となる。


データ領域についてはクラスタ単位のデータ管理となる。
現在のままではクラスタ数で割り切れないファイルの分割構成になっているため、簡便のためいったんデータ領域の分割ファイルを1つの統合ファイルにまとめてから、もう一度4MB単位のファイルに分割しなおす。
こうすることでクラスタで割り切れるファイル分割構成になる。


(まだ続く)