ARM64 linux页表项
ARM64 linux页表项
reference
https://www.kernel.org/doc/html/next/arm64/memory.html
页表项的通用格式 (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)