2017-03-21 18 views
0

私は以下のリンクを見てきましたが、ほとんどのオペレーティングシステムでは、ポインタは物理アドレスではなく仮想アドレスを格納していますが、仮想アドレスをポインタに格納する利点は得られません。物理アドレスではなくポインタに仮想アドレスを格納する利点は何ですか?

最終的に特定のメモリ位置の内容をポインタで直接変更することができるので、仮想アドレスか物理アドレスかの問題は何ですか? また、コードが実行されている間、ほとんどの場合、データセグメントもメモリに残ります。そのため、物理メモリの場所のみを扱うので、仮想アドレスはどのように役立ちますか?

C pointers and the physical address

+0

現時点で私のデスクトップのクロム、見通し、MSVCがお互いの物理メモリにアクセスしていたのはかなり悪いことです。 – StoryTeller

+1

これは、オペレーティングシステム上のプロセス分離を使用したユーザー空間アプリケーションで仮想メモリ*がどのように動作するのかを示しています。それはどういう意味ですか? –

+2

このリンクには? –

答えて

1

実際には、ポインタには通常LOGICAL ADDRESSESが入ります。メモリ管理の

  1. やすさ:

    には、論理アドレス指定使用するためのいくつかの理由があります。 OSは、連続した物理ページフレームをプロセスに割り当てる必要はありません。

  2. セキュリティ。各プロセスは、それ自身の論理アドレス空間にアクセスすることができ、別のプロセスのアドレス空間を混乱させることはできません。

  3. 仮想メモリ。論理アドレス変換は、仮想メモリを実装するための前提条件です。

  4. ページ保護。システムページへのアクセスをより高いプロセッサモードに制限することでセキュリティを強化します。ページへのアクセスの種類を制限することでエラー(およびウイルス)のトラッピングを支援します(たとえば、データページへの書き込みや実行を許可しないなど)。

これは完全なリストではありません。

1

同じ仮想アドレスが異なる瞬間で異なる物理アドレスを指すことができます。

物理メモリがいっぱいの場合、データはメモリからHDDにスワップアウトされます。あなたのプログラムがこのデータに再びアクセスしたいとき、それは現在メモリに保存されていません - データはメモリにスワップされますが、しばしば前とは異なる場所になります。 仮想アドレスと物理アドレスの割り当てを格納するページテーブルは、新しい物理アドレスで更新されます。したがって、あなたの仮想アドレスは同じままですが、物理アドレスは変わることがあります。

2

セキュリティ上の問題(前述したように)さておき、もう一つの大きな利点がある:、独立してどこの

グローバルと機能(とあなたのスタックが)常に固定アドレス(そうアセンブラはそれらをハードコーディングすることができます)で見つけることができますプログラムのインスタンスがロードされます。

実際にコードを任意のアドレスから実行したい場合は、独立した位置にする必要があります(gccでは-fPIC引数を使用します)。この質問は、-fPICと仮想アドレス指定のinterresting読み取りである可能性があります。GCC -fPIC option

関連する問題