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= で指定するアレ)のサイズもその分だけデカくなる。 つまりセクタサイズがでかいとメモリが圧迫される。