如何避免读写字符设备时 CPU 使用率过高?

如何避免读写字符设备时 CPU 使用率过高?

我需要为带有 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 在读取/保存数据时执行另一个进程吗?

相关内容