我需要使用两位PTE来存储我的内核模块在拦截页面保护错误时将使用的自定义“状态”值。
我正在开发Galaxy Nexus,它有一个ARM Cortex A9(我相信ARM v7)。 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) */
只要查看这个定义列表,就会看到3,4,5位可用,以及11位和更高位。但是,我知道20个最重要的位[31:12]用于页码(PFN,我相信),所以我不能使用其中任何一个。
我可以自由使用位[5:3]还是会产生问题?我花了几个小时寻找答案,但我只能找到有关Linux如何使用PTE位的文档x86架构。
我编制了一份我认为每个PTE位的列表。
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 |---|
不幸的是,我没有看到指定 no 读取或写入权限的方法,但某种方式mmap
PROT_NONE
似乎仍然有效。我知道如何指定读取或R / W权限,但我仍然需要知道如何设置页面没有权限。
答案 0 :(得分:0)
您可以尝试清除pte中的当前位,是否会强制页面错误?