Linux カーネル論理アドレス空間の構成

Linux カーネル論理アドレス空間の構成

「Writing Great Code」によると、ほぼすべてのオペレーティングシステムのランタイムメモリは、次の領域で構成されています。

OS|スタック|ヒップ|リテラル|静的|ストレージ/BSS

[住所を追加して]

ユーザ空間プロセスは、様々なタイプのデータオブジェクトに対してより高いメモリ領域を使用する。

カーネル空間プロセスには、さまざまな種類のデータオブジェクトもあります。これらのオブジェクトはユーザー空間メモリ領域(スタック、ヒープなど)を共有しますか、またはオペレーティングシステム領域(ヒープ、スタックなど)に別々のサブセクションがありますか?では、どのような順序でリストされていますか?ありがとう、

ベストアンサー1

何か順番が間違っていますね。オペレーティングシステムはメモリの上にあり、32ビットカーネルでは通常3GB表示(0xC0000000)の上にあり、64ビットカーネルでは0x80000000000000000 IIRCの中間点にあります。

スタックとヒープの位置はランダムに指定されます。メインプログラムには、テキスト/データ/BSSセグメントの順序に関する実際の規則はなく、各ダイナミックライブラリにはこれらのセグメントの独自のセットがあるため、その多くはメモリに分散されています。

恐竜が地球を支配したとき(20年前)、プログラムのアドレス空間は線形(穴なし)で、順序はテキスト、データ、bss、スタック、ヒープでした。当時は動的ライブラリやスレッドはありませんでした。これらはすべて仮想メモリによって変わります。

カーネルプロセスは、アドレス空間のカーネル部分内に完全に含まれる。ユーザー部分は無視されます。これにより、カーネルはカーネルスレッド間のコンテキスト切り替え速度を向上させることができる。これは、すべてのプロセスがページテーブルの同じカーネル部分を共有するため、ページテーブルを更新する必要がないためです。

おすすめ記事