プログラムのメモリ配置と,ヒープ・malloc・sbrk について
こんにちは、 @kz_morita です。
みかん本 で自作OSの開発を進めていくなかで学びになったメモリ周りの知識についてまとめます.
プロセスのセグメント配置について 実行されたプログラムは,メモリ上にロードされ実行されますがざっくりと以下の様な構造になっています.
.text : プログラムのうち機械語を格納するセグメント .data : プログラム上の初期化されたデータを格納するセグメント .bss : 初期化されていないデータを格納するセグメント.OS (exec) が自動で0に初期化する スタックは,関数呼び出しなどで使用され,保存される情報とともに局所変数(auto 変数) や関数の引数が置かれます.大きいアドレスから小さいアドレスの方向に向かって伸びていきます.
ヒープは,動的にメモリを割り当てる場所で,主に malloc などによりメモリ確保されるとヒープに配置されます.小さいアドレスから大きいアドレスの方向に向かって伸びていきます.
実際のセグメントを見る 実際に cpp のコードをビルドした成果物の中身を以下のコマンドで確認することができます.
$ objdump -h ./main 以下のようなセクションの情報が見れます.(.text, .data, .bss などが確認できます)
./main: ファイル形式 elf64-x86-64 セクション: Idx Name Size VMA LMA File off Algn 0 .interp 0000001c 0000000000000238 0000000000000238 00000238 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 1 .note.ABI-tag 00000020 0000000000000254 0000000000000254 00000254 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .