이 코드는 어떤 문제를 푸나요?
페이지 테이블 항목은 물리 주소만 담지 않습니다. 쓰기·실행·사용자 접근 권한과 접근·수정 상태도 함께 담습니다. arm64의 AP/UXN/PXN, x86의 RW/NX, RISC-V의 R/W/X/A/D는 비트 뜻과 조합 규칙이 다릅니다. 대표로 RISC-V가 PTE 값을 가공하는 helper들을 읽습니다.
읽을 범위: v6.18.37 · arch/riscv/include/asm/pgtable.h · pte_wrprotect / pte_mkwrite_novma / pte_mkdirty 411–428행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.
먼저 알아둘 개념
pte_t
페이지 테이블 항목을 C에서 구분해 다루는 타입입니다. pte_val과 __pte는 포장된 값과 원시 비트값 사이를 오갑니다.
dirty와 writable
쓰기 허용 여부와 수정 여부는 서로 다른 비트입니다. 쓰기 가능하다고 이미 수정된 것은 아닙니다.
값 생성과 설치
pte_mkwrite가 새 값을 반환하는 것과 실제 페이지 테이블 메모리에 쓰고 TLB를 갱신하는 것은 별개입니다.
처음 읽을 때
주소 비트는 고정한 채 W와 D 비트만 바뀌는 작은 표를 그려 보십시오.
더 깊이 살펴볼 때
유효하지 않은 R/W/X 조합, huge leaf, 하드웨어 A/D 갱신 여부를 아키텍처별로 비교하십시오.
그림으로 보는 변화

1. 현재 PTE 값
주소와 권한이 섞인 PTE를 입력으로 받습니다.
화살표는 값 전달을 뜻합니다.
2. 필요한 비트만 변경
W 또는 D 마스크를 OR하거나 AND로 지웁니다.
여기서 메모리 페이지 내용을 바꾸는 것은 아닙니다.
3. 새 PTE 반환
새 값을 pte_t로 포장해 반환합니다.
실제 설치와 TLB 처리는 호출자 경로로 이어집니다.
pte_wrprotect / pte_mkwrite_novma / pte_mkdirty를 한 줄씩 읽기
줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.
static inline pte_t pte_wrprotect(pte_t pte)
{
return __pte(pte_val(pte) & ~(_PAGE_WRITE));
}
/* static inline pte_t pte_mkread(pte_t pte) */
static inline pte_t pte_mkwrite_novma(pte_t pte)
{
return __pte(pte_val(pte) | _PAGE_WRITE);
}
/* static inline pte_t pte_mkexec(pte_t pte) */
static inline pte_t pte_mkdirty(pte_t pte)
{
return __pte(pte_val(pte) | _PAGE_DIRTY);
}static inline pte_t pte_wrprotect(pte_t pte)PTE의 쓰기 권한을 제거한 새 값을 만드는 inline 함수입니다. 인수는 PTE 값이며 실제 PTE 메모리의 포인터가 아닙니다.
return __pte(pte_val(pte) & ~(_PAGE_WRITE));pte_val로 비트값을 꺼내 WRITE 비트를 AND 마스크로 지운 뒤 __pte로 타입을 되돌립니다. 다른 권한·주소 비트는 유지합니다.
static inline pte_t pte_mkwrite_novma(pte_t pte)VMA 인수 없이 PTE 값에 쓰기 허용을 추가하는 helper입니다. 접근 정책의 적법성은 이보다 상위 코드의 판단과 함께 봐야 합니다.
return __pte(pte_val(pte) | _PAGE_WRITE);WRITE 비트만 OR로 세워 새 PTE를 반환합니다. 아직 실제 표에 설치하거나 TLB를 지우지는 않습니다.
static inline pte_t pte_mkdirty(pte_t pte)PTE에 수정 상태를 표시하는 함수입니다. 쓰기 권한을 부여하는 함수와 구분합니다.
return __pte(pte_val(pte) | _PAGE_DIRTY);DIRTY 비트를 추가하여 반환합니다. 메모리 페이지의 바이트를 변경하거나 디스크에 기록하는 코드는 아닙니다.
함께 생각해 볼 질문
pte_wrprotect를 부르면 TLB도 지워집니까?
아닙니다. 아래 함수는 PTE 값을 만들어 반환할 뿐입니다.
dirty 비트는 파일 저장 완료를 뜻합니까?
아닙니다. 페이지 수정 상태이며 저장 장치의 쓰기 완료와 다른 개념입니다.
NX 비트가 모든 ISA에서 같은 뜻으로 있습니까?
아닙니다. RISC-V처럼 X 허용 비트를 쓰는 구조도 있습니다.
출처와 읽은 범위
Linux stable v6.18.37 · arch/riscv/include/asm/pgtable.h
해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고
