リンクからKVMインターフェース以下の構造により、ゲストにメモリを割り当てることができます。
struct kvm_userspace_memory_region region = {
.slot = 0,
.guest_phys_addr = 0x1000,
.memory_size = 0x1000,
.userspace_addr = (uint64_t)mem,
};
ioctl(vmfd, KVM_SET_USER_MEMORY_REGION, ®ion);
はい、上記のリンクに各変数の説明がありますが、理解するのは難しいです。以下は私が現在知っている内容です。誤解がある場合は訂正してください。
- ゲスト物理メモリも仮想メモリですが、ゲストにとっては物理メモリのように見えます。
- ユーザ空間アドレスは、ユーザコードの開始メモリアドレスである。
私の疑いは次のとおりです。
- このスロットの目的は何であり、CPUの電源を入れたときに表示される物理メモリの物理スロットに似ていると仮定できますか?
- シングルスロットの最大メモリ制限はありますか?そうでない場合、複数のスロットを持つユースケースは何ですか?
- メモリサイズはユーザー空間コードのサイズを意味しますか、それとも私たちが要求したゲスト物理アドレスのサイズを意味しますか?
- この例では、ゲスト物理メモリが4094(0x1000)で始まるのはなぜですか、0から始まらないのはなぜですか?メモリレイアウトやプロセスがある場合は、説明するか、タスクリンクを提供してください。
答え1
このスロットの目的は何であり、CPUの電源を入れたときに表示される物理メモリの物理スロットに似ていると仮定できますか?
これはメモリマップです。実際のメモリスロットとは何の関係もありません。
シングルスロットの最大メモリ制限はありますか?そうでない場合、複数のスロットを持つユースケースは何ですか?
ホストで利用可能なもの以外に制限はありません。 KVMの各メモリ「スロット」は現在、異なる属性を持つことができるため、マルチスロットが便利です。現在のスロットに関連付けられているマッピングは、そのまま(透明)、ログ書き込み、または読み取り専用にすることができます。
また、顧客の観点から見ると、このようにマッピングされたメモリスロットは、「物理的」メモリと共に使用するためのものです。メモリマッピングされたI / Oのアドレス空間はメモリスロットにマッピングされません。つまり、連続していない物理メモリとインターリーブされたMMIO領域を持つ一般的なアドレス空間には、これを表すために複数のスロットが必要です。
メモリサイズはユーザー空間コードのサイズを意味しますか、それとも私たちが要求したゲスト物理アドレスのサイズを意味しますか?
これはメモリマップのサイズです。memory_size
バイトは物理アドレスguest_phys_addr
(ゲストの視点)から始まり、メモリのリニアアドレスuserspace_addr
(ホストの視点)を使用してゲストメモリにマッピングされます。
この例では、ゲスト物理メモリが4094(0x1000)で始まるのはなぜですか、0から始まらないのはなぜですか?メモリレイアウトやプロセスがある場合は、説明するか、タスクリンクを提供してください。
これは例で説明されています。
初期状態の場合、このコードをゲストの「物理」メモリの2番目のページにプリロードします(存在しないメモリとの競合を避けるため)。リアルモード割り込み記述子テーブルアドレス0)。