본문 바로가기

EXE 파일의 실행

1. EXE 파일의 실행

 

EXE 파일은 일반적으로 하드디스크에 기록된 하나의 파일이다. EXE 파일을 더블 클릭하면 이 파일의 내용이 메모리에 적재(load)되어 실행되는 것이다. 

 

네이티브 코드에서의 변수 참조는 데이터가 저장된 메모리 주소를 참조하는 명령어를 실행함으로써 이루어진다. 그리고 함수 호출은 프로그램의 흐름을 함수가 저장된 위치의 시작주소로 바꿈으로써 이루어진다. 

EXE 파일은 프로그램으로서 네이티브 코드의 완성된 형태지만 변수나 함수의 메모리 상의 물리적 위치까지 결정하는 것은 아니다. 윈도우와 같이 멀티 태스킹이 가능한 환경에서는 프로그램의 변수나 함수가 저장된 위치가 실행할 때마다 바뀐다. 

그렇다면 변수와 함수의 주소는 어떻게 결정되는 걸까?

 

EXE 파일에는 변수와 함수의 임시 메모리 주소가 주어져있다. 따라서 프로그램이 실행되면 이 임시 주소가 실제 메모리 상의 주소로 바뀌는 것이다. 링커는 EXE 파일의 가장 앞 부분에 메모리 주소의 변환이 필요한 부분을 나타내는 정보를 추가하는데, 이 정보를 재배치 정보라고 한다.

 

재배치 정보는 변수나 함수의 상대 주소로 되어있다. 다시 말해 기준 주소부터의 변위값(offset)으로 위치를 나타낸다는 것이다. 소스 코드에서는 변수와 함수가 다른 부분에 있더라도 링크 후에는 변수와 함수가 각각의 그룹을 이루게 된다. 변수 영역과따라서 변수의 주소는 변수 그룹의 시작주소를 기준으로 한 offset으로 나타낼 수 있다. 마찬가지로 함수의 주소는 함수 그룹의 시작주소를 기준으로 한 offset으로 나타낼 수 있다. 이는 기준 주소가 프로그램 실행 시 결정된다는 것을 의미한다.

 

링크 후의 EXE 파일의 구조를 간단히 나타내면 다음과 같다.

 

 

 

 

 

 

 

2. 스택과 힙

 

프로그램이 적재된 메모리 영역에는 재배치 정보, 변수 그룹, 함수 그룹 외에도 스택과 힙이라는 영역이 만들어진다. 스택은 지역변수나 매개변수 등을 위한 메모리 영역이고, 힙은 프로그램 실행 중 동적으로 생성되는 데이터를 위한 메모리 영역이다.

 

그런데 EXE 파일 내부에는 스택이나 힙 그룹은 없다. 스택과 힙은 EXE 파일이 메모리에 적재되어 실행되는 시점에 생성된다. 그리고 이렇게 메모리에 올려진 프로그램은 변수 영역, 함수 영역, 스택 영역, 힙 영역의 네 영역으로 구성된다. 물론  OS가 올려져 있는 영역은 따로 존재한다.

 

스택에 데이터를 저장하고 이를 정리하는 코드는 컴파일러에 의해 자동으로 생성된다. 따라서 프로그래머는 이 부분을 의식할 필요가 없다. 

예를 들어 함수가 호출되면 함수 호출 시 그 함수를 위한 영역이 할당되고 함수 호출이 끝나면 자동적으로 할당이 해제된다. 따라서 함수 호출 시 직접 메모리를 할당받고 할당을 해제하는 코드를 작성하려고 할 필요가 없는 것이다. 

참고로 함수 호출 시 함수 실행을 위해 할당되는 영역을 스택 프레임(stack frame)이라 한다.

 

반면 힙은 직접 할당받고 직접 할당을 해제해야 한다. C언어의 경우  malloc  등의 함수로 할당받고  free  함수로 할당을 해제한다. C 프로그램에서 할당받은 메모리를 제대로 해제하지 않으면 프로그램이 종료된 후에도 메모리의 할당이 유지될 수 있다. 이를 메모리 누수(memory leak)라고 하는데, 메모리 누수가 축적되면 메모리가 부족해져 컴퓨터가 다운될 위험도 있다. 게다가 디버깅도 말 그대로 노가다의 연속이다. 메모리는 할당보다 해제가 더 중요하다는 말도 있을 정도니, 애초에 코드 작성 시 매우 주의를 기울여야 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Programming > Basis' 카테고리의 다른 글

OS의 의의  (0) 2019.06.02
EXE 파일의 생성  (0) 2019.04.15
부트 스트랩  (0) 2019.04.08
프로그램의 이식  (0) 2019.04.08
Ports  (0) 2019.04.04