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