검색어 입력폼

[공학]heap 영역 출력

저작시기 2006.04 |등록일 2006.12.21 파일확장자압축파일 (zip) | 6페이지 | 가격 1,500원

소개글

메모리 구조인 HEAP 영역을 출력하는 방법과 HEAP 영역을 출력한 소스입니다.
설명 DOC 문서가 6페이로 따로 첨부되어있구요. 실행환경은 리눅스입니다.
사용언어는 C입니다.

목차

과제 개요
과제 배경 지식
과제 접근방법&구현설명
프로그램 소스
실행화면

본문내용

☞ 과제 개요

초기화된 데이터와 (initialized data) 초기화안된 데이터 (uninitialized data : bbs) 와 HEAP 메모리 영역에 각각의 변수가 설정되도록 프로그래밍 하여 실제 데이터와 HEAP 영역의 내용을 파일로 쓰고 해당 파일을 octal dump 받도록 한다.


☞ 과제 배경 지식
● C프로그램의 기억 장소 배치
프로세스가 필요로 프로그램을 실행할 때 필요한 공간을 프로세스 메모리라고 하는데 아래와 같은 형태를 갖추고 있다. 개개의 프로세스 마다 단독의 메모리를 사용하는 것 처럼 하기 위해서 Virtual Memory 방식이다. 각 부분별 용도를 살펴 보자.

프로그램 실행시 입력하는 Command-line에 Arguments 와 환경변수가 저장되는 곳은 virtual 메모리 가장 상단이다.

Stack : function call 과 관계된 영역이다. 프로그램상에서 어느 function 을 call하게 되면 ( frame pointer, return address, parameter, local Variable, Stack point) 값이 저장되는 곳이다. Stack point 는 low address로 향한다.

Heap : 동적 메모리 할당 공간이다. 프로그램 실행 도중에 필요로 하는 메모리 공간을 위해 예비로 마련해 두는 곳이다. Heap의 포인터는 high address로 향한다.
Ex) malloc, calloc

DATA : Uninitialized Data 영역과 Initialized Data 영역으로 나뉜다.

Uninitialized Data : 초기화 안된 전역변수가 저장되는 곳이며 프로그램이 실행되기 전에 0으로 초기화 된다. BBS라 불린다.

Initialized Data : 프로그램에서 특별히 초기화되는 변수들이다. 전연변수라도 초기화되어 있으면 이곳에 저장된다.

Text : 프로그램의 본체이다. 이곳은 각종 코드와 읽기 전용 코드로 구성되어 있으며 이곳에 잘못 접근하게 되면 ( Segmentaion Fault ) 로 프로그램이 종료된다.

Stack과 Heap가 Free한 영역이 된다. Stack과 Heap과 Free 부분을 제외하고는 Read만 된다고 보면된다.


☞ 과제 접근방법&구현설명

1. DATA 영역의 시작주소 찾기

1) 외부변수 이용하는 방법
Extern 변수, 즉 외부변수는 현재 파일 밖에 정의되어 있을 때 선언하는 것이다. 이 외부변수가 시작주소를 찾는데 도움을 주는 외부변수는 메모리의 TEXT 영역 마지막 페이지에 저장된다는 것이다. TEXT 영역 위가 dump 받길 원하는 DATA 영역이 므로 외부변수 주소값에 해당 시스템의 페이지 크기를 더하면 되는 것이다. 그러나 외부변수가 복수개이면 TEXT의 맞지막 페이지 영역에 저장되는 변수가 무엇인지 보장할 수는 없으므로 주의해야 한다.

l Main 함수 밖에 외부변수 선언
extern type text;
l 해당 시스템의 페이지 크기를 알아낸다.
name이 _SC_PAGESIZE 일경우 페이지 크기를 리턴한다.
#include <unistd.h>
long sysconf(int name);

2) ELF Header 를 이용하는 방법
ELF 해더는 오브젝트 파일에서 고적된 위치를 가지는 섹션이다. ELF는 항상 파일에 첫
부분에 위치하게 된다. 이 같은 성질을 이용하면 된다.
그러나 이번 프로그램에서는 위 1의 방법을 사용하였다.


2. HEAP 영역의 종료주소 찾기

Data segment size를 변경해주는 sbrk 명령어를 이용하면 된다. Data space의 크기를 증가시킬 때 쓰는 명령으로 increment 값을 0으로 주면 본래 찾고자 하던 Heap 영역의 종료 주소가 리턴되게 된다.
다운로드 맨위로