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がないよ!」って言われたりしていた。総当たりにすることでそのエラーは解決した。しかし、また別のエラーが湧いてきたのでもっと調べなければ……