Могу ли я выделить страницы памяти по указанному физическому адресу в модуле ядра? - PullRequest
4 голосов
/ 09 ноября 2011

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

Справочная информация: я пишу технику эмуляции устройства в qemu, которая не будет выходить при взаимодействии гостя с устройством (например, при выходе из устройств ввода-вывода и устройств с отображением портов). Основная идея заключается в следующем: драйвер гостевого устройства будет записывать на определенный (гостевой) адрес физической памяти. Поток в процессе qemu будет непрерывно опрашивать его для проверки новых данных (через некоторые биты состояния и т. Д.). И будет действовать соответственно, не вызывая выхода. Поскольку нет (существующего) способа, с помощью которого гость может сообщить хосту, какой адрес используется драйвером устройства, я хочу, чтобы для него была выделена заранее определенная страница памяти.

Ответы [ 2 ]

6 голосов
/ 10 ноября 2011

Вы не можете выделить память по определенному адресу, однако вы можете зарезервировать определенные физические адреса во время загрузки, используя reserve_bootmem(). Вызов reserve_bootmem() на ранней стадии загрузки (разумеется, для этого требуется модифицированное ядро) гарантирует, что зарезервированная память не будет передана в систему друзей (т. Е. alloc_pages() и друзья более высокого уровня - kmalloc()), и вы будете иметь возможность использовать эту память для любых целей.

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

Похоже, что вы должны атаковать это с другой стороны, зарезервировав диапазон физической памяти в карте памяти, которую BIOS QEMU передает гостевому ядру при загрузке.

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