Как get_user_pages () закрепляет страницу процесса в Linux? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь закрепить страницу процесса Linux с помощью функции get_user_pages () в ядре. (Я использую Ubuntu 16.04, Linux-4.4.0).
Но мне не ясно, как get_user_pages () прикрепляет страницу процесса или как это означает pin в описании функции.
Я сделал следующий тест, чтобы проверить, закреплена ли страница.
1. Процесс, называемый align_alloc (0x1000, 0x1000) для выделения памяти объемом 4 КБ.
2. Модуль ядра, который получает виртуальный адрес от процесса с помощью ioctl ().
3. Как только виртуальный адрес получен в модуле ядра, он используется для вызова get_user_pages () следующим образом:
res = get_user_pages (current, current-> mm, vaddr, 1, 1, 1, & page);
4. Процесс спит часами, для меня, чтобы проверить статус.

С помощью описанных выше шагов из / proc / pid / maps, / proc / pid / smaps и / proc / meminfo я НЕ смог найти блокировку (или закрепление) виртуального адреса процесса.

Я также проверил ref_count структуры страницы для виртуального адреса процесса, до и после вызова get_user_pages (), ref_count одинаков (3 в моем тестовом примере), как показано ниже.

[ 7159.432196] Before, page flag = ffff800004004c, count=3
[ 7159.432196] Pinned Got mmaped.
[ 7159.432197] After, page flags = ffff800004004c, count = 3

Я что-то пропустил?

А как get_user_pages () закрепляет страницы процесса?
Я нашел похожий вопрос в SO, Как «закрепленные» страницы в Linux представляют (или фактически «прикрепляют») сами , но не дают ответов.

...