리눅스 메모리 구조 문서화
![]() |
![]() |
1. 코드 영역(=텍스트 영역)
-실행할 프로그램의 코드가 저장되는 영역으로, 컴파일 된 기계어가 들어간다.
-코드만 저장되어 있기 때문에 읽기 권한만 있다.
-명령 실행 순서는 순차적이지 않아서 순서를 맞추기 위해 EIP(명령 포인터) 레지스터를 이용한다.
-프로그램 시작과 동시에 할당되며, 프로그램이 종료될 때 메모리가 소멸된다.
-함수, 제어문, 상수 등이 여기에 지정된다.
2. 데이터 영역
-초기값이 있는 전역변수와 정적변수, 문자열 상수가 저장되는 영역이다.
-프로그램 시작과 동시에 할당되며, 프로그램이 종료될 때 메모리가 소멸된다.
3. BSS 영역
초기값이 없는 전역변수와 정적변수, 0이나 NULL로 초기화된 변수들이 할당된다.
BSS 영역은 그런 변수들에게 메모리를 어느정도 할당할 것인지에 대한 정보를 저장한다.
이후 런타임 시스템이 여기 변수들을 필요로 할 때, 각 변수에 대한 메모리 영역이 실제로 확보된다.
초기화는 런타임에 다 링크되어 올라간 뒤에 프로그램 로더가 프로그램을 로드할 때 초기화된다.
4. 스택 영역
-프로그램 실행 중 생성되는 임시 데이터(예 : 함수의 지역변수/매개변수)를 스택처럼 쌓아서 저장하는 영역이다.
-프로그램이 자동으로 사용하는 임시 메모리 영역이라고도 할 수 있다.
-함수 호출과 함께 할당되며 함수 호출이 완료되면 메모리가 소멸된다.
이 때 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 한다.
-컴파일 될 때 메모리 공간을 가진다(컴파일 시에 크기 결정됨).
-리틀 엔디안 방식으로 저장되어 있어서 하위 바이트부터 먼저 들어간다.(높은 주소->낮은 주소의 방향으로 할당)
![]() |
![]() |
-윈도우는 1mb, 리눅스는 8mb정도의 크기이다.
-낭비되는 공간이 없으나 한계가 있어 한계를 초과할 수 없어 유연성이 부족하다.
-하나의 명령만으로 메모리 조작과 주소 조작이 가능하다.
5. 힙 영역
-사용자가 직접 관리할 수 있어야 하는 영역이다.
-프로그램 실행 중에 사용자에 의해 동적으로 메모리를 할당하기 위한 공간이다.
-빅 엔디안 방식으로 저장된다.(낮은 주소->높은 주소)
-malloc 또는 new 연산자를 통해 할당하고 free() 또는 delete 연산자를 통해 해제한다.
-런타임 시에 동적으로 크기가 결정된다.
-클래스, 클로저가 여기에 해당된다.
-프로그램에 필요한 개체 개수나 크기를 미리 알 수 없을 때 사용 가능하다.
-개체가 너무 커서 스택 할당자에 맞지 않을 때 사용 가능하다.
-할당, 해제로 인한 속도 저하가 발생한다.
-힙 손상(이중 해제, 해제 후 블록 사용, 블록 범위를 벗어나 덮어쓰기 등)으로 인한 속도 저하가 발생한다.
-힙 경합으로 인한 속도 저하가 발생한다.
두 개 이상의 쓰레드에서 동시에 데이터에 액세스하려고 하면 경합이 발생하는데 이 때 한 쪽 쓰레드의 작업이 끝나야 다른 쪽 작업을 시작할 수 있다. 이는 다중 프로세서 시스템에서 가장 큰 문제이며 경합은 일반적으로 쓰레드와 프로세스의 컨텍스트 스위칭을 가져온다. 컨텍스트 스위칭이란 멀티프로세스 환경에서 CPU가 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업을 뜻한다. 이 작업은 많은 리소스가 소모되는것에 더해, 프로세서 캐시에서 데이터가 손실되어 나중에 해당 쓰레드가 다시 살아날 때 이 데이터를 다시 작성하는데에도 리소스가 많이 소모된다.
6. 스택과 힙
사실 힙과 스택영역은 같은 공간을 공유한다. 힙이 메모리 위쪽 주소부터 할당되면 스택은 아래쪽부터 할당되는 방식이다. 그래서 각 영역이 상대 공간을 침범할 수 있는데 이를 각각 힙 오버플로우(힙이 스택영역 침범 시), 스택 오버플로우(스택이 힙 영역 침범 시)라고 한다. 당연한 소리지만 스택영역이 크면 힙영역이 작아지고 힙 영역이 크면 스택 영역이 작아진다.
참고자료
-포너블 스터디 1주차 ppt
-https://jeong-pro.tistory.com/93
'SWING > PWNABLE' 카테고리의 다른 글
Pwnable 스터디 4주차 과제 (0) | 2021.05.12 |
---|---|
Pwnable 스터디 3주차 과제 (0) | 2021.05.05 |
Pwnable 스터디 2주차 과제1 (0) | 2021.04.28 |
Pwnable 스터디 2주차 과제2 (0) | 2021.04.28 |