問題タブ [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.

0 投票する
6 に答える
24573 参照

c++ - 仮想メモリアドレスを物理アドレスに変換する方法は?

私の C++ プログラム (Windows 上) では、メモリのブロックを割り当てており、物理メモリ内で (つまり、VirtualAllocEx()、MapUserPhysicalPages() などを使用して) ロックされたまま (スワップされておらず、連続している) であることを確認できます。

私のプロセスのコンテキストでは、そのブロックの VIRTUAL メモリ アドレスを取得できますが、 外部デバイスに渡すために、そのブロックの PHYSICAL メモリ アドレスを見つける必要があります。


1. USER モードで、プログラム内で仮想アドレスを物理アドレスに変換する方法はありますか?

2.そうでない場合、この仮想から物理へのマッピングは KERNEL モードでのみ見つけることができます。私はそれを行うためにドライバーを書かなければならないことを意味していると思います...?私のアプリケーション (プログラム) が変換を行うために使用できる、すぐに利用できるドライバー/DLL/API を知っていますか?

3.ドライバーを自分で書かなければならない場合、どのように変換すればよいですか? どの機能を使用しますか? mmGetPhysicalAddress()ですか?どうやって使うの?

4.また、私の理解が正しければ、 mmGetPhysicalAddress() は、呼び出しプロセスのコンテキストにある仮想ベース アドレスの物理アドレスを返します。ただし、呼び出しプロセスがドライバーであり、アプリケーションを使用してその関数のドライバーを呼び出している場合、コンテキストを変更していて、mmGetPhysicalAddress ルーチンが呼び出されたときにアプリのコンテキストにいることはできません...ドライバーではなく、アプリケーション (ユーザーモード) のメモリ空間で仮想アドレスを変換するにはどうすればよいですか?

回答、ヒント、コードの抜粋は大歓迎です!!

ありがとう

0 投票する
6 に答える
9817 参照

64-bit - 互換モードで実行されている 64 ビット システムの仮想アドレス空間

64 ビット Windows OS で利用可能なユーザー仮想アドレス空間は 8 テラバイトであることがわかりました。しかし、これで実行しているプログラムが 32 ビット互換モードで実行されている場合、これほど多くのユーザー空間がまだ利用可能でしょうか? それとも、通常の 32 ビット OS のように動作し、2GB のユーザー アドレス空間しか与えませんか?

0 投票する
1 に答える
352 参照

windows - (Windows) OS の最大ユーザー モード領域をプログラムで決定するにはどうすればよいですか?

ユーザーがユーザーモード空間として設定したものをログに記録する必要がある診断アプリを作成しています.ユーザーモード仮想アドレス空間とも呼ばれます.WinXPの/ 3GBスイッチまたはVista / Win7のbcdeditの増加uservaスイッチです.

C++ または C++/CLI のどちらでもかまいません。

何か案は ?

0 投票する
5 に答える
4774 参照

windows - Windows がシステム アドレス空間用に 1Gb (または 2Gb) を予約するのはなぜですか?

Windows アプリケーションは通常、32 ビット システムで 2Gb のプライベート アドレス空間を持っていることが知られています。このスペースは、/3Gb スイッチを使用して 3Gb まで拡張できます。

オペレーティング システムは、残りの 4Gb を予約します。

私の質問はなぜですか?

カーネル モードで実行されるコード (つまり、デバイス ドライバー コード) には、独自のアドレス空間があります。排他的な 4Gb アドレス空間に加えて、オペレーティング システムが各ユーザー モード プロセスの 2Gb を予約したいのはなぜですか?

その理由は、ユーザーモードとカーネルモードの呼び出しの間の移行だと思いました。たとえば、 への呼び出しにNtWriteFileは、カーネル ディスパッチ ルーチンのアドレスが必要です (そのため、システムは各アプリケーションで 2Gb を予約します)。しかし、 を使用するSYSENTERと、システム サービス番号は、カーネル モード コードがどの関数/サービスが呼び出されているかを知るのに十分ではありませんか?

オペレーティング システムが各ユーザー モード プロセスで 2Gb (または 1Gb) を使用することが非常に重要な理由を明確にしていただければ幸いです。

0 投票する
13 に答える
55382 参照

memory - 32ビットOSが4GBのRAMをサポートするのはなぜですか?

OSについてのパデュー大学の講義でいくつかのメモを読むだけで、次のようになります。

プログラムは、メモリをアドレス0から2 ^ 32-1(0から4GB-1)までのバイト配列と見なします。

なぜ4GB?

0 投票する
2 に答える
14668 参照

point - ELF 実行エントリ ポイントの仮想アドレスが、ゼロの 0x0 ではなく、0x80xxxxx の形式になっているのはなぜですか?

実行すると、プログラムは仮想アドレス 0x80482c0 から実行を開始します。このアドレスは、プロシージャーではなく、リンカーによって作成されたmain()という名前のプロシージャーを指しています。_start

これまでの私の Google の調査では、次のような (漠然とした) 歴史的な憶測にたどり着きました。

0x08048000 はかつて、カリフォルニア州サンタクルーズのグループによって公布された *NIX から i386 への移植で、0x08048000 付近から 0x08048000 付近から下方に成長したスタックであったという伝承があります。これは、128MB の RAM が高価であり、4GB の RAM は考えられない時代でした。

誰でもこれを確認/拒否できますか?

0 投票する
3 に答える
27870 参照

windows - 32ビットWindows実行可能ファイルに/LARGEADDRESSAWAREを使用することの欠点は?

実行可能ファイルの1つは大量のメモリを使用するため、このフラグにリンクする必要があります。
しかし、なぜ1つのEXEファイルに特別な扱いをするのですか。標準化してみません/LARGEADDRESSAWAREか?

/LARGEADDRESSAWAREだから問題は、あなたがそれを必要としないとしても、使用することに何か問題がありますか?すべてのEXEファイルの標準として使用してみませんか?

0 投票する
2 に答える
3501 参照

function - アセンブリで関数の仮想呼び出しアドレスを見つけるにはどうすればよいですか?

私はグーグルで検索しましたが、正しい質問をしているのかどうかわかりません。また、リンクが役立つかもしれません。

メッセージ ボックスを表示する C++ プログラムを作成し、それを Ollydbg で開き、MessageBoxW を呼び出す部分に移動しました。

WindowsがImportsテーブルを更新してMessageBoxWの正しいアドレスを持つように、アプリを実行するたびにMessageBoxWの呼び出しアドレスが変更されます。だから私の質問は、インポートテーブルへの MessageBoxW の仮想アドレスを見つける方法と、これを ollydbg で使用する方法です。

基本的に、アセンブリにコード ケーブを作成して MessageBoxW を再度呼び出そうとしています。16 進エディタで実行可能ファイルを検索して、呼び出しの位置を見つけ、仮想アドレスを見つけたと思います。しかし、その仮想アドレスを olly で呼び出して実行可能ファイルに保存すると、次にそれを開いたときに、呼び出しが一連のDB xyz(仮想アドレスのように見えたが、なぜcall削除されたのですか?

私はこれに慣れていないため、用語がオフになっている場合は申し訳ありません。何と呼ぶべきかよくわかりません。

0 投票する
2 に答える
447 参照

assembly - 組立指示書

同じ.exeファイルを分解するたびに、同じ命令が同じアドレスにあるのはなぜですか?そして、それは何のアドレスですか(RAM?HDD?仮想?)?

0 投票する
2 に答える
2796 参照

ram - 純粋なセグメンテーション

私の頭の中には常に仮想メモリのアイデアが存在していたため、純粋なセグメンテーションについて少し混乱しています。

しかし、私が理解しているように、純粋なセグメンテーションは、すべてRAMにロードされたセグメントに分割された仮想アドレス空間も想像しています。

セグメンテーションを使用した仮想メモリとの違いは、RAM にないセグメントが存在する可能性があることです。

これは正しいです?

質問を追加します: ページングと組み合わせたセグメンテーションと 2 レベルのページングの間に実際的な違いはありますか? セグメント メソッドの「制限」保護を除いて同じです。それとも別の違いがありますか?