MikanOSがVirtualBoxで動かない話

最近、ゼロからの OS 自作入門を進めている。本の内容は進めるが、実装は半ばオリチャーで進める悪魔の進行だ。

しかしながら、その7章割り込みでなーんにも進まない事になってしまったため、それこれを書く。

VirtualBoxで進めたのが悪い(早とちり)

QEMUを使うのが(なんとなく)めんどくさくてVirtualBoxで開発を始めた。本当はWSLgとかその辺でいい感じにWindows上でもQEMUが動くのを知るのは後の話。

奇妙な事に、デフォルトの状態だとxHCIの割り込みに使うPCIコンフィグレーション空間の0x34、Capabilities Pointerを読みだすと0b000000になってしまう。当然これは無効なアドレスで、割り込みは設定できない。

チップセットを変更

VirtualBoxの設定を眺めて、何かヒントになりそうなものを探した結果、唯一残ったのはチップセットの欄。初期設定はPIIX3になっているがICH9にも変更できるらしい。

ICH9に変更してみると、今度はPCIデバイスが1つも見つからないという事態になった。しかも、本家のソースをビルドして動かしても同様だった。

脳筋探索

諦め半分でOSDev Wikiを眺めていると、"Brute Force" Scanなる探索法があると書いてある。端的に言えば総当たりである。実際に試してみると、動いた。動いてしまった。

pci.cpp
void BruteForceBusScan() {     
    for (uint16_t bus = 0; bus < 256; bus++) {
        ScanBus(bus);
    }
}

リンク先にはBusとDevice両方を総当たりするので256×32=8192回のforループだが、busだけ全部再帰探索に投げるだけで動いた。

おわり

どうやら実機でもPCIの探索がうまくいってないパターンがあったので、VirtualBoxに限った話ではないのかもしれない。

実際、私の手元のパソコンでもPCIデバイスの探索がダメで「xHCIがないよ!」って言われたりしていた。総当たりにすることでそのエラーは解決した。しかし、また別のエラーが湧いてきたのでもっと調べなければ……