私は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 を一時停止したため、アプリケーションの実行中に物理アドレスが検出されました。