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など

  • MBRというか、そのメディアの最初の4KB以内に次のような14バイトの構造体を書いておくと、KHBIOSはKHBIOSの共通パーティション情報が書かれた位置を知ることができる。
    • [8バイトのアドレス] [ 'K', 'H', 'B', '0', 0x09, 0x00]
    • アドレスは、メディアの先頭からその情報が何バイト先にあるかを、512バイト単位で表わしたもの。
      • 例えば0xb0と書いてあれば、0x16000からパーティション情報が始まっていると分かる。
    • この14バイトの構造体は、必ず16バイトアラインされた位置から書き始めなければいけない。KHBIOSは次の順序でこの構造体のシグネチャ(KHB0)を探す。
      • 0x01b8、0x01f8
      • 以上が駄目なら、0x0008、0x0018、0x0028、0x0038、...、0x0fe8、0x0ff8をチェックしてそれでも見付からなければ、このメディアにはKHBIOSのパーティション情報はないと判断する。
  • [標準] KHBIOSのツールで2GB以下のメディア全体をSF16でフォーマットすると、0x01b0からの14バイトにこの構造体はおかれ、アドレスとしては0xb0が書き込まれる(0x16000)。
  • [標準] KHBIOSのツールでメディアを完全初期化すると、MBRおよびリザーブとして最初の64KBを割り当てる。またKHBIOSではパーティションの割り当ては64KB単位でしかやらない。これはパーティション開始位置を64KBアラインするためである。
    • もちろん完全初期化しなければパーティション開始位置は64KBアラインされないが、そういう状態でも問題なくアクセスはできる。ただ、アクセスが最適ではない可能性はある(少し遅いなど・・・もっとも今はどのOSもこういうことには配慮していないようなので、それより遅くなるということではないが)。HDDなどではアラインの効果はあまりないと思われるが、メモリカード類(CFやスマートメディアやSDカードなど)では効果があるのではないかと思われる。 → (参考)SF16
  • MBRの例
    000 31 C0 8E D0 BC 00 7C FB 8E C0 8E D8 FC 89 E6 BF
    010 00 06 B9 00 01 F3 A5 EA 1C 06 00 00 BE BE 07 B1
    020 04 38 2C 7C 07 83 C6 10 E2 F7 CD 18 B4 08 8A 14
    030 56 CD 13 5E 72 2B 80 E1 3F 31 C0 88 F0 30 ED F6
    040 E1 01 C8 89 C3 8B 44 08 8B 54 0A F7 F3 C0 E4 06
    050 86 E0 89 44 02 89 D0 F6 F1 FE C4 08 64 02 88 44
    060 01 B9 03 00 51 B4 41 BB AA 55 8A 14 CD 13 56 8B
    070 14 72 28 81 FB 55 AA 75 22 F6 C1 01 74 1D 31 C0
    080 50 50 FF 74 0A FF 74 08 50 68 00 7C 6A 01 6A 10
    090 B4 42 89 E6 CD 13 BC FC 7B EB 0B 8B 4C 02 BB 00
    0A0 7C B8 01 02 CD 13 5E 59 73 0F 56 51 31 C0 8A 14
    0B0 CD 13 59 5E E2 AE E9 71 FF 81 3E FE 7D 55 AA 0F
    0C0 85 67 FF EA 00 7C 00 00 00 00 00 00 00 00 00 00
          -- 0D0-1AFまでは全部00 --
    1B0 B0 00 00 00 00 00 00 00 4B 48 42 30 09 00 80 ??
    1C0 ?? ?? 06 ?? ?? ?? 80 00 00 00 xx xx xx xx 00 00
    1D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    1E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    1F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
    • 多分これでもちゃんとブートする。ブートコード(000-06B)はKのオリジナル(KL-01)。
      • ブートに失敗すると速やかにINT(0x18);して他のデバイスからのブートを試みさせます。
    • 第一パーティションにSF16が入っている状況。

KHBIOSの共通パーティション情報フォーマット

  • 以下、典型的な8KBタイプ、パーティションが一つしかない場合で説明(とりあえず説明しやすい)。
  • SF16ではたいてい+6000-+7FFFにおかれる。
  • 2バイト以上の数値はすべてリトルエンディアンで格納(x86とおなじ)。
  • オフセットはすべてメディア情報領域の開始アドレスが起点になる。
  • 全体像:
    +0000 - +005F96Bメディア情報領域
    +0060 - +007F32Bパーティション情報ヘッダ領域
    +0080 - +01FF384Bブート補助情報領域(とりあえずオールゼロ)
    +0200 - +024F80Bパーティションデフォルト情報領域
    +0250 - +03FF432Bパーティション起動スクリプト用領域(とりあえずオールゼロ)
    +0400 - +07FF1KBメディア識別子格納領域(とりあえずオールゼロ)
    +0800 - +1FFF6KBパーティション情報格納領域
  • メディア情報領域:
    +0000 - +00030x2000KHBIOS情報のサイズ (8KB)
    +0004 - +00070x2000KHBIOS情報領域のサイズ (ユーザ領域含む) (8KB)
    +0008 - +000F4B 48 42 49 4F 53 30 30 (KHBIOS00)シグネチャ
    +0010 - +001380 00 00 09各種フラグ
    +0014 - +00170x0000メディア識別子の長さ
    +0018 - +001B0x0400メディア識別子格納領域の長さ (1KB)
    +001C - +001F0x0400メディア識別子格納領域の先頭オフセット (+0x0400)
    +0020 - +002Fメディア全体のサイズ (MBRの容量等も含む、512バイト単位)
    +0030 - +00330x0030パーティション情報の総エントリ数 (48エントリ = 6KB)
    +0034 - +00370x0800パーティション情報の格納領域の先頭オフセット (+0x0800)
    +0038 - +003B0x0018ブート補助情報の総エントリ数 (24エントリ = 384バイト)
    +003C - +003F0x0080ブート補助情報の格納領域の先頭オフセット (+0x0080)
    +0040 - +005Fall-zeroリザーブ
  • パーティション情報ヘッダ領域:
    +0060 - +006300 00 00 09各種フラグ
    +0064 - +00670x0200パーティションデフォルト情報の先頭オフセット (+0x0200)
    +0068 - +006B0x01B0パーティション起動スクリプト用領域の長さ (432B)
    +006C - +006F0x0250パーティション起動スクリプト用領域の先頭オフセット(+0x0250)
    +0070 - +007Fパーティションサイズ (512バイト単位、たとえばメディア全体のサイズ - 128)
  • パーティションデフォルト情報領域:
    • +0800-+084Fのコピー。
    • これはパーティションのデフォルト名などを保持するもの。インストール時のパーティション名の初期値などとして利用される。インストール後に設定をいじってもここは保持され、[デフォルトに戻す]を選ぶとこれに戻ったりするわけである。
  • パーティション情報格納領域:
    +0800 - +08030x0010パーティションID
    +0804 - +080700 09 09 09各種フラグ
    +0808 - +080B0x0001パーティション名の記述言語及びエンコード方式 (ASCII)
    +080C - +080Fパーティション名のバイト数 (0~32)
    +0810 - +082Fパーティション名 (空いた部分は0x00に)
    +0830 - +08330x0020フォーマットタイプ (SF16)
    +0834 - +08370x0004フォーマットタイプ名のバイト数 (4バイト)
    +0838 - +083F53 46 31 36 00 00 00 00フォーマットタイプ名 (SF16)
    +0840 - +084Fall-zeroリザーブ
    +0850 - +085Fパーティションの利用サイズ (512バイト単位)
    +0860 - +086Fパーティションのアロケートサイズ (512バイト単位)
    +0870 - +087Fパーティションの開始アドレス (512バイト単位)
    +0880 - +1FFFall-zero第二パーティション以降用の領域

KHBIOS情報の構造 (1)

  • メディア=MBR部(たとえば64KB)+パーティション0+パーティション1+パーティション2+...と考える。
    • FD/CD-R等の場合はMBR部はない。MBR部がなくてもKHBIOSはパーティション情報を持てる。
  • それぞれのパーティションは最低でも1KB程度のKHBIOS情報を持つ。このフォーマットは、次のようになっている。
    +0000 - +000F16Bヘッダ (メディア情報領域の最初の16バイトと同じ -- サイズは1KBになっている:8KBのままでもよいが)
    +0010 - +005F80B未使用
    +0060 - +007F32Bパーティション情報ヘッダ領域
    +0080 - +01FF384B未使用
    +0200 - +024F80Bパーティションデフォルト情報領域
    +0250 - +03FF432Bパーティション起動スクリプト用領域(とりあえずオールゼロ)
    +0400 - +1FFF7KB未使用(8KB指定した場合にのみこの領域がある)
  • この情報がどこにあるかは、各パーティションの最初の4KBのどこかに書いてある(たとえばブートセクタの0x01F0-0x1FDとか)。このとき存在位置は、パーティションの先頭からの相対位置で記述する。
  • これらとは別にたとえば8KBのKHBIOS情報があり、そこは次のようになっている(これはメディア全体に1つだけあればよい情報)。
    +0000 - +005F96Bメディア情報領域
    +0060 - +007F32B未使用
    +0080 - +01FF384Bブート補助情報領域(とりあえずオールゼロ)
    +0200 - +024F80B未使用
    +0250 - +03FF432B未使用
    +0400 - +07FF1KBメディア識別子格納領域(とりあえずオールゼロ)
    +0800 - +1FFF6KBパーティション情報格納領域
  • この情報がどこにあるかはMBRなどに書かれている(たとえば0x01B0-0x1BDとか)。
  • これでわかるように、この8KBの中に1KBのパーティション情報を一つだけ兼用できる。
  • KHBIOSはメディアを構成している全てのパーティションのKHBIOS情報領域を調べて、どこかに8KBものがあれば、そこにKHBIOSメディア情報を書き込むことにする。見付からなければ、別途8KBの領域を確保しそこで管理する。
  • http://k.hideyosi.com/khbios_fig0.png
    • 黒い矢印は、14バイトのシグネチャ付きポインタで示されていることを意味する。
    • MBR部がない場合は、最初のパーティションのところが8KBである必要がある。

KHBIOS情報の構造 (2)

  • パーティションの中に寄生パーティションを持った場合の説明。
  • http://k.hideyosi.com/khbios_fig1.png
  • 説明としては「パーティションがファイルとしてみえる」であるが、実際のところは「ファイルをパーティションとして見せている」のほうがニュアンスが近い。
  • 当然のことながら、この例でいうところのfdimage.binはクラスタが連続していなければいけないし、不意に移動してもいけない。移動したい場合は、移動後にKHBIOSのツールでチェックしてもらうことになるだろう。
    • ファイルの属性で、SYSTEMとHIDDENを立てておくと、デフラグなどでは移動させられずに済むので、これがおすすめ。
  • 黒矢印は相対ポインタなので、#0のイメージをそのまま他のメディアの違う場所にコピーしても、#1はそのまま使える。

なんでこんな仕組みなのか?

  • たとえばこの8KBの構造の位置をMBRの直後に固定することだって仕様としては可能でした。しかしそうすると、すでにそこを使っているフォーマットとの共存ができなくなります。それゆえにKHBIOS情報の開始位置は可変で、14バイトのシグネチャ付きポインタですらどこに書くかが固定されていません。
  • KHBIOS上で起動するOSは、KHBIOSが整理した情報を受け取れるので、自前でKHBIOSポインタを探したりアクセスしたりする必要はありません。

バグ情報

  • pcctol0cに入っているsf16isetにはバグがある。
    0101F0: B0 → 30
    016068: 00 → B0
    016069: 00 → 01
    01606C: 00 → 50
    01606D: 00 → 02
    • pcctol0dでは修正された。

こめんと欄

  • もうすでにKHBIOSをサポートしようというソフトもあるみたいですね -- 名無しさん 2005-03-12 (土) 19:40:41

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-10 (水) 07:53:50 (1591d)