1577, 79/79 회원가입  로그인  
   wolverine
   [자작] C 강좌 [2] - Memory Allocation

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&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 : 6549     Date : 2012/07/05 09:48



    
show1546 강의 정말 감사합니다. 제가 요즘 버퍼오버플로우 공부를 하고 있습니다. 이 분야 공부에 도움이 많이 될것 같습니다. 필기하고 갑니다 ㅎㅎ 시간이 좀 걸렸네요 필기하면서 보다보니! 정말감사합니다! 2012/07/17  
17   < 리눅스 참조 가이드 > 1     사용중
08/02 6562
16   #01 Protel CAD - 서문     아이프리드
11/21 10100
15   완벽하게 파일을 지우는 방법     koresong
10/18 8884
14   리눅스(9) 리눅스 명령어 1~8     사용중
08/02 7685
13   네 트 워 크 강 좌[17]     소유
10/05 17265
12   노즈의 해커스쿨 ftz게임탐방기 LEVEL 2 !! [2]     xownsdk2
08/02 7108
  [자작] C 강좌 [2] - Memory Allocation[1]     wolverine
07/05 6548
10   [자작] 1. c 언어는 무엇인가(1)[1]     whdgusdl1220
08/16 6642
9   tseug의 네트워크에 관한 이야기 (IP) [1][6]     tseug
11/04 6757
8   해킹기법? (기발하다고 해야하나,웃기다고 해야하나)[35]     whqkdnf000
07/31 11755
7     C언어3-메모리와 변수(추가용어)     sihun1113
05/01 5792
6   웹 해킹에대해서 알아보자 (5)[2]     사용중
08/03 8201
5   웹 해킹에대해서 알아보자 (4)      사용중
08/03 7433
4   ;cat 을 사용하는 이유 .[3]     bugfixer2
05/18 9702
3   < 리눅스 참조 가이드 > 4     사용중
08/02 6826
2   리눅스(9) 리눅스 명령어 6. 압축/해제[2]     사용중
08/02 7094
1   버퍼오버플로우 왕기초편 pdf 파일 어디서 구할 수 있나요?     duduwon
02/08 9014
[1]..[71][72][73][74][75][76][77][78] 79

Copyright 1999-2022 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com