2011-12-30 25 views
1

Linux x86-64環境では、プロセス全体が仮想メモリページに割り当てられていますか?プロセス全体では、テキスト、データ、bss、ヒープ、スタックを意味しますか? libcの割り込みBRKを呼び出すときメモリページにヒープが割り当てられていますか?

はまた、仮想メモリマネージャによってページを経由して管理されているカーネルに戻りメモリーしていますか?

最後に、プロセスは、他の言葉で、仮想メモリマネージャによって管理されていないヒープのメモリを取得することができ、プロセスが物理メモリへのアクセスを得ることができますか?

答えて

3

In Linux x86-64 environment, is the entire process allocated on virtual memory pages?

はい、すべてのプロセスは、仮想アドレス空間を持つ、すなわち、物理メモリのマッピングパターンに、自分のページテーブルと仮想メモリを持っています。

Also, when libc calls Brk, does the kernel returns memory that is managed via pages by virtual memory manager ?

あなたはOSのカーネルをハッキングされていない場合は、[はい、実際には、仮想メモリはあなたに対して透過的です。

can a process get memory on heap, which is not managed by virtual memory manager, in other words, can a process get access to physical memory?

あなたはあなたのプログラムがOSからのサポートなしで実行しない限り、あなたは私の知識あたりの物理メモリを管理することはできません。プロセスには独自の仮想空間があるため、メモリ管理に関連するすべての操作は仮想メモリ上にあります。

2

プロセスはプロセススレッドであるマルチスレッド処理のための(カーネルによってスケジュール)1つまたは複数のタスクを有し(非スレッドプロセスプロセスを実行中のタスクのために)、それは、アドレス空間を有しています(およびその他のリソース、例えば開かれたファイルディスクリプタ)。

もちろん、アドレス空間は仮想メモリ内にあります。カーネルはページ(例えば、ディスクのスワップゾーン)をスワップすることができます。ディスクアクセス時間が数十ミリ秒で、RAMアクセス時間がマイクロ秒の1/10になるため、ディスクへのページのスワッピングは非常に遅いです。などBSS

テキスト & メモリマッピングされた仮想メモリ・セグメントです。プロセス空間をメモリマップと考えることができます。 mmap(2)システムコールを変更する方法です。実行可能ファイルがexecveシステムコールで開始されると、カーネルはいくつかのマッピング(例えば、テキスト、データ、bss、スタックなど)を確立します。 sbrk(2)システムコールもそれを変更します。ほとんどのmallocの実装では、mmap(少なくとも十分な大きさのゾーン)と、時にはsbrkを使用します。

あなたはメモリ範囲は通常root権限を必要とmlock(2)システムコールを使用して、RAMにそれをロックすることにより、スワップ・アウトされることを回避することができます。実際にはほとんど役に立ちません(リアルタイムアプリケーションを記述しない限り)。 msyncシステムコールもあります(メモリをディスクにフラッシュする場合)。ファイルの一部を仮想メモリに(mmapを使用して)マップすることができます。mprotect(2)で保護を変更し、munmap(2)でマップを削除し、mremap - Linux特有のシステムコール、そしてあなたはSIGSEGVシグナルを捕まえてそれを(マシン固有の方法で)扱うことさえできます。 madvise(2)システムコールを使用すると、ヒントを使用してページングを調整できます。

/proc/1234/mapsファイル(または/proc/1234/smaps)を読むと、pid 1234のプロセスのメモリマップを理解できます。 (アプリケーションの中から/proc/1234/の代わりに/proc/self/を使うことができます...)私はあなたが、端末で実行することをお勧め:

cat /proc/self/maps 

あなたにそのcatのコマンドを実行しているプロセスのメモリマップを表示しますました。 pmapユーティリティを使用することもできます。

最新のLinuxカーネル(同じ入力で同じプログラムを実行しているので、2つの類似のプロセスが異なるmmapが& malloc -edアドレスを-edている)Adress Space Layout Randomizationを提供しています。それを無効にすることができます/proc/sys/kernel/randomize_va_space

1

非常にまれな状況(uClinux)を除いて、プロセスはカーネルによって物理メモリにマップされる仮想メモリだけを表示します。

カーネルには、特定の仮想アドレスに対して予測可能な物理アドレスを与える特定のマッピングを作成するように求めることができます。しかし、プロセスの分離を壊すので、適切な処理能力が必要です。

execveで、現在のマッピングは、指定されたELFファイルのロード可能セグメントに置き換えられます。参照されたページがELFファイルからロードされるようにマッピングされます(初期読み込みヘッドも実行されます)。 brkシステムコールは、スタックマップを除いた上位アドレスを数ページだけ拡張した非実行可能マッピングを主に拡張し、SIGSEGVを送信せずに、より多くの仮想アドレスにアクセスできます。

ヒープは、一般に、内部プロセスによって管理されているが、ヒープ・オブジェクトに割り当てられた仮想アドレス空間がマッピングを作成するために、予め、仮想メモリ・マネージャに知られていなければなりません。 mallocは、すでにマップされ使用可能な領域の内部テーブルを調べます。見つからない場合はbrk()またはmmap()を使用してマッピングをさらに作成します。

関連する問題