IT's 2 EG

스택 본문

카테고리 없음

스택

엠씨비기 2015. 10. 7. 00:14

메모리 레이아웃


프로그램을 실행하면, 커널은 그 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)


Comments