Ich muss einen Linux-Kernel-Treiber für ein PCIe-Gerät mit SRAM schreiben.
Für den ersten Versuch habe ich einen Treiber geschrieben, um mit einem Zeichengerät von PCIe auf SRAM zuzugreifen.
Alles funktioniert wie erwartet, aber es gibt ein Problem. SRAM ist langsam. 1 MB braucht etwa 2 Sekunden zum Lesen/Schreiben, das ist eine Hardwarebeschränkung. Die CPU ist beim Lesen/Schreiben zu 100 % ausgelastet. Das ist ein Problem. Ich brauche keine Geschwindigkeit, Lesen/Schreiben kann langsam sein, aber warum braucht es so viel CPU?
Der Puffer wird mit folgendem initialisiert pci_iomap
:
g_mmio_buffer[0] = pci_iomap(pdev, SRAM_BAR_H, g_mmio_length);
Lese-/Schreibfunktionen sehen folgendermaßen aus:
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;
}
Die Frage ist, was kann ich bei hoher CPU-Auslastung tun?
Soll ich den Treiber umschreiben, um ein Blockgerät statt eines Zeichens zu verwenden?
CPU erlauben, während des Lesens/Speicherns von Daten an einem anderen Prozess zu arbeiten?