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 | 常量数据 |
这些属性位共同构成了现代操作系统的内存保护基础,实现了权限控制、性能优化和安全防护。
8697

被折叠的 条评论
为什么被折叠?



