@@ -245,27 +245,24 @@ main(int argc, char** argv)
245
245
}
246
246
` ` `
247
247
248
- (1) ゲストマシンで実行するプログラムです。
249
- (2) ALレジスタに*(ASCIIコードで0x2a)をロード、DXレジスタにシリアルポートのデータレジスタのアドレスをロード、outbでALレジスタの内容をDXレジスタで指定したポートへ書き込み、を繰り返し行っています。
250
- (3) ここではプログラムのロード処理を省略するため、配列上にプログラムのHEXダンプを持ってきています。
251
- (4) vm_create()でvmm.koへsysctlを発行し、VMインスタンスを作成します。
248
+ (1) ゲストマシンで実行するプログラムです。ALレジスタに*(ASCIIコードで0x2a)をロード、DXレジスタにシリアルポートのデータレジスタのアドレスをロード、outbでALレジスタの内容をDXレジスタで指定したポートへ書き込み、を繰り返し行っています。ここではプログラムのロード処理を省略するため、配列上にプログラムのHEXダンプを持ってきています。
249
+ (2) vm_create()でvmm.koへsysctlを発行し、VMインスタンスを作成します。
252
250
作成したインスタンスは/dev/vmm/<VM名>で表され、ioctlで制御できます。
253
- (5 ) vm_setup_memory()でゲストマシンのメモリサイズを指定し、/dev/vmm/<VM名>をmmapしてプロセスのメモリ空間へゲストメモリ空間をマップしています。
254
- (6 ) vm_map_gpa()でゲストメモリ空間へのポインタを取得しています。
251
+ (3 ) vm_setup_memory()でゲストマシンのメモリサイズを指定し、/dev/vmm/<VM名>をmmapしてプロセスのメモリ空間へゲストメモリ空間をマップしています。
252
+ (4 ) vm_map_gpa()でゲストメモリ空間へのポインタを取得しています。
255
253
ゲストメモリ空間上のアドレスは引数で指定しています(ここではADDR_PT4 = 2000h)。
256
- vm_map_gpa() では渡されたアドレスをオフセットとしてポインタを計算します。
257
- (7) ここでは、ページテーブル(pt4,pt3,pt2)、GDT、プログラム領域(entry)のアドレスを指定してそれぞれのポインタを取得しています。
258
- (8) ゲストメモリ空間上のページテーブルを初期化しています。
259
- (9) ゲストメモリ空間上の初期化しています。
260
- (10) ゲストメモリ空間へ(1)で記述したプログラムをコピーしています。
261
- (11) 各セグメントレジスタを初期化してます。
262
- (12) GDTRに作成したGDTのアドレスをセットしてます。
263
- (13) CR0レジスタにプロテクテッドモード有効、ページング有効などのビットを設定しています。
264
- (14) CR3レジスタに作成したページテーブルのアドレスを設定しています。
265
- (15) CR4レジスタにPAE有効化などのビットを設定しています。
266
- (16) EFERレジスタに64bit有効化などのビットを設定しています。
267
- (17) RSPレジスタにスタックアドレスの初期値を設定しています。
268
- (18) RIPレジスタにロードしたプログラムのアドレスを設定しています。
254
+ vm_map_gpa() では渡されたアドレスをオフセットとしてポインタを計算します。ここでは、ページテーブル(pt4,pt3,pt2)、GDT、プログラム領域(entry)のアドレスを指定してそれぞれのポインタを取得しています。
255
+ (5) ゲストメモリ空間上のページテーブルを初期化しています。
256
+ (6) ゲストメモリ空間上の初期化しています。
257
+ (7) ゲストメモリ空間へ(1)で記述したプログラムをコピーしています。
258
+ (8) 各セグメントレジスタを初期化してます。
259
+ (9) GDTRに作成したGDTのアドレスをセットしてます。
260
+ (10) CR0レジスタにプロテクテッドモード有効、ページング有効などのビットを設定しています。
261
+ (11) CR3レジスタに作成したページテーブルのアドレスを設定しています。
262
+ (12) CR4レジスタにPAE有効化などのビットを設定しています。
263
+ (13) EFERレジスタに64bit有効化などのビットを設定しています。
264
+ (14) RSPレジスタにスタックアドレスの初期値を設定しています。
265
+ (15) RIPレジスタにロードしたプログラムのアドレスを設定しています。
269
266
270
267
実行イメージ
271
268
============
0 commit comments