Резервирование большого виртуального адресного пространства в модуле ядра
В моем исследовательском проекте я должен зарезервировать большое адресное пространство виртуальной памяти внутри модуля ядра и обработать доступ к памяти в этой области (в 64-битной системе). Я модифицировал do_page_fault
функция в файле arch / x86 / mm / fault.c, чтобы я мог обрабатывать сбои страниц, когда в TLB нет записи отображения страниц.
В моем проекте зарезервированное виртуальное адресное пространство намного больше, чем физически доступная память. Например, допустим, у нас есть 4 ГБ доступного пространства памяти. Внутри модуля ядра у меня есть 16 ГБ адресного пространства, доступного по инструкциям загрузки / хранения. Я хочу сжать страницу 4 КБ в 1 КБ и сохранить сжимаемые данные 16 ГБ в 4 ГБ памяти; как только происходит сбой страницы, он распаковывает соответствующую страницу и копирует ее в кеш страниц.
Я пытался выделить функции памяти, такие как kmalloc
а также vmalloc
, но они буквально выделяют память, в то время как мне нужно только некоторое сопоставление виртуальных адресов не один к одному посредством вызова функции [декомпрессия]. Как я могу это сделать?