Как я могу использовать структуру vm_operations для перехвата ошибок страниц в определенном наборе страниц?

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

1 ответ

Задавать vma->vm_ops->fault необходимого VMA. Это может быть проще, если вы взломаете распределитель кучи и замените mmap MMAP_ANONYMOUS с mmap вашего специального устройства.

Связанный код: http://lxr.free-electrons.com/source/mm/memory.c?v=3.12#L3676

3689 static int handle_pte_fault(struct mm_struct *mm,
3690                      struct vm_area_struct *vma, unsigned long address,
3691                      pte_t *pte, pmd_t *pmd, unsigned int flags)
3692 {
3693         pte_t entry;
3694         spinlock_t *ptl;
3695 
3696         entry = *pte;
3697         if (!pte_present(entry)) {
3698                 if (pte_none(entry)) {
3699                         if (vma->vm_ops) {
3700                                 if (likely(vma->vm_ops->fault))  /* HERE */
3701                                         return do_linear_fault(mm, vma, address,
3702                                                 pte, pmd, flags, entry);
3703                         }
3704                         return do_anonymous_page(mm, vma, address,
3705                                                  pte, pmd, flags);
3706                 }
3707                 if (pte_file(entry))
3708                         return do_nonlinear_fault(mm, vma, address,
3709                                         pte, pmd, flags, entry);
3710                 return do_swap_page(mm, vma, address,
3711                                         pte, pmd, flags, entry);
3712         }

Некоторые документы: https://lwn.net/Articles/242625/ "fault ()" - [Опубликовано 23 июля 2007 г. corbet], LWN

Вы также можете проверить книгу LDD, глава 15: http://lwn.net/images/pdf/LDD3/ch15.pdf (немного устаревшая, используется nopage Гендер, который был заменен fault() хендлер в 2007 году)

Другие вопросы по тегам