KHBIOS
旧名称は「拡張汎用BIOS」(内容は変わっていないが、全角文字を含むようなプロジェクト名が不便だったので改名)。Kが手がけているOSASK計画のサブプロジェクト。
- 目的
- KHBIOSの目的は単純明快で「ふつーのBIOSがサポートしていないデバイスからでもOSを起動したいよう」という野望と、OSASKスタイルを実現すること。副作用として、「一つのディスクイメージでAT互換機/FM-TOWNS/PC-98x1のどれでも起動できちゃうぜOS」を実現できたりもします。
- 手段
- KHBIOSは本来のBIOSから見るとOSとして認識されます。しかし機能的にはKHBIOSはOSではなく、拡張追加されたBIOSファンクションという位置づけです。BIOSからOSとして認識させることで、多くのM/Bに対応できます。このKHBIOS自身はBIOSが認識できるブートデバイスにインストールしておく必要があります。
- 対象OS
- まずはOSASKですが、その後仕様をどんどん公開して、多くのOSに対応してもらいたいと思っています。また、対応してもらえなくてもオープンソース系OSなら、Kが勝手に対応版を作る可能性もあります。
- 補足
- 旧名称の中の「汎用」というのは何を表わしているのかというと、AT互換機オンリーではなく、FM-TOWNSやPC-98x1やたぶんマッキントッシュとも共通に使えるファンクションであるという意味です。それぞれの機種用のKHBIOSが提供されます。
- 他にKHBIOSは何をしてくれるのか
- 全てのストレージデバイスに対して統一されたパーティション機能を提供します。CD-ROMやFDなどもパーティションに分けられますし(これらは非KHBIOS対応OSからは、単なるイメージファイルに見せることが可能です)、ATフォーマット、TOWNSフォーマット、98フォーマットのHDDパーティションも再フォーマットすることなく認識可能です)。ファイルシステムのサポートはありません。したがってパーティションとは言っても、LBAでセクタを指定してアクセスするファンクションがあるだけです(KHBIOS側でパーティション開始位置を加算してくれるというだけ)。
- Kが結構入れ込んでいるので、そのうち間違いなくリリースされる事でしょう。
- projectsのOSが対応してくれたら感激です(でも今はOSASKしかない・・・)。
- 現在は習作版KHBIOSにて実験中。→[OSASK 5998]
- とりあえずOSASKのインストールされたコンパクトフラッシュをPCカードスロットに差すとOSASKが起動し、何もささっていないか、もしくはコンパクトフラッシュにOSASKが入っていなければ、そのままHDDからWin95がブートするという状態はできた。
- どちらの場合も体感できる起動時間の遅延はない(これは重要)。
つまり、こんなことができるわけです
- 具体的に書かないと実感が湧かないみたいなので、書くことにしました。
- KHBIOS対応OSは、どのデバイスに対しても共通のブートコードです。
- だから、FDでブートするようになれば、全く同じバイナリイメージでHDDもCD-ROMもCFもネットワークブートもできます。今のように、全部がまちまちだったりはしません。OS開発者は楽できます。
- KHBIOS対応OSをたとえばCFに入れておいて、そのCFを入れてブートするとCFからOSが起動、CFを入れないと普通にHDDからOSが起動、みたいなことができます。
- これと同じ事ができるM/Bもありますが、KHBIOSでは対応していないM/Bでも簡単にできるようにしてしまう所が違います。
- CD-ROMブート対応じゃないM/BでCD-ROMブートするとか、SCSIカードがブート対応じゃなくてもSCSIデバイスからブートするとか、そんな感じでM/Bでのサポート状況に関係なく機能します。ただし、ブートできるのは基本的にはKHBIOS対応OSに限られます(ある程度は既存のOSもブートできるようになる可能性はあります)。
- KHBIOS対応にもレベルがあるのですが、OSブート後にもKHBIOSを呼び出す仕組みを持たせるレベルの対応であれば(このサポートは必須ではありません)、リセットすることなく他のOSを起動させられます(当然、KHBIOSを呼び出した時点でそのOSは終了です)。
- 例えば、OSASKで「khbios freedos」とコマンドを打ち込むと、リセットすることなくFreeDOSに切り替わったりするわけです。リセットしないので、あのうっとうしいメモリチェックやデバイスチェックに待たされることはありません。freedosがCFやHDDにあるのなら、1秒くらいで切り替わります。
- 同様にKHBIOS対応のFreeDOSから「C>khbios osask」とやれば、これまた1秒くらいでOSASKに戻るわけです。
- OSASK側で全タスクをタスクセーブしてからFreeDOSに行き、OSASKに戻ったときにすぐに全てタスクロードする、なんてこともたぶんできるようになるでしょう。
- もっともOSASKに限定すると、エミュレータが充実すればこの手の機能はそれほどありがたくはなくなりますが。
- KHBIOS対応OSは、KHBIOSのファンクションを使うなら、FDやHDDやCD-ROMやCFなどのドライバを自前で準備できなくても、これらのデバイスを利用できます。
- しかしほとんどすべての場合において、そのOSに合ったネイティブドライバを書く方が速いでしょう。だから、これはそれほど重要な特徴ではないと思います。
KHBIOSの共通パーティション情報の説明
- KHBIOSはパーティションを任意の位置におくことができ、それゆえに高い適応性があるのだが、とりあえずKHBIOSに付属するツールを使ったときの位置を「標準」としてここでは説明する。
- このパーティション情報には、ブートスクリプトバイトコードも含まれる。
MBRなど
KHBIOSの共通パーティション情報フォーマット
- 以下、典型的な8KBタイプ、パーティションが一つしかない場合で説明(とりあえず説明しやすい)。
- SF16ではたいてい+6000-+7FFFにおかれる。
- 2バイト以上の数値はすべてリトルエンディアンで格納(x86とおなじ)。
- オフセットはすべてメディア情報領域の開始アドレスが起点になる。
- 全体像:
| +0000 - +005F | 96B | メディア情報領域 |
| +0060 - +007F | 32B | パーティション情報ヘッダ領域 |
| +0080 - +01FF | 384B | ブート補助情報領域(とりあえずオールゼロ) |
| +0200 - +024F | 80B | パーティションデフォルト情報領域 |
| +0250 - +03FF | 432B | パーティション起動スクリプト用領域(とりあえずオールゼロ) |
| +0400 - +07FF | 1KB | メディア識別子格納領域(とりあえずオールゼロ) |
| +0800 - +1FFF | 6KB | パーティション情報格納領域 |
- メディア情報領域:
| +0000 - +0003 | 0x2000 | KHBIOS情報のサイズ (8KB) |
| +0004 - +0007 | 0x2000 | KHBIOS情報領域のサイズ (ユーザ領域含む) (8KB) |
| +0008 - +000F | 4B 48 42 49 4F 53 30 30 (KHBIOS00) | シグネチャ |
| +0010 - +0013 | 80 00 00 09 | 各種フラグ |
| +0014 - +0017 | 0x0000 | メディア識別子の長さ |
| +0018 - +001B | 0x0400 | メディア識別子格納領域の長さ (1KB) |
| +001C - +001F | 0x0400 | メディア識別子格納領域の先頭オフセット (+0x0400) |
| +0020 - +002F | | メディア全体のサイズ (MBRの容量等も含む、512バイト単位) |
| +0030 - +0033 | 0x0030 | パーティション情報の総エントリ数 (48エントリ = 6KB) |
| +0034 - +0037 | 0x0800 | パーティション情報の格納領域の先頭オフセット (+0x0800) |
| +0038 - +003B | 0x0018 | ブート補助情報の総エントリ数 (24エントリ = 384バイト) |
| +003C - +003F | 0x0080 | ブート補助情報の格納領域の先頭オフセット (+0x0080) |
| +0040 - +005F | all-zero | リザーブ |
- パーティション情報ヘッダ領域:
| +0060 - +0063 | 00 00 00 09 | 各種フラグ |
| +0064 - +0067 | 0x0200 | パーティションデフォルト情報の先頭オフセット (+0x0200) |
| +0068 - +006B | 0x01B0 | パーティション起動スクリプト用領域の長さ (432B) |
| +006C - +006F | 0x0250 | パーティション起動スクリプト用領域の先頭オフセット(+0x0250) |
| +0070 - +007F | | パーティションサイズ (512バイト単位、たとえばメディア全体のサイズ - 128) |
- パーティションデフォルト情報領域:
- +0800-+084Fのコピー。
- これはパーティションのデフォルト名などを保持するもの。インストール時のパーティション名の初期値などとして利用される。インストール後に設定をいじってもここは保持され、[デフォルトに戻す]を選ぶとこれに戻ったりするわけである。
- パーティション情報格納領域:
| +0800 - +0803 | 0x0010 | パーティションID |
| +0804 - +0807 | 00 09 09 09 | 各種フラグ |
| +0808 - +080B | 0x0001 | パーティション名の記述言語及びエンコード方式 (ASCII) |
| +080C - +080F | | パーティション名のバイト数 (0~32) |
| +0810 - +082F | | パーティション名 (空いた部分は0x00に) |
| +0830 - +0833 | 0x0020 | フォーマットタイプ (SF16) |
| +0834 - +0837 | 0x0004 | フォーマットタイプ名のバイト数 (4バイト) |
| +0838 - +083F | 53 46 31 36 00 00 00 00 | フォーマットタイプ名 (SF16) |
| +0840 - +084F | all-zero | リザーブ |
| +0850 - +085F | | パーティションの利用サイズ (512バイト単位) |
| +0860 - +086F | | パーティションのアロケートサイズ (512バイト単位) |
| +0870 - +087F | | パーティションの開始アドレス (512バイト単位) |
| +0880 - +1FFF | all-zero | 第二パーティション以降用の領域 |
KHBIOS情報の構造 (1)
- メディア=MBR部(たとえば64KB)+パーティション0+パーティション1+パーティション2+...と考える。
- FD/CD-R等の場合はMBR部はない。MBR部がなくてもKHBIOSはパーティション情報を持てる。
- それぞれのパーティションは最低でも1KB程度のKHBIOS情報を持つ。このフォーマットは、次のようになっている。
| +0000 - +000F | 16B | ヘッダ (メディア情報領域の最初の16バイトと同じ -- サイズは1KBになっている:8KBのままでもよいが) |
| +0010 - +005F | 80B | 未使用 |
| +0060 - +007F | 32B | パーティション情報ヘッダ領域 |
| +0080 - +01FF | 384B | 未使用 |
| +0200 - +024F | 80B | パーティションデフォルト情報領域 |
| +0250 - +03FF | 432B | パーティション起動スクリプト用領域(とりあえずオールゼロ) |
| +0400 - +1FFF | 7KB | 未使用(8KB指定した場合にのみこの領域がある) |
- この情報がどこにあるかは、各パーティションの最初の4KBのどこかに書いてある(たとえばブートセクタの0x01F0-0x1FDとか)。このとき存在位置は、パーティションの先頭からの相対位置で記述する。
- これらとは別にたとえば8KBのKHBIOS情報があり、そこは次のようになっている(これはメディア全体に1つだけあればよい情報)。
| +0000 - +005F | 96B | メディア情報領域 |
| +0060 - +007F | 32B | 未使用 |
| +0080 - +01FF | 384B | ブート補助情報領域(とりあえずオールゼロ) |
| +0200 - +024F | 80B | 未使用 |
| +0250 - +03FF | 432B | 未使用 |
| +0400 - +07FF | 1KB | メディア識別子格納領域(とりあえずオールゼロ) |
| +0800 - +1FFF | 6KB | パーティション情報格納領域 |
- この情報がどこにあるかはMBRなどに書かれている(たとえば0x01B0-0x1BDとか)。
- これでわかるように、この8KBの中に1KBのパーティション情報を一つだけ兼用できる。
- KHBIOSはメディアを構成している全てのパーティションのKHBIOS情報領域を調べて、どこかに8KBものがあれば、そこにKHBIOSメディア情報を書き込むことにする。見付からなければ、別途8KBの領域を確保しそこで管理する。
- 黒い矢印は、14バイトのシグネチャ付きポインタで示されていることを意味する。
- MBR部がない場合は、最初のパーティションのところが8KBである必要がある。
KHBIOS情報の構造 (2)
- パーティションの中に寄生パーティションを持った場合の説明。

- 説明としては「パーティションがファイルとしてみえる」であるが、実際のところは「ファイルをパーティションとして見せている」のほうがニュアンスが近い。
- 当然のことながら、この例でいうところのfdimage.binはクラスタが連続していなければいけないし、不意に移動してもいけない。移動したい場合は、移動後にKHBIOSのツールでチェックしてもらうことになるだろう。
- ファイルの属性で、SYSTEMとHIDDENを立てておくと、デフラグなどでは移動させられずに済むので、これがおすすめ。
- 黒矢印は相対ポインタなので、#0のイメージをそのまま他のメディアの違う場所にコピーしても、#1はそのまま使える。
なんでこんな仕組みなのか?
- たとえばこの8KBの構造の位置をMBRの直後に固定することだって仕様としては可能でした。しかしそうすると、すでにそこを使っているフォーマットとの共存ができなくなります。それゆえにKHBIOS情報の開始位置は可変で、14バイトのシグネチャ付きポインタですらどこに書くかが固定されていません。
- KHBIOS上で起動するOSは、KHBIOSが整理した情報を受け取れるので、自前でKHBIOSポインタを探したりアクセスしたりする必要はありません。
バグ情報
こめんと欄
- もうすでにKHBIOSをサポートしようというソフトもあるみたいですね -- 名無しさん 2005-03-12 (土) 19:40:41