めも VBE 3.0 - 16bit protected mode entry point

注意してコーディングすれば、リアルモードと16ビットプロテクトモードのコードはある程度まで共用化できる。ということでなのかどうかは知らないが、VBE/Core 3.0 仕様では VBE ファンクションの16ビット・プロテクトモードのエントリが仕様として定義されていたりする。

16ビット・プロテクトモードエントリ経由のファンクションコールを使った場合の、従来からのリアルモード割り込み(int 10h)に対する利点は、

  • (仮想86でない、真の)リアルモードに CPU の状態を戻して呼び出すよりは、マルチタスク関係処理との親和性が高そう。
  • 仮想86タスクを作って呼び出すよりはシステムリソースに優しそう。
  • すくなくともプロテクトモードから呼び出すぶんには、リアルモード BIOS を呼び出すより動作が速そう。

こんなぐらい?
もちろん欠点や懸念もいくつかある。たとえば、

  • VBE 3.0 以上で定義されている。つまり 2.0 以前の BIOS では実装されていない。
  • 実際に実装されてるかどうかは「VGABIOS 領域の先頭32Kバイト(C0000-C7FFFh)を自力でスキャンして PMInfoBlock 構造体を探す」という方法でしか確認できない。E0000h に VGABIOS がある場合や DOSTSR なんかの実装はアウトオブ眼中らしい。
  • 16ビット・プロテクトモードのセレクタBIOS 実行用のコードセグメント、BIOS データ格納用データセグメント、ビデオバッファの物理メモリを指すデータセレクタ3つ、BIOS コードセグメントと同位置を指すデータセレクタ、ローカルスタック用のスタックセグメント)を用意しないといけない。
  • 使う前に初期化(BIOS コードを RAM に転送、16ビットセレクタ作成、PMInfoBlock 構造体設定、初期化ファンクション呼び出し)する必要がある。
  • あくまで16ビットのコードなので、32ビットのデータセグメントからポインタを渡す場合は16ビットのセレクタとオフセットに変換しないといけない(これは vbe3.pdf に書いてある)
  • あくまで16ビットのコードなので、32ビットのコードセグメントから呼び出す場合はリターンアドレスのオフセットが16ビット内に収まってないとたぶんヤバい(これって vbe3.pdf に書いてあった?)。中継用のエントリ作るとかしないといけないかも。
  • 「状態取得」系のファンクションは未サポート(必須サポートではないので、動作をアテにしてはいけない)。
  • というかそもそも実装がこなれてなさそうな気がする。だって16ビット・プロテクトモードですよ? たしか APM とか PCI とかの16ビットプロテクトモード BIOS も腐った実装がけっこうあったりなかったり…という話をどこかで聞いた気がしましたがどうなんでしょうか?

ということで個人的には「報われない感」がいちばん強い仕様ではあります。

しかし家だとこんないっぱい書けないですヨ……