Отображение таблиц страниц с помощью pte_map_offset - PullRequest
1 голос
/ 21 ноября 2011

Я выполняю работу с ядром Linux и перебираю таблицы страниц одновременно из трех разных каталогов страниц. Когда я начал отображать таблицы страниц, я использовал pte_offset_map. Однако я понял, что при включенном высоком объеме памяти этот метод не будет работать, поскольку pte_offset_map будет пытаться использовать тот же слот kmap (pte_offset_map использует kmap_atomic в Linux 2.6.32). Я вижу, что есть pte_offset_map_nested, который использует другой слот kmap_atomic.

Однако мне нужно сопоставить три разных таблицы страниц одновременно. Я подумал о некоторых решениях, позволяющих отображать только две таблицы страниц одновременно (я мог чередовать вперед и назад и отображать только две таблицы одновременно, или временно копировать одну таблицу страниц, пока я отображаю две другие, и т. Д ... ) но эти решения нежелательны. Я думал о том, чтобы вручную отобразить таблицу третьей страницы с помощью kmap_atomic(pmd_page(*pmd), KM_USER0), но этот подход не кажется слишком общим для разных версий ядра. Однако я считаю, что этот подход является лучшим с точки зрения эффективности и простоты.

Есть какие-нибудь мысли о том, как к этому подойти?

1 Ответ

0 голосов
/ 21 ноября 2011

Вы можете использовать адресное пространство vmalloc для отображения произвольных страниц. Смотрите эти API:

extern void vm_unmap_ram(const void *mem, unsigned int count);
extern void *vm_map_ram(struct page **pages, unsigned int count,
                        int node, pgprot_t prot);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...