Я хочу расширить текущую реализацию QEMU с помощью специального устройства DRAM, которое имеет контроллер памяти и более подробное физическое представление (строки / банки).
Идея состоит в том, чтобы каждый доступ к памяти к область памяти, обрабатываемая этим устройством, должна проходить через контроллер. Кроме того, пользовательское приложение также должно иметь возможность взаимодействовать с устройством через загружаемый модуль ядра для отправки настраиваемых команд на само устройство.
Например:
int *array = malloc(100 * sizeof(int));
// somehow map to the device memory area (easier if it's the only dram device)
array[10] = 1;
// goes to the device controller that sets the value internally
device_set_value(array, 2, 1);
// performs array[2] = 1 but by passing through the kernel module that writes
// this command to the driver MMIO.
Я начал с поиска в edu.c
в https://github.com/qemu/qemu/blob/v2.7.0/hw/misc/edu.c и предлагаемом здесь примере модуля ядра
https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/pci.c
Но я не думаю, что таким образом доступ к процессору в QEMU будет проходить через драйвер. Драйвер реагирует только на значения, записанные в регистры MMIO.
Одним из способов может быть отправка настраиваемой команды для каждой операции на устройство, но это приведет к отмене всех C операторов, таких как разыменование указателя.
Кроме того, как модуль может переводить виртуальные адреса пользователей в физические? Потому что, если он должен выполнить DMA для доступа к фактической памяти (как это делается в устройстве edu), ему нужен физический адрес. Я видел, что это можно сделать с помощью вызова mmap (), реализованного как file_operation в загружаемом модуле ядра, но я не смог найти пример в Интернете.
Заранее спасибо