IT's 2 EG
스택 본문
메모리 레이아웃
프로그램을 실행하면, 커널은 그 Image 를 메모리에 올리고(load), 실행을 시작하는데 그 실행환경(context)와 메모리에 올라온 이미지를 프로세스라고 하며, 리눅스에서는 이를 task 라고 부른다. OS에서는 일종의 Segmentation 기법인 VMA(Virtual Memory Area)를 구현하여 한 프로세스가 Address space 를 사용할 수 있도록 한다. 이러한 Area 들은 Stack, bss, Data, Text 가 존재하며 다음과 같은 개념으로 존재한다.
Text 는 Code Section 이라고 부르며, Start_routine 과 실제 프로그램 코드(실행되는 이미지)가 적재된다. 이 Section 은 읽기만 가능하며, 로더에 의해서 메모리에 로드된다. Data 는 두가지 영역으로 볼 수 있는데 .data 와 .bss 영역이다. .data 의 경우는 초기화 되어 있는 전역 변수들이 해당되며 Text 가 적재될 때 로더에 의해서 같이 로딩된다. .bss 영역은 초기화되어 있지 않은 변수들이 저장되는 장소이며 .data 와 다르게 실행파일 내에 포함되지 않고 로더에 의해서 로드후 메모리가 할당되고 0 으로 채워지게 된다. Stack 영역은 프로그램 실행 시 지역변수나 환경변수와 같은 변수들이 위치하며, 프로그램 실행과 중요한 영역이다. 이에 대해 자세히 알아보도록 하자.
스택(Stack)
프로세스에서 스택 메모리의 역할을 아래와 같다.
1) 함수 내의 로켈 변수 임시 저장
2) 함수 호출 시 파라미터 전달
3) 복귀 주소(return address) 저장
위와 같은 역할을 수행하기위해 스택은 FILO(First In Last Out)의 구조를 가진다.
스택 포인터(ESP)의 초기값은 Stack Bottom쪽에 가깝다. PUSH 명령어에 의해서 Stack에 값이 추가되면 스택 포인터는 위쪽으로 움직이고 POP 명령에 의해 스택에서 값이 제거되면 스택 포인터는 아래쪽으로 움직인다.
어셈블리 명령어
명령어 |
예제 |
설명 |
|
PUSH |
PUSH EAX |
EAX의 값을 스택에 저장 (ESP = ESP+4) |
|
POP |
POP EAX |
스택 가장 상위의 값을 꺼내 EAX에 저장 (ESP = ESP-4) |
|
MOV |
MOV EBX, EAX |
EAX의 데이터를 EBX에 복사 |
|
LEA |
LEA EBX, EAX |
EAX의 주소를 EBX에 복사 |
|
INC |
INC EAX |
EAX의 값을 1 증가 시킨다. |
|
DEC |
DEC EAX |
EAX의 값을 1 감소 시킨다. |
|
ADD |
ADD ESP, 0x08 |
ESP에 0x08을 더한 뒤 ESP에 저장 |
|
SUB |
SUB ESP, 0x08 |
ESP에 0x08을 뺀 뒤 ESP에 저장 |
|
CALL |
CALL PROC |
프로시져를 호출한다. |
|
RET | RET | 호출했던 바로 다음 지점으로 이동 | |
CMP | CMP EAX, EBX | EAX와 EBX의 값을 비교 | |
JMP | JMP PROC | 특정한 곳으로 분기 | |
INT | INT 0x80 | OS에서 할당된 인터럽트 영역을 system call | |
NOP | NOP | 아무 동작도 하지 않는다. (No Operation) |