PC-98x1/disk/区画情報

PC-98x1/disk/区画情報

ネタ元

disktut: DISKに関する資料 第2稿
undoc1: UNDOCUMENTED 9801/9821 Vol.1 BIOS・割り込み編 (書籍) ISBN4-8443-4642-3
undoc2: UNDOCUMENTED 9801/9821 Vol.2
GRUB98: http://www.kmc.gr.jp/proj/linux98/arch/i386/boot/grub98/ (20030409 ver)

(20150123めも) (lib)parted のディスクタイプ "pc98" ってほんとに PC-98x1 系のことだと最近気づいた。あとで詳しく確認しよう… → http://git.savannah.gnu.org/cgit/parted.git/tree/libparted/labels/pc98.c

留意点

  • BIOS からみたセクタサイズ - 256/512/1024 バイト(2048 もあったっけ?)
  • Win98(Win2000 も?)から区画情報のフォーマットが変わったとかいう話を聞いたような気がする。 どっかに資料があるんだろうか…。
  • IBM PCと異なり、PC-98のハードディスクBIOSでは、HDD のセクタ番号は 0 から始まる。 FDD は 1 から。 (つまりフロッピーディスクとそれ以外のデバイスとでは、CHS⇔LBA の変換式が異なる)

ハードディスクのジオメトリを得る

(ここの内容はPC-98x1/disk/ジオメトリのほうに移動してみました)

区画情報の判定 (IPL)

ディスク全体用 IPL(シリンダ 0、ヘッド 0、セクタ 0 にある、いわゆる MBR)の、

  • オフセット 04h から 4 バイトが "IPL1"(厳密には拡張フォーマットと無関係)
  • セクタ内のオフセット位置 0FEh〜0FFh の 2 バイトが 55h, AAh

で、拡張フォーマットかどうか一応判定できる。
「標準フォーマット」(セクタサイズ 256 バイトで容量 20M バイト以下の場合、初期化時にフォーマットを選ぶことができる)の IPL にも "IPL1" が書き込まれているため、これだけで判定することはできない。

→DISKTUTをよく眺めると、どうやらオフセット00FE〜FFの55h, AAhが拡張フォーマットか否かの識別判定になっているように読める(物理セクタのサイズとは無関係に)。 "IPL1"はシステム(ディスクBIOS)にとってのブート可能フラグになっているようだ。

セクタサイズが512バイトの場合は、IPLセクタの終端2バイトにも 55h, AAh が設定される(なぜかDOS領域先頭セクタの終端には設定されない)。 セクタサイズが1024バイトの5.25インチMOの場合、IPLセクタの 1FE〜1FFh、3FE〜2FFhに 55h, AAh が設定されるようだ。

区画情報(拡張フォーマット)

シリンダ 0、ヘッド 0、セクタ 1 に収められている。
区画情報は1区画あたり 32 バイト。 したがって、セクタサイズが 512 バイトのデバイスでは最大 16 個の区画情報が格納できる。 セクタサイズ 256 バイトの場合は最大 8 個。

5.25インチMOの場合も最大 16 個に制限されているように思われる(17個目のエントリ部分だけがFFhで埋められており、これをテーブルの終端扱いにしている可能性がある)。

以下の表はほぼ disktut からの引用。

offset size name description
00h byte boot ブート可/不可
bit7 が 1 なら何かしら起動可能なシステムが入っていて、0 なら単なるデータ領域ということらしい。 その他の部分の扱いは、区画の種類によってケースバイケース。
なお、NECの固定ディスク起動メニューでは、9xh,Axh,Dxh,Exhの場合のみメニューから起動選択可能なようである。
01h byte syss 区画種別、アクティブ/スリープ
bit7 が 1 ならその区画はアクティブ、0 ならスリープ、ということらしい。 その他の部分は区画の種類をあらわすようだ。
02h word sysy 不明(0000h)
04h byte IPLs IPL の物理セクタ番号
05h byte IPLh IPL の物理ヘッド番号
06h word IPLc IPL の物理シリンダ番号
08h byte vostas 領域先頭の物理セクタ番号
09h byte vostah 領域先頭の物理ヘッド番号
0Ah word vostac 領域先頭の物理シリンダ番号
0Ch byte voends (領域終端の物理セクタ番号)
0Dh byte voendh (領域終端の物理ヘッド番号)
0Eh word voendc 領域終端の物理シリンダ番号
10h 16bytes sysm 領域名 の ASCII 文字列
  • ふつう、IPL の位置と領域先頭位置は同じになる。
  • 領域終端シリンダは、その区画のいちばん最後にあるシリンダ表す(「次の領域の先頭」ではない)。 したがって、1シリンダ分の領域を確保した場合、vostac と voendc は同じ値になる。
  • てゆうかセクタ番号(vostas, voends)とヘッド番号(vostah, voendh)って使ってんの? (0 以外の値いれたらやばくね?)
  • 領域名が 16 文字未満の場合、あまった部分にはスペース (20h) が詰められるようだ。

先頭2バイト(boot, syss)はむしろ1ワードとみなしちゃったほうがいいのかも。

区画の種別(disktut + GRUB98/shared_src/pc_slich.h から補填)
※ syss の bit7 はとりあえず 0 とみなしている。 boot の bit7 も(FreeBSD と PC-UX 以外では)とりあえず 0 とみなしている。

syss (syss:boot) OS
00h 未使用領域
01h (01:2xh ) MS-DOS (FAT12)
04h (04:00h) PC-UX スワップ領域
04h (04:90h) PC-UX システム領域
06h N88-BASIC
11h (11:2xh) MS-DOS (DOS 3 FAT16)
21h (21:2xh) MS-DOS (DOS 5 FAT16)
44h (44:94h) FreeBSD, NetBSD/pc98
61h (61:2xh) Windows FAT32
62h (62:20h) Linux/98 (EXT2/SWAP)
  • NEC 版 MS-DOS の format /H コマンドを使った場合、大きさ 10M バイトまでの領域は syss が 01h になるようだ。11M バイト以上を指定すると 11h になる(下記「DOS3.3 拡張フォーマット」の項も参照)。
  • 同様に、129M 以上の領域を作成すると syss は 21h になる。11〜128M までは 11h。DOS 3.x は 21h の領域に対応していない(DOS 3.3 付属の format でマップを見ると領域が「他のOS」という表記になる)。たぶん総セクタ数が 65536 以上の領域はこっちを使うんだと思う。 EPSON の DOS 4.0 がこのへんをどう扱っていたのか、ちょっと気になる。
  • MS-DOS 区画の boot (2xh) の下位 4bit は 1 から 0fh までの値をとる(disktut によると「FORMAT.EXE で領域をブート可能にした順に 1 から F まで」だそうです)。ブートしない DOS 領域は 0 (20h) のようだ。
  • Linux/98 区画は bootable なら EXT2、bootable じゃなければスワップ領域とみなすらしい(GRUB98)。
  • todo: HPFS (OS/2) と NTFS(WinNT/2000) の区画 ID を調べよう。
  • todo: その他の OS の区画情報を大募集中。 たしか Netware とか PANIX とかあったような。 あと CP/M86 とか CP/M68K とかもハードディスク使えたよね?(実はまったく知らない)

セクタ長と区画サイズに関する補項

IBM PC 系だと「1セクタ = 512bytes」の対応が(少なくとも FD と HD では)ハードウェアから OS までほぼ一貫しているが、PC-98 系はこのへんが少しややこしくなっており、

  • ハードウェア的な物理セクタ長
  • BIOS から見た(物理)セクタ長
  • MS-DOS などの OS から見た論理セクタ(レコード)長

がそれぞれ異なっていることがある。

DOS3.3 拡張フォーマット

なぜかテクニカルデータブックの「ハードウェア編」のほうに SCSI ディスクのパーティションに関する情報が載っていた。



 SCSI インターフェイスで制御される固定ディスクは、拡張フォーマットでフォーマットされ、4つのアクティブなパーティションの確保が可能である。 また、パーティションの最大領域は 128M バイトである。

DOS 3.3 拡張フォーマットで確保した区画の状態

区画容量 FAT サイズ 論理セクタサイズ
10M 以下 FAT12 1024
65M 未満 FAT16 1024
65M 以上 FAT16 2048

つまりアレだ、DOS 3.x でそこそこデカめのハードディスクを活用するために、論理セクタサイズをでっかくしてるわけだ…ちなみに(起動)ドライブの論理セクタがデカいと、MS-DOS のディスクバッファ(BUFFERS= で指定するアレ)のサイズもその分だけデカくなる。 つまりセクタサイズがでかいとメモリが圧迫される。