2 Вопросы о проверке памяти, указывающей с ядром Linux (пользовательская реализация) - PullRequest
0 голосов
/ 31 октября 2018

Нам дан проект, в котором мы реализуем контрольные точки памяти (базовый - это просто просмотр страниц и сброс данных, найденных в файл (также проверка информации о странице (приватная, заблокированная и т. Д.)) И инкрементный, где мы только смотрим если данные изменились ранее и выгрузить их в файл). Насколько я понимаю, мы в значительной степени строим уменьшенную версию состояний сохранения памяти (я могу ошибаться, но это только то, что я получаю из этого). В настоящее время мы используем подход VMA к нашей проблеме, чтобы пройти заданный диапазон (если он не опускается ни ниже, ни выше диапазона пользовательского пространства (это означает отсутствие диапазона ядра или ниже пользовательского пространства)), чтобы сообщить о найденных данных. со страниц, с которыми мы сталкиваемся. Я знаю, что vma_area_struct используется для доступа к vma (некоторые функции, включая find_vma ()). Моя проблема в том, что я не уверен, как мы проверяем отдельные страницы в этом заданном диапазоне адресов (которые дает нам пользователь) при использовании этой vma_area_struct. Я знаю только о struct page (это довольно много), но я все еще изучаю ядро ​​в деталях, так что я обязательно пропущу вещи. Что-то мне не хватает в vma_area_sruct при доступе к страницам?

Второй вопрос: что мы используем для перебора каждой отдельной страницы в найденном vma (из заданного начального и конечного адреса)?

1 Ответ

0 голосов
/ 03 ноября 2018

VMA содержат виртуальные адреса их первого и (одного после) последнего байта:

struct vm_area_struct {
     /* The first cache line has the info for VMA tree walking. */

     unsigned long vm_start;         /* Our start address within vm_mm. */
     unsigned long vm_end;           /* The first byte after our end address
                                        within vm_mm. */
...

Это означает, что для получения данных страницы необходимо сначала выяснить, в каком контексте работает ваш код?

Если это в контексте процесса, тогда простого copy_from_user подхода может быть достаточно, чтобы получить фактические данные и просмотр страницы (по всей вашей PGD / PUD / PMD / PTE), чтобы получить PFN, а затем повернуть это к struct page. (Будьте внимательны, , а не , чтобы использовать соблазнительную virt_to_page(addr), так как это будет работать только для адресов ядра).

С точки зрения итерации, вам нужно только итерировать в PAGE_SIZE, по виртуальным адресам, которые вы получаете от VMA.

Обратите внимание, что предполагает , что страницы действительно отображаются. Если нет (!pte_present(pte_t a)), вам может понадобиться переназначить его самостоятельно для доступа к данным.

Если ваша проверка выполняется в каком-то другом контексте (например, kthread / interrupt), вы должны переназначить страницу из свопа, прежде чем получить к ней доступ, что является совершенно другим случаем. Если вы хотите легкий путь, я бы посмотрел здесь: https://www.kernel.org/doc/gorman/html/understand/understand014.html, чтобы понять, как обрабатывать поиск / извлечение подкачки.

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