メモリ管理(セグメント)

セグメント(セクション)

通常プログラムやデータはメインメモリの連続した領域を単位として管理される。
このプログラムやデータの管理単位となる連続した領域のことをセグメントと呼ぶ。

Programセクション(Pセクション)

プログラムコードが格納されるセクション。Textセクションとも呼ばれるよ。

Constセクション(Cセクション)

定数データが格納されるセクション。

Dataセクション(Dセクション)

初期値ありのグローバル変数が格納されるセクション。

BSSセクション(Bセクション)

初期値なしのグローバル変数が格納されるセクション。

以下のサンプルプログラムhello.cでの実行結果を示す。

#include <stdio.h>

int main(void)
{
        puts("hello world");
        return 0;
}

sizeコマンドやobjdumpコマンドでセクションの確認ができる。

$ gcc -c hello.c 
$ size hello.o
   text    data     bss     dec     hex filename
     89       0       0      89      59 hello.o
$ size hello
   text    data     bss     dec     hex filename
   1182     552       8    1742     6ce hello
$ objdump -h hello.o

hello.o:     ファイル形式 elf64-x86-64

セクション:
索引名          サイズ      VMA               LMA               File off  Algn
  0 .text         00000015  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000000  0000000000000000  0000000000000000  00000055  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  0000000000000000  0000000000000000  00000055  2**0
                  ALLOC
  3 .rodata       0000000c  0000000000000000  0000000000000000  00000055  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      00000035  0000000000000000  0000000000000000  00000061  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000096  2**0
                  CONTENTS, READONLY
  6 .eh_frame     00000038  0000000000000000  0000000000000000  00000098  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

プログラム実行時に必要となるメモリ量

静的なメモリサイズと動的なメモリサイズの両方を考慮する必要がある。

  • 静的なメモリサイズ(コード・データ)
  • 動的なメモリサイズ(スタック・ヒープ等)

参考

コードサイズを聞かれたら | 学校では教えてくれないこと | [技術コラム集]組込みの門 | ユークエスト株式会社