Preciso escrever um driver de kernel Linux para um dispositivo PCIe com SRAM.
Para a primeira tentativa, escrevi um driver para acessar SRAM do PCIe com um dispositivo de caracteres.
Tudo funciona como esperado, mas há um problema. A SRAM é lenta, 1 MB leva cerca de 2 segundos para ler/gravar, esta é uma limitação de hardware. A CPU está 100% ocupada durante a leitura/gravação. Bruxa é um problema. Não preciso de velocidade, a leitura/gravação pode ser lenta, mas por que é preciso tanta CPU?
O buffer é inicializado com pci_iomap
:
g_mmio_buffer[0] = pci_iomap(pdev, SRAM_BAR_H, g_mmio_length);
funções de leitura/gravação são assim:
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;
}
A questão é o que posso fazer com alto uso da CPU?
Devo reescrever o driver para usar um dispositivo de bloco em vez de um caractere?
Permitir que a CPU trabalhe em outro processo enquanto lê/salva dados?