Мне нужно использовать два бита 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 |---|
К сожалению, я не вижу способа указать нет разрешений на чтение или запись, но каким-то образом mmap
с PROT_NONE
все еще работает. Я знаю, как указать разрешения на чтение или чтение и запись, но мне все еще нужно знать, как настроить страницу так, чтобы она не имела разрешений.