[필수 개념] Pintos 가상 메모리 구조 - Week12-13-GOAT/pintos-vm GitHub Wiki

📌 전체 메모리 맵 구조

+-------------------------------+ 0xFFFFFFFF (최상단)
|      커널 상단 미사용 영역     |
+-------------------------------+ 0xFFF00000
| 페이지 디렉터리 / 페이지 테이블 |
|   - Page Directory           |
|   - Page Tables              |
+-------------------------------+ 0xFFC00000
|   커널 스택 (쓰레드별 4KB)     |
+-------------------------------+ 0xFF800000
|       커널 힙 영역 (↑ 위로 성장)  |
+-------------------------------+ 0xFF000000
|   커널 .bss / .data           |
+-------------------------------+ 0xFE000000
|   커널 .text (실행 코드)       |
+-------------------------------+ 0xC0000000 (커널 영역 시작)
|       UNMAPPED 보호 영역      |
+-------------------------------+ 0xBFFFFFFF
| 사용자 스택 (↓ 아래로 성장)     |
+-------------------------------+
|        mmap 매핑 영역         |
+-------------------------------+
| 사용자 힙 (↑ 위로 성장)        |
+-------------------------------+
| 사용자 .bss / .data           |
+-------------------------------+
| 사용자 .text (실행 코드)       |
+-------------------------------+ 0x08048000 (보통 시작 주소)
|       NULL 보호 영역 (접근 금지) |
+-------------------------------+ 0x00000000

📘 전체 메모리 맵 요약표

주소 범위 영역 이름 설명 및 용도
0xFFFFFFFF ~ 0xFFF00000 커널 상단 미사용 영역 사용되지 않는 영역 (보호 목적 등)
0xFFF00000 ~ 0xFFC00000 페이지 디렉터리 / 테이블 가상 메모리 관리를 위한 구조체
0xFFC00000 ~ 0xFF800000 커널 스택 커널 쓰레드별 스택 (4KB씩)
0xFF800000 ~ 0xFF000000 커널 힙 커널 동적 메모리 (↑ 위로 성장)
0xFF000000 ~ 0xFE000000 커널 .bss / .data 초기화되지 않은 변수(.bss), 초기화된 전역/정적 변수(.data)
0xFE000000 ~ 0xC0000000 커널 .text 커널 코드 (실행 코드) 영역
0xC0000000 커널 영역 시작점 커널 전용 주소 공간 시작
0xBFFFFFFF ~ 아래로 사용자 스택 사용자 스택 (↓ 아래로 성장)
중간 (유동적) mmap 매핑 영역 mmap() 등으로 동적 매핑되는 메모리
중간 (유동적) 사용자 힙 사용자 힙 (↑ 위로 성장)
중간 (컴파일 시 결정됨) 사용자 .bss / .data 사용자 전역 변수 및 초기화된 데이터
중간 (컴파일 시 결정됨) 사용자 .text 사용자 실행 코드
0x08048000 사용자 프로그램 시작 주소 보통 ELF 프로그램의 시작 주소
0x00000000 ~ 낮은 주소 NULL 보호 영역 접근 금지 영역 (NULL 포인터 보호용)

🧠 Pintos ELF 메모리 레이아웃 (VMA 기준)

메모리 주소 ▼ (낮음)
┌────────────────────────────────────────────┐
│ 0x080420000 ────────────────┐              │
│         .text section       │              │
│  - 커널 코드                 │              │
│  - Read-only, Executable    │              │
│  - 크기: 0x22ef1 (약 140KB) │              │
└─────────────────────────────┘              │
┌────────────────────────────────────────────┐
│ 0x080422f40 ────────────────┐              │
│        .rodata section      │              │
│  - 상수, 문자열 리터럴        │              │
│  - Read-only, Data          │              │
│  - 크기: 0x5b37 (약 23KB)    │              │
└─────────────────────────────┘              │
┌────────────────────────────────────────────┐
│ 0x080429000 ────────────────┐              │
│         .data section       │              │
│  - 초기화된 전역/정적 변수    │              │
│  - Writable, Data           │              │
│  - 크기: 0x08aa (약 2.2KB)  │              │
└─────────────────────────────┘              │
┌────────────────────────────────────────────┐
│ 0x0804298c0 ────────────────┐              │
│         .bss section        │              │
│  - 초기화 안된 전역/정적      │              │
│  - 런타임에 0으로 초기화됨    │              │
│  - 크기: 0x0390 (약 0.9KB)   │              │
└─────────────────────────────┘              │
                                            ▼ (높음)

   ※ 위 영역들만 실제 커널 실행 시 메모리에 로드됨
   ※ 아래 영역들은 디버깅 정보로, 실행 시 사용되지 않음

┌────────────[ELF 디버그 섹션들]─────────────┐
│ .debug_info     (기본 DWARF 정보)          │
│ .debug_abbrev   (기호 약어 테이블)          │
│ .debug_aranges  (주소 범위)                │
│ .debug_line     (소스 라인 정보)            │
│ .debug_str      (디버깅 문자열)             │
│ .comment        (빌드 정보)                 │
│ .stabstr        (Stabs 문자열)              │
│ .debug_ranges   (함수 범위 정보)            │
└────────────────────────────────────────────┘

📚 Pintos ELF 메모리 정렬 전략 요약 (정렬 기준 포함)

섹션 이름 VMA 시작 주소 크기 Align (정렬 기준) 정렬 의미 비고
.text 0x080420000 0x22ef1 2^12 = 4096B 페이지 단위 정렬 (4KB) 실행 코드, Read-only
.rodata 0x080422f40 0x5b37 2^5 = 32B 문자열/상수용, 세부 정렬 Read-only 데이터
.data 0x080429000 0x08aa 2^5 = 32B 전역 변수는 일반적으로 32B 정렬 초기화된 전역/정적 변수
.bss 0x0804298c0 0x0390 2^5 = 32B 동일 초기화되지 않은 변수
.debug_info 별도 위치 0x24056 2^0 = 1B 정렬 거의 없음 디버깅 용
.debug_abbrev 별도 위치 0x06fa7 2^0 = 1B    
.debug_aranges 별도 위치 0x00cc0 2^0 = 1B    
.debug_line 별도 위치 0x084b8 2^0 = 1B    
.debug_str 별도 위치 0x03cad 2^0 = 1B    
.comment 별도 위치 0x00028 2^0 = 1B   빌드 정보
.stabstr 별도 위치 0x002d9 2^0 = 1B   Stabs 관련
.debug_ranges 별도 위치 0x01220 2^0 = 1B   함수 범위

📐 메모리 정렬 전략 도식 (정렬 기준 포함)

메모리 주소 ▼
┌────────────────────────────────────────────────────┐
│ .text (0x080420000)                                │
│ - Align: 2^12 = 4096B (페이지 단위)                │
│ - 실행 코드, Read-only                             │
└────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────┐
│ .rodata (0x080422f40)                               │
│ - Align: 2^5 = 32B                                  │
│ - 상수, 문자열 리터럴 등 Read-only 데이터          │
└────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────┐
│ .data (0x080429000)                                 │
│ - Align: 2^5 = 32B                                  │
│ - 초기화된 전역 변수 (읽기/쓰기 가능)              │
└────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────┐
│ .bss (0x0804298c0)                                  │
│ - Align: 2^5 = 32B                                  │
│ - 초기화 안 된 전역 변수 (런타임 시 0으로 채움)     │
└────────────────────────────────────────────────────┘

※ 디버깅 섹션들은 메모리에 로드되지 않으며 Align도 1B로 느슨하게 되어 있음