|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2034 [복사]
이번 장은 메모리 영역에 대해서 알아보도록 하겠습니다.
메모리 영역은 1장에서 설명한 linker command file에 의해서 설정된다.
개발자는
- 현재 실행 파일이 구동될 system의 물리적인 memory는 어떻게 구성되어 있는지
- Build될 코드와 변수, stack과 heap은 어떻게 실제 memory에 할당을 할 것인지
를 linker command file에 정해진 문법에 따라서 정의하고,
이것을 linker의 입력으로 던져 주게 된다.
Linker는 전달받은 linker command file을 해독하여서,
필요한 address를 계산하고 할당한다.
이것을 Compile time(또는 Build time) memory allocation 이라고 한다.
Dynamic memory allocation을 제외한 c code 상의 모든 코드와 변수들의
address는 이처럼 linker에 의해서 build time에 결정이 되며,
linker command file은 build time memory allocation을 위해
필요한 정보를 linker에 주는 역할을 한다.
Note:
malloc과 같은 dynamic memory allocation은
run time memory allocation이라고 부른다.
대부분의 Compiler Tool Chain에서 다음과 같은 default 영역이 정의되어 있으며,
특별한 지시가 없는 경우 c code는 아래와 같은 default 영역에 할당이 된다.
(Tool Chain마다 이름은 약간씩 다를 수 있지만, 기본적인 개념은 동일함)
# code(또는 text) 영역
- compile된 instruction(machine code)가 저장되는 영역
# data 영역
- 초기화된 전역 변수가 할당되는 영역
# bss 영역
- 초기화되지 않은 전역 변수가 할당되는 영역
# stack 영역
- 함수 call 시에 사용되는 snapshot/context 저장을 위한 영역
지역변수 또한 stack에 할당이 됨
# heap 영역
- malloc에 의한 dynamic memory allocation을 위한 영역
linker command file은 이러한 영역을 실제 memory의 어떤 부분에
설정을 할 것인지 linker에 알려준다.
예를 들면,
code 영역은 0x100000 번지부터 1Mbyte,
data 영역은 0x200000 번지부터 2Mbyte,
bss 영역은 0x300000 번지부터 512Kbyte,
stack영역은 0x400000 번지부터 512Kbyte,
heap 영역은 0x500000 번지부터 2Mbyte,
와 같이 개발자가 원하는 데로 지정이 가능하다.
linker는 이러한 linker command file을 참조해서,
해당 영역으로 코드 및 변수들을 할당하고,
접근(access, 즉 read/write)에 필요한 절대적인 address를
계산하여 기계어(Machine Instruction)에 필요한 어드레스를
코드상에 심어주게 된다.
이번 장에서는 compiler/linker가 어떻게 memory에
변수 및 코드를 할당하는지 알아보았습니다.
이번 강의를 통해서 큰 개념만 잡고,
나중에 구체적인 coding/debugging을 하면서,
실제 변수와 코드의 memory 주소를 한번 따라가 보시면,
조금 더 그 실체를 이해할 수 있습니다.
다음 장에서는 구체적인 예제 code를 통해서
실제 변수들이 어떻게 memory에 할당이 되는지 알아보겠습니다.
Best Regqrds,
Wolverine
|
Hit : 9515 Date : 2012/07/05 09:48
|