vm_flags vs vm_page_prot - PullRequest
       1

vm_flags vs vm_page_prot

4 голосов
/ 07 ноября 2011

Я работаю с ядром Linux 2.6.38 и имею вопрос о двух полях vm_area_struct, vm_flags и vm_page_prot.Если я отображаю частную анонимную память для чтения и записи, а затем распечатываю два поля созданной vm_area_struct, я вижу, что младшие 8 бит vm_flags равны 0x73, а младшие 8 бит vm_page_prot равны 0x25.Я использую 32-разрядную версию x86, и мои константы равны

VM_READ=0x01
VM_WRITE=0x02
VM_EXEC=0x04

. Таким образом, мой vm_flags, похоже, говорит, что память предназначена для чтения / записи, но vm_page_prot говорит, что она доступна только для чтения (в x86 флаг выполнения не имеет смысла).Насколько я понимаю, vm_page_prot должен отражать защиту записей таблицы страниц страниц в области VM.Когда я перехожу к памяти чтения / записи в области mmaped в пространстве пользователя, механизм сбоя страницы работает правильно, устанавливая PTE соответствующих страниц.Некоторые страницы (если я только читаю с них) отображаются в специальный фрейм нулевой страницы с PTE, установленным в только для чтения , в то время как другие страницы, для которых записано, что PTE установлен в чтение / запись .Это ожидаемое поведение ... на самом деле, из mm / memory.c:

static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
    unsigned long address, pte_t *page_table, pmd_t *pmd,
    unsigned int flags)
{
    ...
    entry = pte_mkspecial(pfn_pte(my_zero_pfn(address), vma->vm_page_prot));
    ...
}

Мой вопрос заключается в том, что определяет vm_page_prot.Я предполагаю, что vm_page_prot является каким-то образом наиболее ограничивающей комбинацией (пересечением) всех разрешений на страницы в пределах области VM, тогда как vm_flags фактически описывает истинные намерения того, как должна действовать память.

Есть ли у кого-нибудькакие-нибудь хорошие статьи о том, каковы точные цели / различия этих двух полей?

1 Ответ

6 голосов
/ 07 ноября 2011

Обратите внимание на типы C этих двух полей. Тип vm_page_prot - pgprot_t, который является типом данных уровня arch , то есть он может быть применен непосредственно к PTE базовой архитектуры. В 32-битном x86 это поле хранит содержимое надлежащих битов защиты для PTE VMA. vm_flags, напротив, является независимым от арки полем , биты которого определены в linux/mm.h. Существует множество VM_* битов, и они сильно распространяются только на простые флаги READ, WRITE и EXEC.

Так что мне кажется, что vm_page_prot является формой кэшированного преобразования из vm_flags, в котором хранятся надлежащие защитные биты для базовой архитектуры. Обратите внимание, что во многих областях, где в VMA формируется PTE, pgprot_t используется почти напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...