Published on

메모리 영역(Code, Data, BSS, HEAP, Stack), Little Endian, Stack 의 이해

Authors
  • avatar
    Name
    JaeHyeok CHOI
    Twitter
    none

Code 영역 : 함수, 제어문, 상수 / 함수에 대한 기계어 코드가 들어감.

Data 영역 : 전역 변수 / 초기 값이 있는 전역변수, 배열, static으로 선언된 변수

BSS 영역 : 전역변수 / 초기값 없는 전역변수, 배열, static으로 선언된 변수

HEAP 영역 : 동적할당 / 동적할당(malloc)으로 할당된 변수가 들어감

STACK 영역 : 지역변수 / 블록 내에서 할당된 변수가 들어감

Code
Data
BSS
HEAP
STATCK

Compile time에 크기가 결정되고 이후로는 변경되지 않는다.

runtime에 BSS와 HEAP 사이를 기준으로 해서 heap은 아래로 순차적으로 메모리를 사용하고 stack은 위쪽으로 순차적으로 메모리를 사용한다.


  • 프로그램을 작성하면 code 영역이 늘어남.
  • stack(지역변수)을 프로그램 하면서 얼마나 사용할 지 미리 계산할 수 없다. 그래서 stack 함수의 뒷 부분에서 부터 변수의 주소가 매겨진다.(code는 0에서 stack FFFFFFFF 까지 메모리 값을 가진다. - 반드시 STACK이 FFFFFFFF 부터의 주소를 가지는 게 아니라 그 근처에서 메모리 값을 가진다.)
  • compile time에 code, data, bss는 크기가 결정되며 고정된다.
  • run time 때 Heap과 stack의 메모리 사용이 결정되는데 heap은 bss와의 경계에서 아래로 stack은 끝에서 부터 위로 주소값을 메긴다.
  • hard disk에 code, data, bss가 들어있다. (실행파일 안에 -.exe)
  • 실행 파일을 실행하면 bss가 메모리에 들어가 stack 시작점을 생성하고 코드를 읽어들인다.
  • 로더 : 적제기, 로딩 (메모리에 올림.)

확인하기

#include <stdio.h>

int main()
{
	int A=0x12345678;
	int B=0x9ABCDEF0;
	char G;
	short F;
	char C;
	short E;
	int D;

	printf("&A : %08X\t &B : %08X\t &C : %08X\t\n", &A,&B,&C);
	printf("main : %08X\n", main);
	printf("printf : %08X\n", printf);
	printf("scanf : %08X\t\n", scanf);

	printf("&A : %08X\t &B : %08X\t &C : %08X\t &D : %08X\t &E : %08X\t &F : %08X\t &G : %08X\n", &A,&B,&C,&D,&E,&F,&G);
}