콘텐츠로 이동

Linux 물리 메모리 관리

Jan 27, 2026

Linux는 물리 메모리를 Zone으로 분류하고, Buddy System으로 페이지를 할당하며, Slab Allocator로 커널 객체를 효율적으로 관리한다. 하드웨어마다 DMA 제약, 주소 공간 한계 등 메모리 접근 제약이 다르기 때문에 이를 체계적으로 관리한다.

하드웨어 제약에 따라 물리 메모리를 영역으로 구분한다.

Zone설명x86-32 예시
ZONE_DMAISA 장치의 DMA용< 16 MB
ZONE_DMA3232비트 DMA용< 4 GB
ZONE_NORMAL일반 커널 매핑 영역16 ~ 896 MB
ZONE_HIGHMEM커널 주소공간에 직접 매핑 안 됨> 896 MB

64비트 시스템(x86-64)에서는 ZONE_HIGHMEM이 불필요하다.

연속된 물리 페이지를 2의 거듭제곱 크기로 할당하는 알고리즘이다.

[할당 과정]
16KB 요청 → 16KB 블록 없음 → 32KB 블록 분할
32KB → 16KB + 16KB (buddy pair)
└→ 하나를 할당, 하나는 free list에
[해제 과정]
16KB 반환 → buddy도 free인지 확인
→ 둘 다 free면 32KB로 병합 (재귀적)
┌──────────────────────────────────────┐
│ 32 KB │
├─────────────────┬────────────────────┤
│ 16 KB │ 16 KB │
├────────┬────────┼─────────┬──────────┤
│ 8 KB │ 8 KB │ 8 KB │ 8 KB │
├───┬────┼───┬────┼────┬────┼────┬─────┤
│4KB│4KB │4KB│4KB │ 4KB│4KB │ 4KB│ 4KB │
└───┴────┴───┴────┴────┴────┴────┴─────┘

비유하면, 큰 종이를 접어서 필요한 크기로 자르고, 버릴 때 다시 붙이는 것이다.

커널 자료구조별 전용 캐시를 관리한다.

커널 객체 ──→ Cache ──→ Slab ──→ 물리 연속 페이지
┌───────────┼───────────┐
↓ ↓ ↓
task_struct file 객체 inode 객체
캐시 캐시 캐시

Slab의 3가지 상태:

  • Full: 모든 객체 사용 중
  • Partial: 일부 객체 사용 중
  • Empty: 모든 객체 free

할당 순서: Partial → Empty → 새 Slab 할당

비유하면, 같은 크기의 쿠키틀로 반죽을 찍어내는 것이다 (task_struct 틀, inode 틀 등).

page = alloc_pages(GFP_KERNEL, order); // 2^order 페이지 할당 (Buddy)
ptr = kmalloc(size, GFP_KERNEL); // 임의 크기 할당
obj = kmem_cache_alloc(cache, flags); // Slab에서 객체 할당

새 프로세스 생성 시:

  1. task_struct 캐시(Slab)에서 빈 객체를 가져옴
  2. 초기화 후 사용
  3. 프로세스 종료 시 객체를 캐시에 반환 (재사용 가능)