1

私はUEFIでいくつかの実験を行っていますが、仮想アドレス指定に頭を悩ませることができませんでした..

文字列「CatsAreAwesome」を含む uefi アプリケーションを作成しました。その文字列の仮想アドレスをアプリケーションに出力させます。実行ごとに異なるため、ここでは特定の例を 1 つ取り上げます。コードは、文字列が仮想アドレス 0x120ac3c0 にあることを出力します。VM を一時停止して vmem ファイルをスキャンすると、アドレス 0x1209e410 と 0x12ab000 に文字列の 2 つのインスタンスが見つかります

UEFI で getmemorymap を呼び出すと、これら 2 つが該当するメモリ セクションは次のようになります。

TYPE                     PhysStart        PhysEnd     VirtStart      VirtEnd
EfiConventionalMemory    1209C000       120A4000          0             8000
EfiLoaderCode            120A4000       120B1000          0             D000

翻訳の仕組みがわかりません。これらの 2 つのセクションの仮想開始は 0 です。これは ID がマップされていることを意味していると思いますが、仮想アドレスと物理アドレスが一致していないため、明らかに正しくありません。誰かが翻訳がどのように機能しているかを説明してもらえますか? 仮想から物理、またはその逆にどのように移行しますか?

私のアプリケーションは文字列を出力し、メモリマップを収集するので、アプリケーションの実行中にマップが収集されました。その後、アプリケーションはユーザー入力を待ちます。この間 vm を一時停止したため、アプリケーションの実行中に物理アドレスが検出されました。

4

2 に答える 2