内核页表属性解释

1. PAGE_PRESENT (1UL << 0)

#define PAGE_PRESENT (1UL << 0U)  // 位0
  • 作用:指示页面是否存在于物理内存中

  • 为0时:页面不在内存中,访问会触发缺页异常(Page Fault)

  • 使用场景:实现虚拟内存的按需分页

2. PAGE_RW (1UL << 1)

#define PAGE_RW (1UL << 1U)  // 位1
  • 作用:控制页面的读写权限

  • 为1:页面可读可写

  • 为0:页面只读,写入会触发页错误

  • 保护机制:防止意外修改代码段或只读数据

3. PAGE_USER (1UL << 2)

#define PAGE_USER (1UL << 2U)  // 位2
  • 作用:用户空间访问权限

  • 为1:用户态程序(Ring 3)可以访问该页面

  • 为0:只有内核态(Ring 0-2)可以访问

  • 安全意义:实现用户空间和内核空间的隔离

缓存控制属性

4. PAGE_PWT (1UL << 3)

#define PAGE_PWT (1UL << 3U)  // 位3 - Page Write Through
  • 作用:写透缓存策略

  • 为1:写入同时更新缓存和内存

  • 为0:回写策略(Write Back)

  • 使用场景:帧缓冲区、DMA 设备内存

5. PAGE_PCD (1UL << 4)

#define PAGE_PCD (1UL << 4U)  // 位4 - Page Cache Disable
  • 作用:禁用缓存

  • 为1:该页面不缓存

  • 为0:启用缓存

  • 使用场景:内存映射的 I/O 设备

状态位(由硬件设置)

6. PAGE_ACCESSED (1UL << 5)

#define PAGE_ACCESSED (1UL << 5U)  // 位5
  • 作用:页面访问标志

  • 硬件行为:CPU 在读取或写入页面时自动设置

  • 软件用途:页面替换算法(如 LRU)的参考

7. PAGE_DIRTY (1UL << 6)

#define PAGE_DIRTY (1UL << 6U)  // 位6
  • 作用:页面修改标志

  • 硬件行为:CPU 在写入页面时自动设置

  • 软件用途:判断页面是否需要写回磁盘

页面大小控制

8. PAGE_PSE (1UL << 7)

#define PAGE_PSE (1UL << 7U)  // 位7 - Page Size Extension
  • 作用:启用大页面(2MB 或 1GB)

  • 为1:使用大页面映射

  • 为0:使用常规 4KB 页面

  • 性能优势:减少 TLB 缺失,提高性能

高级特性

9. PAGE_GLOBAL (1UL << 8)

#define PAGE_GLOBAL (1UL << 8U)  // 位8
  • 作用:全局页面标志

  • 为1:页面在任务切换时不被 TLB 刷新

  • 性能优势:减少 TLB 重填开销

  • 使用场景:内核代码、常用库

10. PAGE_PAT_LARGE (1UL << 12)

#define PAGE_PAT_LARGE (1UL << 12U)  // 位12
  • 作用:大页面的 PAT(Page Attribute Table)索引

  • 配合 PAT:提供更细粒度的内存类型控制

  • 高级用途:特殊的内存类型配置

安全特性

11. PAGE_NX (1UL << 63)

#define PAGE_NX (1UL << 63U)  // 位63 - No Execute
  • 作用:禁止执行保护

  • 为1:页面内容不可作为代码执行

  • 安全意义:防止代码注入攻击(数据执行保护)

  • 使用场景:栈、堆数据区域

实际应用示例

// 设置用户可读写的页面
unsigned long user_rw_flags = PAGE_PRESENT | PAGE_RW | PAGE_USER;

// 设置内核只读代码页
unsigned long kernel_ro_flags = PAGE_PRESENT | PAGE_GLOBAL;

// 设置设备内存(无缓存)
unsigned long device_flags = PAGE_PRESENT | PAGE_RW | PWT | PCD;

// 设置数据段(不可执行)
unsigned long data_flags = PAGE_PRESENT | PAGE_RW | PAGE_USER | PAGE_NX;

内存保护组合

页面类型典型标志位用途
内核代码PRESENT + GLOBAL操作系统内核
用户代码PRESENT + USER应用程序代码
用户数据PRESENT + RW + USER + NX应用程序数据
设备内存PRESENT + RW + PCD内存映射 I/O
只读数据PRESENT + USER常量数据

这些属性位共同构成了现代操作系统的内存保护基础,实现了权限控制、性能优化和安全防护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luopandeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值