[필수 개념] 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로 느슨하게 되어 있음