SRAM を搭載した PCIe デバイス用の Linux カーネル ドライバーを作成する必要があります。
最初の試みとして、キャラクターデバイスを使用して PCIe から SRAM にアクセスするためのドライバーを作成しました。
すべて期待通りに動作しますが、問題が 1 つあります。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 が別のプロセスで動作できるようにしますか?