ARM Linux页表项格式 - 未使用的位?

时间:2013-04-17 19:29:56

标签: linux-kernel arm virtual-memory

我需要使用两位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权限,但我仍然需要知道如何设置页面没有权限。

1 个答案:

答案 0 :(得分:0)

您可以尝试清除pte中的当前位,是否会强制页面错误?