Ryotta's Linux MM 75๊ฐ ๋ฌธ์ ยท 145๊ฐ ์ด๋ฏธ์ง
๋ฆฌ๋ ์ค ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๋ธ์์คํ ์ ์์ค ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ๋ถ์ํ ํ๊ตญ์ด ๊ธฐ์ ๋ฌธ์ ์ ์ฅ์์ ๋๋ค.
์นดํ ๊ณ ๋ฆฌ ๋งต
1. ํต์ฌ (Core)
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ฐ์
Memory Management Overview โ Node/Zone/Page, ํ์ด์ง ํ ์ด๋ธ, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋งต
Buddy Allocator
Buddy Allocator โ 2^n ํ์ด์ง ๋ธ๋ก ํ ๋น/ํด์ , GFP ํ๋๊ทธ
Memblock ํ ๋น์
๋ถํ ์ด๊ธฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ โ E820/DT โ memblock โ Buddy
2. ํ์ & ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ
ํ์ด์ง ํ์ (vmscan)
Page Reclaim โ kswapd, LRU/MGLRU, shrinker, direct reclaim
Swap / zswap
์ค์ํ๊ณผ ์์ถ ์ค์ ์บ์ โ swap out/in, zpool
OOM Killer
Out-Of-Memory Killer โ oom_badness, OOM Reaper, overcommit
Userfaultfd
์ ์ ๋ชจ๋ ํ์ด์ง ํดํธ ์ฒ๋ฆฌ โ CRIU, KVM post-copy
3. ๊ณ ๊ธ ๊ธฐ๋ฅ
Memory Cgroup
cgroup v2 ๋ฉ๋ชจ๋ฆฌ ์ปจํธ๋กค๋ฌ โ charge/uncharge, memcg OOM, PSI
tmpfs / shmem
๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ์ผ์์คํ โ /dev/shm, POSIX/SysV IPC, DRM GEM
folio ๊ด๋ จ ๋ณ๊ฒฝ์ฌํญ
Linux 6.x~7.0 folio ์ ํ, FOLIO_MATCH ๊ฒ์ฆ, folio_queue
MGLRU ๊ฐ์ ์ฌํญ
Multi-Gen LRU โ ์ธ๋ ๊ธฐ๋ฐ ํ์ด์ง ํ์, Bloom ํํฐ, memcg ์ฐ๋
4. ํน์ & ๋๋ฒ๊น
ํ์ด์ง Migration
ํ์ด์ง ์ด๋ โ ๋ฉ๋ชจ๋ฆฌ hotplug, NUMA ๋ฐธ๋ฐ์ฑ, CMA
๋ฉ๋ชจ๋ฆฌ Sealing
๋ฉ๋ชจ๋ฆฌ ๋ฐ๋ด (kernel 7.0 ์ ๊ท) โ mseal() ์์คํ ์ฝ
๋ฉ๋ชจ๋ฆฌ ๋๋ฒ๊ทธ ๋๊ตฌ
KASAN/KFENCE/kmemleak/page_owner โ ๋ฉ๋ชจ๋ฆฌ ๊ฒ์ฆ ๋๊ตฌ
CMA ๋๋ฒ๊น
CMA DebugFS ์ธํฐํ์ด์ค โ ๋ฐํ์ ์ํ ๊ด์ฐฐ, ์๋ ํ ๋น/ํด์ ํ ์คํธ, ๋นํธ๋งต ๋คํ
5. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ API
Reverse Mapping
๋ฌผ๋ฆฌ ํ์ด์ง โ ๊ฐ์ ์ฃผ์ ์ญ๋ฐฉํฅ ๋งคํ โ ํ์ด์ง ํ์, KSM, ๋ง์ด๊ทธ๋ ์ด์ ํต์ฌ
mlock / munlock
๋ฉ๋ชจ๋ฆฌ ๊ณ ์ โ mlock/mlockall, ์ค์๊ฐ ์์คํ , unevictable LRU
madvise
๋ฉ๋ชจ๋ฆฌ ํํธ โ MADV_DONTNEED, MADV_SEQUENTIAL, MADV_RANDOM ๋ฑ
mprotect
๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๋ณ๊ฒฝ โ PROT_READ/WRITE/EXEC, VMA ๋ถํ /๋ณํฉ
Readahead
ํ์ผ ์ ํ ์ฝ๊ธฐ โ posix_fadvise, Readahead ์๊ณ ๋ฆฌ์ฆ, ํ์ด์ง ์บ์ ์๋ฐ
Workingset
Workingset ํ์ง โ refault distance, ํ์ด์ง ํ์ ์์ฌ ๊ฒฐ์
GUP (Get User Pages)
pin_user_pages โ DMA-BUF, RDMA, FOLL ํ๋๊ทธ, ์ฌ์ฉ์ ํ์ด์ง ๊ณ ์
6. ๋ฉ๋ชจ๋ฆฌ ์์คํ
memfd
๋ฉ๋ชจ๋ฆฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ โ memfd_create, IPC ๊ณต์ , file sealing
Shrinker
์ฌ๋๋ธ/dcache/icache ํ์ ์ธํฐํ์ด์ค โ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ ๋์
Page Table Walk
ํ์ด์ง ํ ์ด๋ธ ์ํ API โ pagewalk ํ๋ ์์ํฌ, rmap์์ ํ์ฉ
vmpressure
๋ฉ๋ชจ๋ฆฌ ์๋ ฅ ์๋ฆผ โ PSI ํตํฉ, ์ปจํ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
List LRU
LRU ๋ฆฌ์คํธ ๊ด๋ฆฌ โ dentry/inode ์บ์ ํ์, slab shrinker ์ฐ๋
Page Owner
ํ์ด์ง ํ ๋น ์ถ์ โ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ง๋จ, ํ ๋น ์ ๋ณด ๊ธฐ๋ก
Per-CPU ๋ฉ๋ชจ๋ฆฌ
Per-CPU ๋ฉ๋ชจ๋ฆฌ ํ ๋น โ percpu-vm, percpu-km, ์บ์ ๋ผ์ธ ์ต์ ํ
Mempool
๋ฉ๋ชจ๋ฆฌ ํ ์์ฝ โ OOM ๋ฐฉ์ง, I/O ๊ฒฝ๋ก์์ ์์ ํ ํ ๋น
VM ํต๊ณ
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํต๊ณ โ per-CPU ์นด์ดํฐ, /proc/vmstat, ๋๋ฆฌํํธ ๊ด๋ฆฌ
7. ํน์ ํ ๋น & ๊ฐ์ํ
HugeTLB
HugeTLB ํ ๋น/๊ด๋ฆฌ โ THP์ ๋ณ๋์ ๊ฑฐ๋ ํ์ด์ง, resv_huge_pages
DMA Pool
DMA ๋ฒํผ ํ ํ ๋น โ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ DMA ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
Virtio Balloon
๊ฐ์๋จธ์ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒ์ปค๋ฐ โ virtio-balloon ๋๋ผ์ด๋ฒ
Free Page Reporting
๊ฐ์ํ ํ๊ฒฝ ๋น ํ์ด์ง ์๋ฆผ โ ํํผ๋ฐ์ด์ ์ free page ๋ณด๊ณ
process_vm_readv/writev
ํ๋ก์ธ์ค ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ง์ ์ ๊ทผ โ CRIU, ๋๋ฒ๊ฑฐ ํ์ฉ
8. ์ํคํ ์ฒ ๋น๊ต
ARM64 vs x86_64 ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฐจ์ด์
์ํคํ ์ฒ๋ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฐจ์ด โ ํ์ด์ง ํ ์ด๋ธ, TLB, ๋ฐฐ๋ฆฌ์ด, Huge Page, DMA, NUMA
Linux 6.x โ 7.0 ๋ณ๊ฒฝ์ ์์ฝ
Linux 6.x์์ 7.0์ผ๋ก์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ ์์ฝ
MMU ์๋ ์์คํ
NOMMU ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ โ vm_region, ์ ์ญ region ํธ๋ฆฌ, MMU ๋ฏธ์ง์ ์์คํ
9. ์ค์ & ์ฌํ
์ปจํ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ค์
Docker/Kubernetes ๋ฉ๋ชจ๋ฆฌ ์ค์ , cgroup v2 ํ์ฉ
ํ์ด์ง ํ ์ด๋ธ ๊ฒ์ฆ
ํ์ด์ง ํ ์ด๋ธ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ โ ์ด์ค ์ฐ๊ธฐ ๋งคํ, ์๋ชป๋ ๊ณต์ ํ์ง
๋ฐฑ์๋ ๋๋ฐ์ด์ค
dirty/writeback ์ธํ๋ผ โ backing_dev_info, bdi_writeback
์ ํด ํ์ด์ง
์ ํด ํ์ด์ง ์ถ์ โ /sys/kernel/mm/page_idle/bitmap, DAMON ์ฐ๋
MMU Gather
TLB ํ๋ฌ์ ๋ฐฐ์น ์ต์ ํ โ mmu_gather, ์ธ์ฝ๋ฉ ํ์ด์ง, RCU ํ ์ด๋ธ ํด์
KMSAN (๋ฉ๋ชจ๋ฆฌ ์์ ๊ฒ์ฆ)
์ปค๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ฒ์ฆ โ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ ํ์ง, ๊ธฐ์ ์ถ์
์ฌ์ฉ์ ๊ณต๊ฐ ๋ณต์ฌ
์ปค๋-์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ํ๋๋ โ ์คํ/ํํ/ํ ์คํธ ์์ญ ๊ฒ์ฆ, ๋ณด์ ์ทจ์ฝ์ ์ฐจ๋จ
ํ์ด์ง ํ ์ด๋ธ ์ผ๋ฐ
์ํคํ ์ฒ ๋ ๋ฆฝ ํ์ด์ง ํ ์ด๋ธ ์กฐ์ โ PTE ๋งคํ/์ ๊ธ, THP ์ฒ๋ฆฌ, ๋น๋๊ธฐ ํด์
10. ๋ด๋ถ & ์ด๊ธฐํ & ๋๊ตฌ
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ด๋ถ
MM ๋ด๋ถ ํค๋ โ GFP ๋ง์คํฌ, ํ ๋น ํ๋๊ทธ, PTE ๋ฐฐ์น, ๋ด๋ถ ๊ตฌ์กฐ์ฒด/ํจ์ ์ ์ธ
MM ์ด๊ธฐํ
์ปค๋ ๋ถํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ด๊ธฐํ โ zone/node ์ค์ , memmap ์ด๊ธฐํ, deferred init
๋ฉ๋ชจ๋ฆฌ ์ ๋ณด ํ์
๋ฉ๋ชจ๋ฆฌ ์ํ ์ถ๋ ฅ ์ ํธ๋ฆฌํฐ โ /proc/meminfo, dmesg, panic ์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด ํ์