我需要为带有 SRAM 的 PCIe 设备编写一个 Linux 内核驱动程序。
第一次尝试,我编写了一个驱动程序,使用字符设备从 PCIe 访问 SRAM。
一切都按预期进行,但有一个问题。SRAM 很慢,1MB 的读写大约需要 2 秒,这是硬件限制。读写时 CPU 处于 100% 繁忙状态。这就是问题所在。我不需要速度,读写可能会很慢,但为什么会占用这么多 CPU?
缓冲区初始化如下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;
}
问题是 CPU 占用高怎么办?
我是否应该重写驱动程序以使用块设备而不是字符设备?
允许 CPU 在读取/保存数据时执行另一个进程吗?