Linux kernel ARM Linux页表条目格式--未使用的位?

Linux kernel ARM Linux页表条目格式--未使用的位?,linux-kernel,arm,virtual-memory,Linux Kernel,Arm,Virtual Memory,我需要使用PTE的两个位来存储一个自定义“状态”值,我的内核模块在拦截页面保护错误时将使用该值 我正在开发一个具有手臂皮质A9(我相信是手臂v7)的Galaxy Nexus。Linux内核版本3.0.31。Linux PTE定义如下(来自arch/arm/include/asm/pgtable.h: /* * "Linux" PTE definitions. * * We keep two sets of PTEs - the hardware and the linux version.

我需要使用PTE的两个位来存储一个自定义“状态”值,我的内核模块在拦截页面保护错误时将使用该值

我正在开发一个具有手臂皮质A9(我相信是手臂v7)的Galaxy Nexus。Linux内核版本3.0.31。Linux PTE定义如下(来自
arch/arm/include/asm/pgtable.h

/*
 * "Linux" PTE definitions.
 *
 * We keep two sets of PTEs - the hardware and the linux version.
 * This allows greater flexibility in the way we map the Linux bits
 * onto the hardware tables, and allows us to have YOUNG and DIRTY
 * bits.
 *
 * The PTE table pointer refers to the hardware entries; the "Linux"
 * entries are stored 1024 bytes below.
 */
#define L_PTE_PRESENT       (_AT(pteval_t, 1) << 0)
#define L_PTE_YOUNG         (_AT(pteval_t, 1) << 1)
#define L_PTE_FILE          (_AT(pteval_t, 1) << 2) /* only when !PRESENT */
#define L_PTE_DIRTY         (_AT(pteval_t, 1) << 6)
#define L_PTE_RDONLY        (_AT(pteval_t, 1) << 7)
#define L_PTE_USER          (_AT(pteval_t, 1) << 8)
#define L_PTE_XN            (_AT(pteval_t, 1) << 9)
#define L_PTE_SHARED        (_AT(pteval_t, 1) << 10)    /* shared(v6), coherent(xsc3) */

不幸的是,我看不到一种指定无读或写权限的方法,但是使用
PROT_NONE
mmap
似乎仍然有效。我知道如何指定读或R/W权限,但我仍然需要知道如何将页面设置为无权限。

您可以尝试清除pte中的当前位,这会强制页面f吗ault?

@ott,谢谢你的链接。不过,我使用的是ARM Linux,PTE结构远不止于此。目前我可以区分“读”和“写”权限(仅使用L_PTE_RDONLY),但不能区分“读”和“无”权限。事实上,我甚至不知道如何指定无权限。MMU文档对PTE有何说明?您是否有ARM文档,或者只是希望从代码中了解所有内容?我有“ARM体系结构参考手册ARMv7-A和ARMv7-R版本”但我很难解释它。问题是似乎有一个硬件PTE格式,然后Linux在上面加了一个附加的软件PTE格式,其中一些软件PTE位直接对应于硬件PTE,而另一些则不对应。我用我认为是PTE位布局的东西编辑了我的原始问题。所以我我用另一种方法解决了我的问题。我没有试图设置/清除权限位来模拟无权限,而是清除PTE并刷新该页面的TLB条目。然后我向页面错误处理程序添加了一些代码,以便在进程尝试访问该页面时,我可以拦截它。不过,感谢所有人的帮助!Essen事实上,这就是我最终要做的。是的,这确实会导致页面错误,这正是我需要做的。
bit  0     PRESENT
bit  1     YOUNG
bit  2     MEMORY TYPES 0  B          FILE (only when not PRESENT)
bit  3     MEMORY TYPES 1  C
bit  4     AP0 
bit  5     AP1
bit  6     DIRTY
bit  7     RD_ONLY
bit  8     USER
bit  9     XN
bit 10     SHARED
bit 11     EXT_NG (no idea what this is)

bit 12     |---|
...        |PFN|
bit 31     |---|