Skip to content

Commit

Permalink
vmcall: revise
Browse files Browse the repository at this point in the history
Signed-off-by: smallkirby <[email protected]>
  • Loading branch information
smallkirby committed Nov 17, 2024
1 parent 8e503fe commit 1ad00ae
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/vmm/vmcall.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# VMCALL Service

本チャプターは、Writing Hypervisor in Zig におけるとりあえずの最終章です。
今後も気が向いたら加筆される可能性はありますが、一旦本チャプターを持って締めくくろうと思います。
本チャプターはエクストラステージとして、VMCALL を使った VMCALL Service を実装します。
かなりコンパクトなチャプターです。
VMCALL Service を活用することで、ゲストがホストに対して何らかの要求をしたり、逆にホストがゲストの情報を取得することができるようになります。
本チャプターではそれらを実装するための基盤を作ります。

## Table of Contents

<!-- toc -->
Expand All @@ -23,7 +30,7 @@ Ymir ではお試しとして VMCALL サービスを1つだけ提供します。

VMCALL サービスを定義していきます。
VMCALL は命令自体は引数も何も持たず、calling convention を VMM 側で定義する必要があります。
Ymir では RAX に VMCALL Service の番号を入れて呼び出すという規約にします
Ymir では **RAX に VMCALL Service の番号を入れて呼び出すという規約** にします
VMCALL Service の `0` には `hello` という名前をつけて、ロゴとメッセージを出力するようにします:

```ymir/arch/x86/vmx/vmc.zig
Expand Down Expand Up @@ -142,6 +149,7 @@ Saving 256 bits of non-creditable seed for next boot
```

`ymirsh` が VMCALL を実行すると、サービス0番の `hello` が呼び出されてロゴとメッセージが出力されました。
今まで Ymir がしてきたログ出力と見た目はなんら変わりませんが、このログはゲストに明示的に要求されて出力されているという違いがあります。

本チャプターでは VMCALL Service の実装をしました。
実装した機能はログ出力をするだけのほぼ意味がないものでしたが、この枠組みを利用してゲストとホストの間でさまざまなやり取りをすることができます。
Expand All @@ -151,3 +159,11 @@ Saving 256 bits of non-creditable seed for next boot
そこで、起動時に一度だけ VMM に保護対象のアドレスを通知することで、カーネルが陥落しても VMM が指定されたメモリを保護することができます。
といったように、VMCALL は使い方次第でいろいろなことが実現できます。
ぜひ自分なりのアイデアを実装してみてください。

さて、以上で **Writing Hypervisor in Zig** は終了です。
もしもここまで読んでくださった方がいるのであれば、ありがとうございます。
実装してきた Ymir は、依然としておもちゃの域を超えていません。
[トップページ](../intro.md) に書いたように、いろいろな機能が未実装のままです。
しかしながら、Linux をブートできたという事実には変わりありません。
Ymir をベースとして、もしくは全てゼロからフルスクラッチで、さらに自分なりの機能を追加してみてください。
その際の足がかりとして Ymir というおもちゃが役立てば幸いです。

0 comments on commit 1ad00ae

Please sign in to comment.