Мне нужно написать драйвер ядра Linux для устройства PCIe со SRAM.
Для первой попытки я написал драйвер для доступа к SRAM из PCIe с помощью символьного устройства.
Все работает как и ожидалось, но есть одна проблема. SRAM медленная, 1 МБ считывается/записывается примерно за 2 секунды, это аппаратное ограничение. Процессор занят на 100% во время чтения/записи. Ведьма — это проблема. Мне не нужна скорость, чтение/запись могут быть медленными, но почему это занимает так много ресурсов процессора?
Буфер инициализируется с помощью pci_iomap
:
g_mmio_buffer[0] = pci_iomap(pdev, SRAM_BAR_H, g_mmio_length);
Функции чтения/записи выглядят так:
static ssize_t dev_read(struct file *fp, char *buf, size_t len, loff_t *off) {
unsigned long rval;
size_t copied;
rval = copy_to_user(buf, g_mmio_buffer[SRAM_BAR] + *off, len);
if (rval < 0) return -EFAULT;
copied = len - rval;
*off += copied;
return copied;
}
static ssize_t dev_write(struct file *fp, const char *buf, size_t len, loff_t *off) {
unsigned long rval;
size_t copied;
rval = copy_from_user(g_mmio_buffer[SRAM_BAR] + *off, buf, len);
if (rval < 0) return -EFAULT;
copied = len - rval;
*off += copied;
return copied;
}
Вопрос в том, что можно сделать с высокой загрузкой ЦП?
Стоит ли мне переписать драйвер, чтобы использовать блочное устройство вместо символьного?
Разрешить ЦП работать над другим процессом во время чтения/сохранения данных?