最近、Writing Hypervisor in Zig というブログシリーズに沿ってハイパーバイザの自作に取り組んでいる。といってもまだ肝心のハイパーバイザ部分にはたどり着いてなくて、先日ようやくカーネルのパートが終わったところである。
Writing Hypervisor in Zig、じわじわ進めてましてようやくカーネルのパートが終了! 次からはVMMのパートに入るわけなんだけど問題は自分のPCのCPUがIntelではなくAMDという・・ pic.twitter.com/XUiyyGAUN5
— gingk (@gingk1212) June 1, 2025
低レイヤー周りの技術が好きでこれまでも CPU や OS に関しては技術書を読んだり手を動かしたりしてうすーく触れてきたのだけど、ハイパーバイザに関してはまったくノータッチだったのでふつふつと興味が湧いてきていろいろ記事などを漁った結果こちらを見つけてやってみることにした。
冒頭でも書いた通りまだハイパーバイザ部分にたどり着いてはいないのだけど、楽しく取り組むことができていて低レイヤをいじりたい欲もいい感じに満たされている。自分の OS 関連の知識としてはむかしに「作りながら学ぶOSカーネル」という本を読みながら OS を実装してみたくらいなのだけど (一応全部読んだけど写経したつもりのコードがなぜか動かなくて挫折した)、ブートローダやカーネルのパートについても解説が豊富で今のところ特に大きく詰まることもなく進められている。(本筋とは関係ないところで唯一ハマったのが以下のポストで書いた件。二回目以降の起動で落ちてしまうという不具合がありいろいろ調べた結果使っている QEMU のバージョンが低いというオチだった)
QEMUのVirtual Fat機能 (-drive file=fat:...) に問題があったみたい。このコミットでマージされたvvfat関連の一連の改修により修正されている。https://t.co/bCtBX9OIUS
— gingk (@gingk1212) April 28, 2025
実装には Zig ではなくC言語を使っている。理由としては以前はがっつり C を使っていたのだけど最近は業務の都合上使わなくなってしまったので、久々に使っておきたいという思いもあり C を使うことにした。ただこのブログシリーズでは Zig の書き方やお作法などについても解説が豊富なのでちょっともったいなかったかなという思いもある。リポジトリはこちら。C を使っているので本家の Ymir の末尾に C を足して YmirC という名前にした。
ここからようやくハイパーバイザのパートに突入するところなのだけど、実は一つ大きな問題がある。冒頭に貼ったポストにもある通り、Writing Hypervisor in Zig では Intel の VT-x を使用することを前提として記事が書かれているが、自分の使っている PC は以前の記事でも書いた通り AMD なので AMD-V なるものを使う必要がある。共通点はあると思うけどもちろん別ものなのでここからは自分でがっつり調べながら進める必要がありそうなのであった。