Linuxカーネルはメモリを連続して割り当てていますmalloc
か?利用できる大きな部分はないが、全体として機能する小さな部分がある場合、Linuxはそれを使用しますか?
3 に答える
質問では、「連続」によって、物理メモリを参照していると想定しています。
gdb
やを使用する場合など、プロセスの実行時に表示されるすべてのアドレスaddr2line
は仮想アドレスです。物理メモリへのマッピングは内部にとどまります。
malloc
通常、システムコールではありません。これは、プラットフォーム固有のシステム コール (やなど) のラッパーmmap
ですbrk
。プロセスによって呼び出されると、呼び出し元のプロセスのメモリが拡張されます。
たとえば、malloc(40960)
4KB のページ サイズを想定して、10 ページのメモリを要求できます。メモリ管理ユニット(MMU)は、物理メモリに 10 ページをすぐには割り当てません。代わりに、呼び出しプロセスのアドレス空間に新しいエントリ (この場合は 10) が追加されます。つまり、このプロセスのページ テーブルに新しいエントリが追加されます。この仮想メモリは連続します。
ここで、後で実行中に、プロセスがこの新しく割り当てられたメモリを使用しようとするとします。その時点で、プロセスが未割り当てのメモリにアクセスしたため、ページ フォールトが発生します。その後、MMU は実際の物理ページ (4096 連続バイト) を RAM に割り当て、ページ テーブルを更新し、プロセスの実行を再開します。
したがって、40960 バイトのうち 4096 バイト (1 ページ) が物理メモリ (RAM) で連続していることが確認できますが、仮想メモリでは 40960 バイト (10 ページ) 全体が連続しているように見えます。10 ページのいずれかまたはすべてを、RAM に散在するページにマップすることができます。
仮想メモリはこれを隠し、クリーンで連続したスペースをプロセスに提供します。MMU は、ページ テーブルを使用して、仮想メモリを物理メモリにマッピングすることにより、バックエンド サポートを提供します。
割り当てられたメモリの物理マッピングは、malloc() を使用して非連続にすることができ、実際には OS の責任であると私は信じています。連続している場合とそうでない場合があります。
kmalloc() という名前の関数が頭に浮かびます。これは、連続した「物理」メモリが利用可能な場合に割り当てます。