
我需要為具有 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在讀取/保存資料時處理另一個進程嗎?