/dev/kvmを直接叩く - BIOSを動かす

前回の記事で/dev/kvmへioctlを発行することでVMを作成し、その上で"Hello KVM!"をシリアル送信するプログラムを動作させてみました。


次はx86 PCにおいて電源を入れてから一番最初に実行されるソフトウェアとしてBIOSを動作させてみます。


前回変に頑張って文章が長くなってしまったので、今回は要点だけ。

サンプルコード

https://github.com/cupnes/bare_metal_kvm/02_bios

エラー処理など削減版
https://github.com/cupnes/bare_metal_kvm/02_bios_nodebug


前回同様、makeでビルドし、make runで実行できます。


BIOSとしてSeaBIOSを使うので、インストールされていない場合はインストールしておいてください。

$ sudo apt install seabios

やっていること

  • VMに最低限必要なハードウェアを設定してSeaBIOSを動かす
    • SeaBIOSが動いている様子をシリアルで確認できればOKとする
      • 起動ディスクの設定とかはまだしない


アーキテクチャ


【メモリマップ】

前回記事との差分

  • VMへ割り込みコントローラとタイマーとRAMを追加
    • 割り込みコントローラとタイマーはKVM_CREATE_IRQCHIPとKVM_CREATE_PITをioctlでリクエストするだけ
    • RAMはSeaBIOSが触りに行く領域にマップしておく
      • コンベンショナルメモリ: 0x00000000 〜 0x0009ffff (640KB)
      • VGA BIOS: 0x000c0000 〜0x000dffff (128KB)
        • ただし、VGA BIOSは使わないし用意しない
        • アクセスできるようにさえしておけば、SeaBIOSが見に来て、VGA BIOSが無いことを知り、あきらめる模様
  • IPレジスタ初期値が0xfffffff0で、SeaBIOSは起動直後に0x000fe05bへジャンプするので、BIOS ROM(128KB)は0x000e0000と0xfffe0000へマップする