私が理解したところ、Linuxでは、プロセスローダはスタックなどのプロセスの「ヒープ」領域を自動的に作成しません。これは正しいですか?
私は/proc/$$/maps
呼び出す前にmalloc()
「ヒープ」領域がありません。
答え1
Linux はヒープセグメントとスタックセグメントの領域を「自動生成」しません。
プログラミング言語には、常にオペレーティングシステムからプログラムに制御が転送されるエントリポイントがあります。 Cでは、これがmain()
関数です。
Linuxの各プロセスには、32ビット環境では4 GB、64ビット環境では8 TBのメモリマップがあります。これは、オペレーティングシステムが処理できる最大メモリ量です。これは、システムが実際に持っている物理メモリの量とは何の関係もありません。各プロセスは、コンピュータに単独で存在するような錯覚を引き起こします。
呼び出し前に、main()
オペレーティングシステムは呼び出し元プログラムのコマンドライン要素を最初に空であったスタックの「トップ」にプッシュします。スタックセグメントはい。main()
呼び出し自体が関数の場合、渡されたパラメータはスタックセグメントにプッシュされます。
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
│ │
│ │
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘
今あなたの質問は次のとおりです
私を使用しましたが
/proc/$$/maps
、mallocが呼び出される前に「ヒープ」領域がありません。
これヒープメモリ:プロセスは、システムコールを使用して実行時に仮想malloc()
メモリの空の部分に拡張できます。これ動的にメモリ割り当て~上データ内部にヒープセグメント。したがって、最初の呼び出しの前にヒープ領域やセグメントがないことが正常ですmalloc()
。
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
├ ─ ─ ─ ─ ─ ┤
│ heap │ <- malloc()'d memory space, growing upwards
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘