본문 바로가기
잡동사니/운영체제 설계

[운영체제] 메모리구조

by 2KB 2016. 5. 6.


[ 기본 메모리 구조 ]


메모리 구조는 왼쪽에서 보시는 바와 같이 기본적으로 4개의 영역으로 나눌수 있습니다. 

첫 번째 위치하는 코드영역은, CPU가 읽을 수 있는 기계어들이 메모리에 적재되는 공간입니다. 

두 번째 영역은 ‘초기화된 영역’과 ‘초기화 안된 영역’을 합쳐 우리는 데이터영역이라고 얘기하며, 전역변수와 정적변수등이 실제로 적제되는 메모리 공간입니다. 

세 번째 영역은 힙 영역으로서, 사용자가 메모리할당을 시도할 때 이 공간을 쓰게 됩니다. 마찬가지로 공유 라이브러리 및 프로그램 내부의 라이브러리 함수들이 이 곳에 적재되게 됩니다. 

네 번째에 저장되는 공간은 ‘스택’영역으로서 함수 호출(콜러와 콜리)과 관련된 정보들이 위치하게 되고, 함수의 인자,return address, 그리고 함수 내에서 사용되는 지역변수들이 위치하게 됩니다.


오른쪽에서는 메모리에 데이터 적재시의 방식 차이를 볼 수 있습니다. 

적재 방식은 Little Endian 방식과 Big Endian 방식으로 나뉘게 되는데요. 

Big Endian 방식은 데이터 저장시 사람이 보는 방식과 동일하게 앞에서부터 순차적으로 데이터를 저장합니다. 이 방식은 모토롤라 관련 CPU에서 많이 쓰입니다. 

하지만, 우리가 흔히 쓰는 Intel은 2바이트 이상이 될시에 메모리에 역순으로 저장하는 Little Endian 방식을 채택하였습니다.


출처 : 리버싱 핵심원리(reversecore.com)

위의 표를 보면 그 차이가 명확히 알 수 있습니다

메모리에 적재될시 가장 왼쪽을 상대적인 Low Address로 생각하시면 더 쉽게 이해하실 수 있습니다

똑같은 데이터를 넣더라도 2바이트 이상이 될시 Little Endian 에서는 역순으로 2바이트씩 끊어서 저장하게 됩니다.


[ STACK ]


Stack은 일반적인 프로그램에서 할당하는 메모리공간으로서, 

일반적인 지역변수와 함수 호출에 대한 정보들이 이곳에 저장되게 됩니다.

 이 영역의 메모리 구조는 

LIFO, Last In First Out [가장 나중에 들어간 데이터가 가장 처음으로 나오는 것] 방식을 따르게 됩니다.

위 그림을 통해 우리는 들어온(Push)된 데이터가 ‘쌓이면서’ 가장 나중에 적재된 물품부터 나가는(Pop)것을 볼 수 있습니다. 

다음은 Push와 Pop을 할 때 어떤식으로 스택의 데이터를 관리하는지 다루도록 하겠습니다.



[ STACK 메모리 관리 ]


Stack은 ESP, EBP, RET(EIP)를 이용하여 메모리를 관리합니다.

* EIP : RET라는 명령 자체가 Pop EIP; JMP EIP 의 명령

어떤 방식으로 함수들이 호출되고, 그에 따라서 메모리에 어떤 내용들이 적재되는지 알아보겠습니다.



위 그림에서는 초기에 main함수가 호출될 때의 상태를 나타냅니다. 

메모리에 적재되는 EBP는 main함수를 호출하기 전의 주소를 가지고 있습니다 [ SFP, Saved Frame Pointer ]

이때 ESP 레지스터와 EBP 레지스터는 같은 값을 가지게 됩니다. 

즉, 콜리 [호출된 함수]가 콜러 [호출한 함수]로 가기위해, 콜러의 정보를 스택에 저장하게 됩니다. 

이 과정을 함수 프롤로그 라고 합니다.




위 그림에서는 fucntion함수가 호출 될 때를 나타냅니다. 

마찬가지로 EBP와 RET를 스택에 적재합니다. 

함수가 종료될때는 어떤식으로 종료를 하게 될까요? 

이 과정을 함수 에필로그라고 하는데, 이땐 스택에 저장해놓은 ‘콜러’의 값을 읽어와 다시금 콜러로 돌아가게(RET) 됩니다.




그렇다면 함수 프롤로그와 에필로그의 명령은 어떤식으로 이루어질까요? 답은 아래와 같습니다.


함수 프롤로그 [함수의 영역을 새로 설정].


push EBP      :  기존의 EBP 값을 스택에 저장

mov EBP, ESP : 현재의 ESP를 EBP와 같게 합니다.


함수 에필로그 [다시금 전에 있던 영역(콜러)로 복귀]


mov esp, ebp : 기존 EBP 값을 스택 포인터로 잡는다.

pop ebp : 기존 EBP 값을 스택에서 뺀다.

'잡동사니 > 운영체제 설계' 카테고리의 다른 글

[운영체제] 다중 스레드 프로그래밍  (0) 2016.05.05