컴퓨터 메모리(RAM)란?
시스템의 단기 데이터 스토리지로 정보에 빠르게 엑세스할 수 있도록 컴퓨터가 실시간으로 사용하는 정보를 저장하는 곳이다. 즉 작업을 처리하기 위한 기억장치로 cpu는 작업을 수행할 때 메인 메모리까지 참조 가능하다. 시스템에서 많은 프로그램을 실행할 수록 더 많은 메모리가 필요하게 된다. RAM은 저장된 데이터를 순차적이 아닌 임의의 순서로 엑세스할 수 있는 데이터 장소이다. ( 각 프로세스는 자신만의 메모리를 할당받고, 메모리를 사용하여 동작한다)
프로그램의 정보를 읽어 메모리에 로드되는 과정이다. 프로그램을 실행하게 되면(과정 2번) OS는 메모리(RAM)에 공간을 할당해준다. 할당해주는 메모리 공간은 4가지(Code, Data, Stack, Heap)가 있다.
코드 영역
작성한 소스코드가 들어가는 부분으로 실행할 프로그램 코드가 저장되는 영역이다. (텍스트 영역)
CPU는 코드 영역에 저장된 명령어를 하나씩 처리한다. 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
데이터 영역
작성한 코드에서 전역변수와 정적변수등이 저장되는 공간이다. 보통 메인(main)함수 전 (프로그램 실행 전)에 선언되어 프로그램이 끝날 때까지 메모리에 남아있는 변수들이라는 특징이 있다.
즉 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 소멸되는 영역
힙 영역
프로그래머가 직접 할당/해제하는 메모리 공간으로 이 공간에서 메모리 할당하는 것을 동적 할당이라고 부른다.
java나 c++에서 new 연산자를 생성하는 경우 또는 class, 참조 변수들도 heap 영역이 차지하게 된다.
malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delelte 연산자를 통해 메모리를 해제한다.
선입 선출 방식으로 가장 먼저 들어온 데이터가 가장 먼저 인출된다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
스택 영역
프로그램이 자동으로 사용하는 임시 메모리 공간이다.
함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이고, 함수 호출이 완료되면 사라진다. 즉, 함수의 호출로 할당되며, 함수의 호출이 완료되면 소멸한다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 한다( 어셈블리 핸드레이, 함수 프롤로그와 에필로그 글 편에 설명되어 있음)
push 동작으로 데이터를 저장하고, pop 동작으로 데이터를 인출한다. 이러한 스택은 후입선출 방식에 따라 동작하고, 가장 늦게 저장된 데이터가 가장 먼저 인출된다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
상수, 함수는 text 영역 / 전역, 정적 변수는 data 영역 / 지역 변수들은 stack 영역에 동적할당이 되는 변수들은 heap 영역에 위치하는 것을 사진에서 볼 수가 있다.
힙과 스택영역은 같은 공간이지만 힙은 메모리 위쪽 주소부터 할당되고 stack은 아래쪽부터 할당된다.
그래서 각 영역을 침범하는 일을 각각 heap overflow, stack overflow라고 한다.
stack 영역이 크면 클 수록 heap 영역이 작아지는 형식
'System & Reversing 필기' 카테고리의 다른 글
DLL (0) | 2023.03.12 |
---|---|
어셈블리 핸드레이, 함수 프롤로그와 에필로그 (0) | 2023.03.11 |
어셈블리어 (0) | 2023.03.11 |
아키텍쳐 (0) | 2023.03.10 |
고급 언어, 저급 언어, 기계어 (0) | 2023.03.10 |