- Published on
메모리 영역(Code, Data, BSS, HEAP, Stack), Little Endian, Stack 의 이해
- Authors
- Name
- JaeHyeok CHOI
- 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);
}