最后一级的页表项不仅仅包含了指向页的内存地址的指针,它也包含了页的一些特定信息,这些信息是附加在多余的比特位上的,不过这些信息是特定于CPU的。下面来看看这些位的意义:
- _PAGE_PRESENT 指定了虚拟内存页是否存在于内存之中,这个之前的pte_present函数里有使用
- _PAGE_ACCESS CPU每次访问内存页时,会自动设置
- _PAGE_DIRTY表示页是否是脏的,即页的内容是否修改过
- _PAGE_FILE与_PAGE_DIRTY相同,但用于不同的上下文,即页不在内存中的时候
- _PAGE_USER,如果设置了_PAGE_USER则允许用户访问该页,否则,只有内核能够访问
- _PAGE_READ、_PAGE_WRITE、_PAGE_EXECUTE制定了普通的用户进程是否允许读取、写入、执行该页中的机器代码
对应于这些标志,内核提供了一些函数来查看和设置不同标志的状态
- pte_present 页是否在内存中
- pte_read 从用户空间是否可以读取该页
- pte_write 是否可以写入该页
- pte_exec 该页中的数据是否可以作为二进制代码执行
- pte_dirty 页的内容是否被修改过
- pte_file 该页表项是否属于非线性映射
- pte_young 访问位(_PAGE_ACCESS)是否设置了
- pte_rdpprote 清除该页的读权限
- pte_wrprote 清除该页的写权限
- pte_exprote 清除该页的二进制数据的权限
- pte_mkread 设置读权限
- pte_mkwrite 设置写权限
- pte_mkexec 允许执行页的内容
- pte_mkdirty 将页标记为脏
- pte_mkclean "清除"页,通常是清除_PAGE_DIRTY位
- pte_mkyoung 设置访问位,通常是_PAGE_ACCESSD
- pte_mkold 清除访问位
from: http://blog.chinaunix.net/uid-21718047-id-3146807.html