PE Notes · CA/OS
메모리 4대 영역
프로세스 가상 공간을 코드·데이터·BSS·힙·스택으로 가르고, 성장 방향과 권한, 힙 누수와 스택 오버플로를 정리합니다.
프로세스가 뜨면 커널은 가상 공간을 목적별로 자릅니다. 명령어, 전역 값, 동적 덩어리, 호출 프레임입니다. 흔히 네 칸이라 부르고, 전역을 데이터와 로 나누면 다섯에 가깝습니다. 가 그 지도를 프로세스마다 따로 줍니다.
아래는 글자, 위는 호출
낮은 주소부터 , 초기화 전역(데이터), 미초기화 전역(BSS)입니다. 코드는 읽기·실행이고 쓰기를 막습니다. 그 위가 입니다. malloc·new가 위로 자랍니다. 높은 주소에는 이 있고, 호출이 쌓이면 아래로 내려옵니다. 가운데는 아직 안 쓴 구멍입니다. 커널 칸은 더 위, 사용자에게는 닫혀 있습니다.
| 영역 | 담는 것 | 크기 | 권한 | 수명 |
|---|---|---|---|---|
| 코드 | 기계어 | 고정 | 읽기+실행 | 프로세스 |
| 데이터 | 초기화 전역·정적 | 고정 | 읽기+쓰기 | 프로세스 |
| BSS | 미초기화 전역(0) | 고정 | 읽기+쓰기 | 프로세스 |
| 힙 | 동적 할당 | 위로 가변 | 읽기+쓰기 | 해제까지 |
| 스택 | 지역·인자·복귀 주소 | 아래로 가변 | 읽기+쓰기 | 함수 구간 |
영역 권한이 깨지면 세그폴트입니다. 코드에 쓰는 시도, 널 페이지, 이미 돌려준 힙이 그 예입니다.
힙은 부탁, 스택은 자동
힙은 프로그래머가 빌리고 돌려줍니다. 못 돌리면 누수입니다. 메모리 누수 노트가 그 병입니다. 탐색과 단편화 때문에 할당은 느립니다. 한도는 가상 공간과 커널 쿼터입니다.
스택은 함수에 들어가면 생기고 나오면 사라집니다. 스택 포인터만 움직입니다. 기본 한도는 수 메가바이트라, 깊은 재귀와 큰 지역 배열이 를 만듭니다. 복귀 주소를 덮으면 공격 칸과 만납니다.
| 비교축 | 힙 | 스택 |
|---|---|---|
| 할당 | 명시 (malloc/new) | 함수 진입 |
| 해제 | 명시 (free/delete) | 반환 |
| 방향 | 낮은 주소 → 위 | 높은 주소 → 아래 |
| 속도 | 느림 | 빠름 |
| 사고 | 누수, 단편화 | 오버플로 |
프레임이 쌓이는 순서
호출은 을 한 장 올립니다. 복귀 주소, 인자, 이전 베이스 포인터, 지역 변수입니다. 반환은 그 장을 접고 포인터를 되돌립니다. 답안은 네(다섯) 칸 표, 힙·스택 성장과 사고, 프레임 한 줄을 한 장에 닫습니다.