ARM64 linux页表项

ARM64 linux页表项


reference
https://www.kernel.org/doc/html/next/arm64/memory.html

image

image


页表项的通用格式 (Descriptor format)

每个表项是 64-bit 描述符。ARMv8 定义了两类:
Table Descriptor(指向下一级页表)
Block/Page Descriptor(最终映射,指向物理页)

各级表项字段说明

(1) Table Descriptor(指向下一级页表)
当表项是“表”时:

63................................48 47..................12 11........2 1 0
| Upper attributes (RES0)         | Next-level table addr | Lower attr | Type|

字段说明:

[1:0] = 11 → 表项是 table descriptor

[47:12] = 下一级页表物理基地址

[11:2] = 保留或软件定义

[63:48] = 保留

(2) Block/Page Descriptor(最终映射到物理内存)

当到达最后一级(或使用大页)时:

63..................52 51..48 47..................12 11.....10 9.....2 1 0
| Upper attributes   | UXN/PXN| Output address     | AttrIndx | AF  SH AP  NS| Type|

字段含义:

[1:0] (Type)

01 = block (中间级大页,L1/L2)

11 = page (最后一级 L3,64KB页)

[47:12] Output Address → 对应物理页基地址(对齐页大小)

[11:10] AttrIndx → 指向 MAIR_ELx 寄存器里的 memory 属性(缓存策略、设备内存等)

[9] AF (Access Flag) → 是否已访问过 (Access Flag = 1 表示有效访问)

[8:7] SH (Shareability) → 共享域

00 = Non-shareable

10 = Outer Shareable

11 = Inner Shareable

[6:5] AP (Access Permission) → 访问权限

00 = EL0/EL1 可读写

01 = EL0 可读写,EL1 只读

10 = EL0/EL1 只读

11 = 保留

[4] NS (Non-Secure bit) → 标记是否属于 Secure/Non-secure 世界

[54] UXN (Unprivileged eXecute-Never)

[53] PXN (Privileged eXecute-Never)
→ 禁止用户态/内核态执行代码(安全特性)

[63:55], [47:48], [11:2] → 保留/未使用

页表项在 Linux 内核中的定义

在 Linux 内核(arch/arm64/include/asm/pgtable-hwdef.h)里,有对这些字段的宏定义,例如:

#define PTE_VALID        (1UL << 0)
#define PTE_TABLE        (3UL << 0)
#define PTE_PAGE         (3UL << 0)
#define PTE_BLOCK        (1UL << 0)

#define PTE_AF           (1UL << 10)
#define PTE_SH_SHIFT     8
#define PTE_AP_SHIFT     6
#define PTE_ATTRINDX_SHIFT 2
#define PTE_PXN          (1UL << 53)
#define PTE_UXN          (1UL << 54)

posted @ 2025-09-02 17:55  王阳开  阅读(15)  评论(0)    收藏  举报