BINARY ( 고정 DATA ) |
CODE |
DATA | |
가변 DATA | BSS |
DATA | |
HEAP | |
... | |
STACK |
컴파일을 하고, 생성되는 BINARY에는 CODE(CPU가 어떻게 동작해야하는지 기술)와 DATA가 저장되어 있습니다.
DATA의 경우에는 위의 table에 보면 2개가 존재합니다. BINARY DATA를 가변 DATA로 복사를 진행합니다. Section copy를 하는 이유는 특정 변수값이 초기화가 되어 있어야 하는데 해당 초기 값은 BINARY에 있어서 입니다. 초기값이 있지만, 변수, 수정 가능해야 하기 때문에, DATA 영역으로 복사를 해서 사용하는 것입니다.
프로그램의 메모리 관리에는 HEAP, STACK, BSS 영역, DATA 영역이 있습니다. 각각의 영역은 다른 목적과 특성을 가지고 있습니다.
- STACK: STACK은 지역 변수와 함수 호출에 관련된 정보를 저장하는 영역입니다. STACK은 LIFO(Last In First Out) 데이터 구조로 동작합니다. 함수가 호출될 때마다 해당 함수에 필요한 지역 변수, 매개 변수, 복귀 주소 등이 STACK에 할당되며, 함수가 종료되면 그 정보들은 STACK에서 제거됩니다. STACK은 컴파일러가 자동으로 관리하며, 메모리 할당과 해제는 빠르지만 크기가 제한적입니다. 또한, STACK은 스레드 별로 별도의 STACK이 생성되며, 스레드 간에 STACK을 공유하지 않습니다.
- 지역 변수: 함수 내에서 선언된 변수로, 해당 함수 내에서만 유효합니다. 함수가 호출될 때 STACK에 할당되고 함수가 종료되면 해제됩니다.
- 매개 변수: 함수 호출 시 전달되는 인자 값들을 저장하는 변수로, 함수의 매개 변수로 사용됩니다.
- HEAP: HEAP은 동적으로 할당된 메모리를 관리하는 영역입니다. HEAP은 사용자가 직접 메모리를 할당하고 해제할 수 있으며, 할당된 메모리는 사용자에 의해 명시적으로 해제되기 전까지 계속 유지됩니다. HEAP은 크기가 동적으로 변할 수 있으며, 메모리 할당 및 해제는 비교적 느리지만, 전역적으로 접근 가능합니다.
- 동적으로 할당된 변수: 프로그램 실행 중에 필요한 크기의 메모리를 동적으로 할당하고 사용하는 변수로, 개발자가 메모리 관리를 직접 해야합니다.
- BSS 영역: BSS(Block Started by Symbol) 영역은 초기화되지 않은 전역 변수와 정적 변수를 저장하는 영역입니다. 컴파일러는 BSS 영역에 할당될 변수의 크기를 미리 알고 있으며, 이 영역은 실행 파일의 크기를 줄이기 위해 0으로 초기화되지 않은 데이터를 저장합니다. 프로그램이 시작될 때 BSS 영역의 변수들은 자동으로 0으로 초기화됩니다.
- 초기화되지 않은 전역 변수: 프로그램 전체에서 접근 가능한 변수로, 초기값이 할당되지 않아 0으로 초기화됩니다.
- 초기화되지 않은 정적 변수: 함수 내부에서 선언되었지만 static 키워드로 정적 변수로 선언된 변수입니다.
- DATA 영역: DATA 영역은 초기화된 전역 변수와 정적 변수를 저장하는 영역입니다. 컴파일러는 DATA 영역에 할당될 변수의 크기를 미리 알고 있으며, 초기값이 할당된 변수들은 DATA 영역에 저장됩니다. 프로그램이 시작될 때 DATA 영역의 변수들은 초기값을 유지하며 로드됩니다.
- 초기화된 전역 변수: 프로그램 전체에서 접근 가능한 변수로, 초기값이 할당되어 있습니다.
- 초기화된 정적 변수: 함수 내부에서 선언되었지만 static 키워드로 정적 변수로 선언된 변수입니다.
이러한 영역들은 메모리 관리와 변수의 유효 범위에 대한 이해가 필요한 프로그래밍에서 중요한 개념입니다. HEAP은 동적으로 메모리를 할당하고 해제하는 데 사용되고, STACK은 지역 변수와 함수 호출 관련 정보를 저장하는 데 사용됩니다. 전역 변수와 정적 변수는 DATA와 BSS 영역에 저장되며 초기화 여부에 따라 다른 영역에 저장됩니다.
'etc' 카테고리의 다른 글
Function and Task dumping to FSDB (0) | 2023.06.08 |
---|---|
AMBA protocol의 종류 (0) | 2023.06.07 |
구구단-C (0) | 2023.06.04 |
move git repository with history (without gerrit) (0) | 2022.11.08 |
ssh autologin fail (0) | 2022.09.24 |