Формат записи таблицы страниц ARM Linux неиспользуемые биты?

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


person Kevin Boos    schedule 17.04.2013    source источник
comment
@ott, спасибо за ссылку. Однако я работаю с ARM Linux, и структура PTE гораздо более ограничена. В настоящее время я могу различать разрешения на чтение и запись (используя L_PTE_RDONLY), но не могу различать разрешения на чтение и отсутствие разрешений. На самом деле, я даже не уверен, как указать отсутствие разрешений.   -  person Kevin Boos    schedule 18.04.2013
comment
Что документация MMU говорит о PTE? У вас есть документация по ARM или вы просто надеетесь понять все это из кода?   -  person Alexey Frunze    schedule 18.04.2013
comment
У меня есть Справочное руководство по архитектуре ARM ARMv7-A и ARMv7-R, но мне трудно его интерпретировать. Проблема в том, что существует аппаратный формат PTE, а затем Linux добавляет к нему дополнительный программный формат PTE, в котором некоторые биты программного PTE напрямую соответствуют аппаратному PTE, а некоторые нет. Я отредактировал свой первоначальный вопрос, указав то, что я считаю битовой раскладкой PTE.   -  person Kevin Boos    schedule 18.04.2013
comment
Поэтому я решил свою проблему с другим подходом. Вместо того, чтобы пытаться установить/очистить биты разрешений, чтобы имитировать отсутствие разрешений, я просто очищаю PTE и очищаю запись TLB для этой страницы. Затем я добавил немного кода в обработчик ошибок страницы, чтобы, если процесс пытается получить доступ к этой странице, я мог его перехватить. Тем не менее спасибо всем за помощь!   -  person Kevin Boos    schedule 25.04.2013


Ответы (1)


Вы можете попытаться очистить текущий бит в pte, вызовет ли это ошибку страницы?

person jiawen    schedule 23.11.2013
comment
По сути, это то, что я в итоге сделал. И да, это вызывает ошибку страницы, что мне и нужно было. - person Kevin Boos; 24.11.2013