메모리 구조
📋 문서 버전
이 문서는 5개의 버전이 있습니다. 현재 버전 1을 보고 있습니다.
메모리 구조
개요
메모리 구조(Memory Layout)는 컴퓨터 시스템에서 프로그램이 실행될 때 메모리가 어떻게 구성되고 사용되는지를 설명하는 개념이다. 프로그램이 메모리에 적재되면, 운영체제는 그 프로그램을 위한 메모리 공간을 할당하며, 이 공간은 목적에 따라 여러 영역으로 나뉜다. 이러한 메모리 구조는 프로그램의 성능, 보안, 안정성에 직접적인 영향을 미치므로, 시스템 프로그래밍, 운영체제 설계, 보안 연구 등 다양한 분야에서 핵심적인 주제로 다뤄진다.
이 문서에서는 일반적인 프로세스 메모리 구조의 구성 요소와 각 영역의 역할, 메모리 관리 기법, 그리고 관련된 보안 이슈에 대해 설명한다.
메모리 영역의 구성
프로그램이 실행되면 운영체제는 해당 프로세스를 위한 가상 메모리 공간을 할당한다. 이 가상 메모리 공간은 일반적으로 다음과 같은 주요 영역으로 나뉜다.
1. 텍스트 영역 (Text Segment)
- 용도: 실행 가능한 기계어 코드(프로그램의 명령어)를 저장한다.
- 특징:
- 읽기 전용(read-only)이며, 수정 불가.
- 공유 가능(shared)하여 동일한 프로그램을 여러 프로세스가 실행할 때 메모리 효율을 높임.
- 예시:
main()함수, 사용자 정의 함수의 바이너리 코드.
2. 데이터 영역 (Data Segment)
데이터 영역은 초기화된 전역 변수와 정적 변수를 저장하는 공간으로, 두 개의 하위 영역으로 나뉜다.
2.1 초기화 데이터 영역 (Initialized Data Segment)
- 전역 변수나 정적 변수 중 초기값이 지정된 변수들이 저장된다.
- 예:
int global_var = 10;
2.2 미초기화 데이터 영역 (BSS Segment, Block Started by Symbol)
- 초기값이 지정되지 않은 전역/정적 변수들이 저장된다.
- 프로그램 시작 시 0으로 초기화된다.
- 예:
int uninitialized_var;
3. 힙 영역 (Heap)
- 용도: 동적 메모리 할당을 위해 사용된다.
- 할당 방식:
[malloc](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/malloc)(),[calloc](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/calloc)(),[realloc](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/realloc)()(C 언어),[new](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%2B%2B/new)(C++) 등을 통해 런타임에 할당. - 특징:
- 프로그래머가 직접 관리해야 하며, 해제하지 않으면 메모리 누수(Memory Leak) 발생 가능.
- 크기가 프로그램 실행 중에 변할 수 있음.
- 위치: 일반적으로 데이터 영역 아래에서 위로 확장된다.
4. 스택 영역 (Stack)
- 용도: 함수 호출 시 지역 변수, 매개변수, 반환 주소 등을 저장.
- 특징:
- LIFO(Last In, First Out) 구조.
- 함수 진입 시 스택 프레임(Stack Frame)이 생성되고, 종료 시 자동 제거.
- 자동으로 관리되며, 스택 오버플로(Stack Overflow) 위험이 있음.
- 위치: 메모리 상단에서 아래로 확장되는 경우가 일반적.
메모리 관리 기법
가상 메모리 (Virtual Memory)
- 물리적 메모리(RAM)보다 큰 메모리 공간을 프로세스에 제공하기 위한 기법.
- 각 프로세스는 독립적인 가상 주소 공간을 가지며, 운영체제와 MMU(Memory Management Unit)가 가상 주소를 물리 주소로 변환.
- 페이징(Paging) 과 세그멘테이션(Segmentation) 을 통해 구현.
페이징 (Paging)
- 메모리를 고정된 크기의 블록(페이지)으로 나누어 관리.
- 물리 메모리와 가상 메모리 간의 매핑을 페이지 테이블(Page Table)로 관리.
- 외부 단편화(External Fragmentation) 문제 해결에 효과적.
메모리 구조와 보안
메모리 구조는 보안 취약점의 주요 공격 대상이기도 하다.
1. 버퍼 오버플로 (Buffer Overflow)
- 배열이나 버퍼의 크기를 초과하여 데이터를 쓰는 현상.
- 스택 또는 힙 영역에서 발생 가능.
- 공격자는 이를 통해 함수 반환 주소를 조작하고, 임의 코드 실행(RCE)을 시도할 수 있음.
2. 보호 기법
- 스택 카나리(Stack Canary): 스택 프레임에 특수 값을 삽입하여 오버플로 감지.
- ASLR (Address Space Layout Randomization): 메모리 영역의 시작 주소를 랜덤화하여 공격 예측 난이도 증가.
- NX 비트 (No-eXecute Bit): 데이터 영역(스택, 힙)에 코드 실행을 금지.
참고 자료 및 관련 문서
- Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley.
- Tanenbaum, A. S. (2015). Modern Operating Systems (4th ed.). Pearson.
- GNU C Library - Memory Allocation
- 관련 문서: 가상 메모리, 운영체제, 컴퓨터 아키텍처
이 문서는 컴퓨터 시스템의 핵심 요소인 메모리 구조를 이해하는 데 필요한 기초 지식을 제공하며, 시스템 프로그래밍 및 보안 분야로의 심화 학습을 위한 기반을 마련한다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.