4

KVMを使用して仮想マシンで実行されるゲストオペレーティングシステムでカーネルモジュールを作成しています。ここでは、特定の物理アドレスにメモリページを割り当てたいと思います。kmalloc()はメモリを提供しますが、OSによって選択された物理アドレスにあります。

背景:ゲストがデバイスと通信するときに終了しないデバイスエミュレーション手法をqemuで作成しています(たとえば、I / Oマップデバイスやポートマップデバイスで終了します)。基本的な考え方は次のとおりです。ゲストデバイスドライバーは、特定の(ゲスト)物理メモリアドレスに書き込みます。qemuプロセスのスレッドは、新しいデータをチェックするために継続的にポーリングします(いくつかのステータスビットなどを介して)。そして、出口を発生させることなく、それに応じて行動を起こします。ゲストがデバイスドライバーによって使用されているアドレスをホストに通知する(既存の)方法がないため、事前に指定されたメモリページをホストに割り当てる必要があります。

4

2 に答える 2

6

特定のアドレスにメモリを割り当てることはできませんが、 を使用して起動時に特定の物理アドレスを予約できますreserve_bootmem()。起動の早い段階で呼び出すreserve_bootmem()と (もちろん、変更されたカーネルが必要です)、予約されたメモリがバディ システム (つまりalloc_pages()、より高いレベルの友人kmalloc()) に渡されないことが保証され、そのメモリを任意の目的に使用できるようになります。 .

于 2011-11-09T22:37:08.930 に答える
0

ブート時に QEMU BIOS がゲスト カーネルに渡すメモリ マップに物理メモリ範囲を確保することで、これを反対側から攻撃する必要があるようです。

于 2011-11-13T11:54:37.957 に答える