VmFlags의 rd와 mr는 같은 권한이 아닙니다

smaps 마지막의 VmFlags: rd wr mr mw me ac sd 같은 행은 page마다 붙은 PTE flag를 나열한 결과가 아닙니다. 해당 VMA의 vm_flags를 두 글자 mnemonic으로 표현한 것입니다. 현재 접근 권한, 허용 가능한 권한, fork·reclaim·fault에 관한 정책이 한 줄에 섞여 있습니다.

책의 Table 14-5에 등장하는 31개 mnemonic을 기능별로 나누어 보겠습니다. 모든 kernel에서 동일한 flag가 존재하거나 같은 방식으로 출력되는 것은 아닙니다. Architecture와 configuration에 따른 항목도 있으므로, 실제 조사에서는 사용 중인 version의 show_smap_vma_flags()와 include/linux/mm.h를 함께 확인해야 합니다.

현재 권한과 허용 범위가 다릅니다

표시 VMA flag 읽을 때 구분할 점
rd VM_READ 현재 VMA가 read를 허용합니다. 해당 page의 PTE가 이미 present라는 뜻은 아닙니다.
wr VM_WRITE 현재 VMA가 write를 허용합니다. CoW를 위해 PTE는 read-only일 수 있습니다.
ex VM_EXEC 현재 VMA의 execute 권한입니다.
sh VM_SHARED 현재 shared mapping 성격을 나타냅니다. 통계의 Shared_*와는 다른 분류입니다.
mr VM_MAYREAD Read를 허용할 수 있는 범위를 나타냅니다. 현재 rd와 같은 bit가 아닙니다.
mw VM_MAYWRITE Write 권한 변경을 검토할 때의 허용 범위입니다. 현재 writable하다는 뜻은 아닙니다.
me VM_MAYEXEC Execute에 관한 허용 범위입니다. 현재 ex와 구분합니다.
ms VM_MAYSHARE 공유에 관한 허용 성격입니다. 이 표시만으로 현재 mapping이 sh라고 판단하지 않습니다.

mprotect()로 권한을 바꿀 때는 현재 flag뿐 아니라 변경을 허용할 수 있는 범위도 확인합니다. mw가 있다고 모든 요청이 반드시 성공하는 것은 아닙니다. File 권한과 다른 정책, 요청 범위 및 필요한 kernel 작업도 관여합니다.

VMA의 may flag, 현재 접근 권한, PTE 상태를 서로 다른 층으로 구분한 독립 도식입니다. Write를 허용하는 VMA도 CoW 때문에 read-only PTE를 가질 수 있습니다.
VMA의 may flag, 현재 접근 권한, PTE 상태를 서로 다른 층으로 구분한 독립 도식입니다. Write를 허용하는 VMA도 CoW 때문에 read-only PTE를 가질 수 있습니다.

예를 들어 VMA에 wr가 있어도 private file mapping의 첫 write에서 fault가 발생할 수 있습니다. Kernel이 VMA의 write 허용을 확인한 뒤 CoW를 수행하고 PTE를 갱신하는 경우입니다. 반대로 VMA 자체가 write를 허용하지 않는 상황을 같은 CoW 경로로 취급해서는 안 됩니다.

Fork, 확장과 core dump의 정책입니다

표시 VMA flag 의미
gd VM_GROWSDOWN 아래 방향으로 확장할 수 있는 영역입니다. Limit와 충돌 검사 없이 무한히 확장한다는 뜻은 아닙니다.
dc VM_DONTCOPY Fork할 때 해당 VMA를 child에 복사하지 않는 정책입니다.
wf VM_WIPEONFORK Fork한 child에서 해당 memory의 내용을 초기화하는 정책입니다. Parent의 data를 지우는 동작과 구분합니다.
de VM_DONTEXPAND Mapping의 확장을 제한하는 성격입니다.
dd VM_DONTDUMP Core dump에 넣지 않는 정책입니다. 모든 디버깅·memory 접근을 차단하는 보안 경계는 아닙니다.

dc와 wf도 결과가 다릅니다. 전자는 child에 VMA 자체를 복사하지 않는 쪽이고, 후자는 mapping을 유지하면서 child가 parent의 기존 내용을 그대로 보지 않게 하는 쪽입니다. Flag 이름이 비슷한 “복사 방지”로 느껴지더라도 주소 공간에서 무엇이 남는지 확인해야 합니다.

일반 anonymous page와 다른 backing도 있습니다

표시 VMA flag 의미
pf VM_PFNMAP PFN을 직접 mapping하는 특수한 영역과 관련됩니다. 보통의 page-backed mapping과 수명·reference 처리가 같다고 가정하지 않습니다.
mm VM_MIXEDMAP PFN과 page 기반 항목을 함께 다룰 수 있는 mixed mapping입니다.
io VM_IO I/O mapping 성격입니다. 일반 file cache와 동일한 조사·회수 경로라고 볼 수 없습니다.
ht VM_HUGETLB HugeTLB mapping입니다. Transparent Huge Page를 권고하는 hg와 다릅니다.
ar VM_ARCH_1 Architecture별 의미를 갖는 bit입니다. 공통된 하나의 뜻으로 해석하지 않습니다.
sf VM_SYNC MAP_SYNC 등과 연결되는 동기화 요건입니다. 모든 memory write가 즉시 storage에 저장된다는 뜻은 아닙니다.

PFN을 표시할 수 있다는 사실만으로 일반 struct page를 얻고 같은 방식으로 pinning할 수 있는 것은 아닙니다. Device mapping을 조사할 때는 pf, mm, io를 먼저 구분하고 해당 driver의 mapping 계약으로 내려가야 합니다.

Commit, locking과 접근 패턴입니다

표시 VMA flag 의미
ac VM_ACCOUNT Memory commitment accounting과 연결됩니다. 현재 RSS나 실제 RAM 할당량이 아닙니다.
nr VM_NORESERVE Swap/commit reserve에 관한 정책입니다. 이후 fault의 allocation 성공 보증은 아닙니다.
lo VM_LOCKED Memory locking 정책입니다. 모든 page의 physical 위치가 DMA pin처럼 고정된다는 뜻은 아닙니다.
sr VM_SEQ_READ Sequential 접근에 관한 hint입니다.
rr VM_RAND_READ Random 접근에 관한 hint입니다.

sr와 rr는 현재 실제 접근 이력을 측정한 counter가 아닙니다. Application이 준 접근 성격과 kernel 정책에 관계하는 표시이며, Referenced나 page fault 횟수와 구분해서 읽어야 합니다.

Huge page, merging과 변경 추적입니다

표시 VMA flag 의미
hg VM_HUGEPAGE Huge page 사용을 권고하는 정책입니다. 이미 큰 page로 backing되었다는 뜻은 아닙니다.
nh VM_NOHUGEPAGE Huge page 사용을 피하도록 하는 정책입니다.
mg VM_MERGEABLE KSM 등의 merging 대상이 될 수 있는 정책입니다. 실제로 다른 page와 합쳐졌다는 증거는 아닙니다.
sd VM_SOFTDIRTY VMA 차원의 soft-dirty 상태입니다. PTE별 soft-dirty 정보와 동일한 단일 bit로 취급하지 않습니다.

Huge page의 실제 사용량은 AnonHugePages, ShmemPmdMapped, FilePmdMapped 등 해당 backing과 mapping에 맞는 통계와 함께 보아야 합니다. hg 하나만으로 PTE 대신 PMD leaf를 사용한다고 판단할 수는 없습니다.

Userfaultfd의 요청 종류도 구분합니다

표시 VMA flag 의미
um VM_UFFD_MISSING Missing fault를 userfaultfd 처리와 연결합니다.
uw VM_UFFD_WP Userfaultfd의 write-protect 추적과 연결합니다.
ui VM_UFFD_MINOR 지원되는 backing에서 minor fault 처리를 연결합니다.

여기서 minor는 userfaultfd가 정의한 fault 종류입니다. 단순히 “작은 fault”나 일반적인 process 통계의 minor fault 전체를 뜻하는 단어로 읽으면 안 됩니다. Userfaultfd 사용 자체에도 권한과 지원 기능의 제약이 있습니다.

결국 VmFlags는 VMA의 성격을 읽는 출발점입니다. 이 한 줄을 PTE dump, memory 사용량 표, 접근 이력 중 하나로 대신해서 사용하지 않는 것이 중요합니다.

참고 자료

  • Lorenzo Stoakes, The Linux Memory Manager, Early Access edition, 2025, Table 14-5 및 §4.4.1.
  • Linux v6.12 /proc documentation: 현재 접근 권한과 허용 가능한 권한, mapping별 통계의 구분입니다.
  • Linux v6.12 fs/proc/task_mmu.c: 실제 출력은 해당 version의 show_smap_vma_flags()를 기준으로 확인하셔야 합니다.