1580, 1/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 : 7187     Date : 2012/07/05 09:48



    
show1546 강의 정말 감사합니다. 제가 요즘 버퍼오버플로우 공부를 하고 있습니다. 이 분야 공부에 도움이 많이 될것 같습니다. 필기하고 갑니다 ㅎㅎ 시간이 좀 걸렸네요 필기하면서 보다보니! 정말감사합니다! 2012/07/17  
     [공지] 강좌를 올리실 때는 말머리를 달아주세요^ㅡ^ [29] 멍멍 02/27 18448
1579   리눅스 커널 2.6 버전 이후의 LKM     jdo
07/25 379
1578   쉘코드 모음     해킹잘하고싶다
01/15 1156
1577   Call by value VS Call by Reference     해킹잘하고싶다
01/15 620
1576   (꼼수) L.O.B 한방에 클리어하기[1]     해킹잘하고싶다
01/14 864
1575   towelroot.c (zip) 코멘팅.[1]     scube
08/18 3373
1574   levitator.c (안드로이드 루팅) 공격 분석 소스 코드 공유.[4]     scube
08/17 3367
1573   무료 정보보안 기술인재 양성 과정 교육생 모집     chanjung111
06/17 4123
1572   K-Shield 주니어 5기 모집     lrtk
06/17 3894
1571   [팁] 파이썬 2소스를 3으로 변경해주는 사이트[3]     한승재
05/13 3578
1570   구글 백링크 작업 질문요     wkatnxka
03/30 3074
1569   [팁] 우분투 미러링서버     한승재
03/09 3723
1568 비밀글입니다  감을못잡겠네요ㅜㅜ     잉잉잉
01/15 3
1567   데비안 계열 리눅스 의존성 깨졌을때 해결법     한승재
11/27 4205
1566   홍보합니다. 신생 보안커뮤니티입니다.     kimwoojin0952
10/26 3950
1565   신기한 프로그래밍 언어[3]     koreal33t
09/06 4349
1564   윈도우,리눅스에서 내 ip를 확인해 보자 [1]     koreal33t
09/06 3559
1563   CTF 사이트[1]     koreal33t
09/06 4190
1562   자격증 (문제)사이트 [2]     koreal33t
09/06 4008
1561   [퍼온글]리눅스 기본 명령어     한승재
06/06 4774
1 [2][3][4][5][6][7][8][9][10]..[79]

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