11

これは、OSクラスの仮想メモリと物理メモリの概念について聞いた日から、非常に基本的な質問です。これで、ロード時とコンパイル時では、仮想アドレスと論理アドレスバインディングスキームは同じですが、実行時には異なります。

まず第一に、コンパイル時とロード時に仮想アドレスを生成することが有益である理由と、アンパサンド演算子を適用して変数のアドレス、単純なデータ型、ユーザー定義型、および関数定義アドレスを取得すると何が返されるのでしょうか。

また、OSは、仮想アドレスから物理アドレスに正確にマッピングする方法を教えてください。これらの質問は好奇心から生まれたものであり、現代のOSを考慮したいくつかの優れた深い洞察が欲しいです。

4

2 に答える 2

4

アプリケーションレベル(Linuxアプリケーションプロセスなど)では、仮想アドレスのみが存在します。ローカル変数はスタック上(またはレジスター内)にあります。スタックは呼び出しフレームで編成されます。コンパイラは、現在の呼び出しフレーム内のローカル変数のオフセット、通常はスタックポインタまたはフレームポインタレジスタを基準にしたオフセットを生成します(したがって、ローカル変数のアドレスは、たとえば再帰関数では、実行時にのみ認識されます)。

詳細を理解するために、デバッガーで再帰関数を段階的に実行し、gdbローカル変数のアドレスを表示してみてください。btのコマンドも試してくださいgdb

タイプ

cat /proc/self/maps

そのコマンドを実行するプロセスのアドレス空間(および仮想メモリマッピング)を理解するため。cat

カーネル内では、仮想アドレスから物理RAMへのマッピングは、ページングを実装してMMUを駆動するコードによって行われます。一部のシステムコール(特にmmap(2)など)は、プロセスのアドレス空間を変更する可能性があります。

Some early computers (e.g. those from the 1950-s or early 1960-s like CAB 500 or IBM 1130 or IBM 1620) did not have any MMU, even the original Intel 8086 didn't have any memory protection. At that time (1960-s), C did not exist. On processors without MMU you don't have virtual addresses (only physical ones, including in your embedded C code for a washing-machine manufacturer). Some machines could protect writing into some memory banks thru physical switches. Today, some low end cheap processors (those in washing machines) don't have any MMU. Most cheap microcontrollers don't have any MMU. Often (but not always), the program is in some ROM so cannot be overwritten by buggy code.

于 2013-03-27T08:24:15.047 に答える
4

物理アドレスは、ソフトウェアではなくハードウェアで発生します。考えられる/時折発生する例外は、オペレーティングシステムカーネルにあります。物理的とは、システムバスとRAMチップが認識するアドレスであることを意味します。

物理アドレスはソフトウェアにとって役に立たないだけでなく、セキュリティの問題になる可能性があります。アドレス変換なしで任意の物理メモリにアクセスでき、他のプロセスのアドレスを知っていると、マシンに自由にアクセスできるようになります。

とは言うものの、小型または組み込みのマシンには仮想メモリがない可能性があり、一部の古いオペレーティングシステムでは、共有ライブラリで最終的な物理メモリの場所を指定できました。このようなポリシーはセキュリティを損ない、廃止されました。

于 2013-03-27T08:24:41.170 に答える