問題タブ [virtual-address-space]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
memory-address - 仮想アドレスと物理アドレスの違いは?
次の例に基づいて、仮想アドレスと物理アドレスの違いを説明してください。ここで具体的に使用されているアドレスと、同じ場所で他のアドレスを使用する方法を説明してください. また、この 2 つを常に区別するにはどうすればよいでしょうか。
コード:
&a
両方のステートメントで、どのアドレスが参照されていますか?
paging - 仮想アドレス、仮想メモリ、およびページングについて
私はこれらのトピックを学んでおり、多くの記事や本を読んでいますが、それらには補完的な情報が欠けていて、さらに混乱しました. そこでここで、私が質問をしている間に私が知っていることを説明したいと思います。このトピックが私のような多くの人にとって役立つことを願っています。また、必要に応じて、自分の知識の有効性と修正を学びたいと思います。
仮想メモリ
一部の記事では、「仮想メモリは、物理メモリをエミュレートするハードディスクの一部の領域であり、実際よりも多くのメモリを使用できるようになっています。」と書かれています。他の記事では、「仮想メモリは物理メモリ (RAM) の組み合わせであり、物理メモリとページ テーブルのように機能するハードディスクのセクションです」と書かれています。しかし、それらは異なるものであり、なぜそのような異なる説明があるのか わかりません。
ウィキペディアが仮想メモリを説明する方法でもあるため、2番目の説明に進みましょう。この時点で、物理メモリではなく仮想メモリのアドレスを直接使用するため、仮想アドレスは理にかなっています。
ところで、私の Mac は 8GB の物理メモリと 8GB の仮想メモリを搭載していると言っています。この場合、VM には物理メモリが含まれますか、それともメモリとして使用される HD の容量ですか? プログラム用に 16GB のメモリを使用できますか?
質問1:
Intel i5 には 36 ビット アドレス バスがあり、これは 64GB メモリをアドレス指定できることを意味します。コンピューターに 4GB の RAM をインストールしたとします。ただし、メモリのサイズが異なる多くの異なるシステムで使用されるため、私のプログラムはインストールされているメモリのサイズを認識していない場合があります。ここで、仮想メモリが便利になります。インストールされているメモリの実際のサイズを抽象化します。
しかし、プログラムがメモリ アドレス 0xFFFFFFFFFF にアクセスしたい場合はどうなりますか? 4GBしかインストールされておらず、おそらくHDにメモリスペースがあります。
この質問には2つの理論があります。
1.ページ テーブルは OS によって維持されるため、OS はそのアドレスをデコードし、ページ テーブル内のそのページをチェックして、物理アドレスが関連付けられているかどうか (有効フラグと無効フラグ) を確認します。次に、ページエントリが指す物理メモリ内の物理アドレス + 仮想アドレスで定義されたオフセットに移動し、その値を取得します。そうしないと、ページ フォールトが発生し、OS はセカンダリ ストレージでそのページを探し、フェッチしてメモリに配置し、ページ テーブルを更新します。
2. OutOfMemory タイプの例外をスローします。これは、指定されたアドレスがアドレス指定できるメモリがないことを示しています。
最初の理論の欠点は、プログラムが 64 GB のメモリを使用したい場合に何が起こるかということです。次に、4GB しかないため、HD に 60GB のメモリ容量が必要です。ただし、下のスクリーン ショットでは、MAC は 8GB の仮想メモリしかないことを示しています。
質問2:
プロセスはどのように仮想メモリに配置されますか? つまり、各プロセスには 0x0 - 0xFFFFFFFFF の仮想メモリ空間があり、すべてのプロセスが配置される仮想メモリ アドレス空間は 1 つしかありません。
各プロセスがすべてのメモリを利用できると仮定すると、メモリは次のようになります。
仮想メモリの概念が 1 つしかない場合、次のようになります。
ページテーブル
したがって、ページテーブルは、物理アドレスと仮想アドレスの間にあるデータ構造です。これは、各ページ (キー) に関連付けられた物理アドレス (値) がある連想配列 (または辞書のようなもの) です。
OS は MMU (メモリ管理ユニット) を使用して、この仮想アドレスから物理アドレスへの変換を実行します。
質問 3:
すべてのプロセスのすべてのページを含む 1 つの巨大なページ テーブルがありますか、または各プロセスに独自のページ テーブルがありますか?
ページング
ページングはメモリ管理方法です。仮想メモリと物理メモリは、メモリ管理ユニットによってページ (固定で同じサイズのブロック) に分割されます。この手法は、メモリとセカンダリ ストレージの間でページをスワップして、それらの間でページをスワップできるようにする場合に役立ちます。たとえば、プログラムはアドレスにあるデータを要求します。ただし、プログラムが使用しているアドレスは仮想アドレスであり、MMU はページ テーブルを使用してそれを変換します。この間、MMU は要求されたものがページ テーブルに存在するかどうかをページ テーブルでチェックし、存在しない場合は OS がセカンダリ ストレージから取得してページ テーブルを更新します。
質問 4:
プロセスがアドレスからのデータを要求し、そのアドレスがすでにデータを持っている物理アドレスに変換されたとします。データがリクエスタ プロセスに属しておらず、2 次ストレージにあるデータに置き換える必要があることは、どのようにしてわかりますか?
たとえば、そのページをハードディスクに書き戻すかどうかに使用されるダーティビットがありますが、所有者プロセスを決定するものではないと思います。
windows - 異なる地域は同じ割り当てアドレスを持っています
Windows 7 のプロセスのアドレス空間を調べます。VirtualQueryEx
関数を使用します。これは私の例handleOfProcess_
の一部です。プロセスのハンドルは次のとおりです。
デバッグを行うと、AllocationBase
0x00020000が0x00020000であり、Allocationbase
0x00021000が0x00000000であることがわかります。これはallocationBase
別の領域です。
どうすれば起こりますか?
ありがとうございます。
c++ - PE イメージ内のすべての仮想アドレス (VA) を相対 VA にマップする方法
Win32 C++ API を使用して、(プロセスのメモリに読み込まれた) モジュールのイメージをバッファーに読み込みたいと考えています。読んだ後、すべての VA をバッファーから RVA に変更したいと考えています。
ImageRvaToVa
MSDN で関数を見つけましたが、リバース マッピングが必要です。つまりImageVaToRva
、特定のイメージ内のすべての VA に適用する必要があります。しかし、そのような機能やそれに類似したものは見つかりませんでした。そのような機能は Win32 に存在しますか?
私がやりたいことを行う1つの方法.reloc
は、画像のセクションを解析することです。ただし、これを行う簡単な方法は見つかりませんでした。セクションを簡単に解析できる Win32 API 関数はあります.reloc
か?
この問題を解決するためのアプローチに関する他の提案をいただければ幸いです。
windows - PE header and LARGEADDRESSAWARE not evaluated for DLL modules?
In the PE header there's a flag to indicate whether the binary is LargeAddressAware or not.
The PE header itself exists for both, *.exe and *.dll.
Is it really the case that Windows OS evaluates this flag for the parent executable, only?
Is it completely ignored for all DLL modules?
So why should i enable the LAA linker flag for DLLs if nobody is evaluating it?
I was having the following in mind:
Is there a way to force Windows issue a warning in case a LAA enabled exe loads a module that is not compiled as being LAA?
Also see related question: Drawbacks of using /LARGEADDRESSAWARE for 32 bit Windows executables?
architecture - 32 v/s 64 ビット アーキテクチャ - 仮想アドレス空間
私は OS コースに参加しており、インストラクターは 32 v/s 64 ビット アーキテクチャについて言及しています。
私のアーキテクチャクラスとのこの違いについての私の理解は、32 ビット対 64 ビットが CPU ワードサイズ、レジスタサイズ、および ALU が計算を実行できるサイズを示しているということです。
インストラクターは、「現在、64 ビット アーキテクチャが使用されているため、プロセスの仮想アドレス空間のサイズは 64 ビットです」と述べています。
32 ビット v/s 64 ビットは、プロセスの仮想アドレス空間サイズが 32 ビット v/s 64 ビットであるかどうかも示しているかどうかを尋ねたいですか? そうでない場合、アーキテクチャの種類 (32 ビット / 64 ビット) に対する仮想アドレス空間のサイズの依存関係はありますか。
windows - x86 LargeAddressAware 互換性の単体テスト
win32 実行可能ファイル (x86) の場合、LargeAddressAware フラグを設定して、x64 Windows での実行時に (2 GB だけでなく) 4 GB の仮想アドレス空間にアクセスできるようにします。
これは非常に魅力的に見えます。ただし、リスクは伴います。
たとえば、次を参照してください: 32 ビット Windows 実行可能ファイルに /LARGEADDRESSAWARE を使用することの欠点?
それでは、システム全体のレジストリ スイッチを に設定して、いくつかの単体テストを実行するシステムを構成してみましょう。
それでいいはずですよね? AllocationPreference
MEM_TOP_DOWN
そうではありません!
問題は、Visual Studio の x86 "テスト ランナー" (実行エンジン) 自体が LAA 対応になっていないことです。
この親プロセスは、「下位」の 2 GB の VAS のみを認識し、テスト対象のモジュールも認識します。
VS2013.1 の例
mstest.exe
スポーンQTAgent32.exe
vstest.console.exe
スポーンvstest.executionengine.x86.exe
それらはすべてLAA 対応ではありません。
では、LAA が有効な x86 テスト ランナーを使用する推奨される方法は何ですか?
LAA 実行環境を確認するための小さなコード スニペット (VS 単体テスト、csharp) を次に示します。
成功しない限り、テスト環境は単体テストのセットを (また) LAA との互換性をカバーするのに適していません。
windows - アドレス空間のプライベート領域にゼロバイトが多いのはなぜですか?
ウィンドウの下のプロセスのアドレス空間を調べています。プライベート リージョンのコンテンツを見ると、0 バイトが非常に多い (一部のリージョンでは 95% 以上) ため、疑問に思います。アプリケーションの実行中に使用されないプライベート リージョンが増える場合、それらが予約済みまたは無料ではないのはなぜですか?
ありがとうございます。