More Related Content
Similar to /dev/kvmを直接叩いて自作VM
Similar to /dev/kvmを直接叩いて自作VM (20)
More from Yuma Ohgami (20)
/dev/kvmを直接叩いて自作VM
- 2. 2018/06/04 大神 祐真 2
KVMとは
●
Kernel-based Virtual Machine[1]
●
仮想化支援機能を持つx86ハードウェア上のLinux向け
完全仮想化機能[1]
– 仮想化支援機能
●
Intel VT
●
AMD-V
– 完全仮想化(Full virtualization)
●
特定のハードウェアを完全にシミュレートしていること
●
対義語: 準仮想化(Paravirtualization)
[1] http://linux-kvm.org
- 6. 2018/06/04 大神 祐真 6
KVMは何をしてくれるのか?
Kernel
Userspace
/dev/kvm
● VM作って。
● VCPU作って。
●
メモリはこれね。
●
カーネルレベルの
処理
● IO
- 7. 2018/06/04 大神 祐真 7
実は簡単に叩けます
Kernel
Userspace
/dev/kvm
open(“/dev/kvm”)
ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)
for (;;) {
ioctl(KVM_RUN)
switch (exit_reason) {
case KVM_EXIT_IO:
/* ... */
case KVM_EXIT_HLT:
/* ... */
}
}
実は
こんな風に
叩ける
- 9. 2018/06/04 大神 祐真 9
1. Hello KVM!
●
IOとしてはシリアル通信のみをサポートする
VMを作る
●
シリアル送信のIOアドレスへ文字を送信するだ
けの実行バイナリをVMのアドレス空間へマッ
プして、VMのCPUに実行させる
サンプルコード
https://github.com/cupnes/bare_metal_kvm/tree/master/01_hello
- 11. 2018/06/04 大神 祐真 11
1. Hello KVM!
メモリマップ
リニアアドレス空間 IOアドレス空間
0x0000 0000 ROM(4KB)
0x0000 1000
0x0000
0x0001
0x0002 シリアル送信
レジスタ
(1バイト)
- 12. 2018/06/04 大神 祐真 12
2. BIOSを動かす
●
ROMをBIOS(SeaBIOS)にして、BIOSを動かす
●
適宜必要なデバイスを追加する
●
このステップではBIOSが動いている様子が
シリアル出力で確認できればOKとする
サンプルコード
https://github.com/cupnes/bare_metal_kvm/tree/master/02_bios
エラー処理・デバッグ処理などを削ったもの
https://github.com/cupnes/bare_metal_kvm/tree/master/02_bios_no
debug
- 13. 2018/06/04 大神 祐真 13
2. BIOSを動かす
VM
CPU
ROM
(BIOS)
Serial
アーキテクチャ
割り込み
コントローラ
RAM
タイマー
- 14. 2018/06/04 大神 祐真 14
2. BIOSを動かす
メモリマップ
リニアアドレス空間 IOアドレス空間
0x0000 0000
RAM(640KB)
0x000a 0000
0x0000
0x0402
0x0403
シリアル送信
レジスタ
(1バイト)
0x000c 0000 RAM(128KB)
0x000e 0000
・
・
・
ROM(128KB)
0x0010 0000
0xfffe 0000 ROM(128KB)
0x1 0000 0000
BIOS
BIOS
(shadow)