# Page-table format: PTE bit, level과 huge mapping

v6.18.37 / arch/riscv/include/asm/pgtable.h

페이지 테이블 항목은 물리 주소만 담지 않습니다. 쓰기·실행·사용자 접근 권한과 접근·수정 상태도 함께 담습니다. arm64의 AP/UXN/PXN, x86의 RW/NX, RISC-V의 R/W/X/A/D는 비트 뜻과 조합 규칙이 다릅니다. 대표로 RISC-V가 PTE 값을 가공하는 helper들을 읽습니다.

## pte_wrprotect / pte_mkwrite_novma / pte_mkdirty

```c

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);
}

```

### 411행

```c

static inline pte_t pte_wrprotect(pte_t pte)

```

PTE의 쓰기 권한을 제거한 새 값을 만드는 inline 함수입니다. 인수는 PTE 값이며 실제 PTE 메모리의 포인터가 아닙니다.

### 413행

```c

	return __pte(pte_val(pte) & ~(_PAGE_WRITE));

```

pte_val로 비트값을 꺼내 WRITE 비트를 AND 마스크로 지운 뒤 __pte로 타입을 되돌립니다. 다른 권한·주소 비트는 유지합니다.

### 418행

```c

static inline pte_t pte_mkwrite_novma(pte_t pte)

```

VMA 인수 없이 PTE 값에 쓰기 허용을 추가하는 helper입니다. 접근 정책의 적법성은 이보다 상위 코드의 판단과 함께 봐야 합니다.

### 420행

```c

	return __pte(pte_val(pte) | _PAGE_WRITE);

```

WRITE 비트만 OR로 세워 새 PTE를 반환합니다. 아직 실제 표에 설치하거나 TLB를 지우지는 않습니다.

### 425행

```c

static inline pte_t pte_mkdirty(pte_t pte)

```

PTE에 수정 상태를 표시하는 함수입니다. 쓰기 권한을 부여하는 함수와 구분합니다.

### 427행

```c

	return __pte(pte_val(pte) | _PAGE_DIRTY);

```

DIRTY 비트를 추가하여 반환합니다. 메모리 페이지의 바이트를 변경하거나 디스크에 기록하는 코드는 아닙니다.

