문자 장치를 읽거나 쓰는 동안 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가 다른 프로세스에서 작동하도록 허용하시겠습니까?

관련 정보