可在使用者空間 (userspace) 進行 PCIe 裝置模擬的 Linux 核心框架 (★ 105 分)
PCIem 是一套用 C 撰寫的 Linux 核心框架,目標是在沒有實體硬體的情況下,讓開發者能開發與測試 PCIe (Peripheral Component Interconnect Express,高速周邊互連匯流排) 裝置的驅動程式。它透過在核心中建立「看起來像真的」合成 PCIe 裝置,讓主機作業系統與既有的正式版驅動程式在不改動邏輯的前提下直接掛載;真正的裝置行為則交由使用者空間 (userspace) 撰寫的「PCI shim」來實作,等於把「做出一張卡」變成可快速迭代的軟體開發工作。
在架構上,PCIem 於核心端提供 /dev/pciem 介面,負責把合成裝置註冊進 PCI 匯流排、維護 PCI 設定空間 (PCI config space)、建立與管理 BAR (Base Address Register,基底位址暫存器) 對映,並處理中斷機制如 IRQ (Interrupt Request)、MSI (Message Signaled Interrupts) 與 MSI-X。資料傳輸方面它提供 DMA (Direct Memory Access,直接記憶體存取) 機制,並可感知 IOMMU (Input-Output Memory Management Unit,I/O 記憶體管理單元) 的存在以處理位址轉換與限制,同時也涵蓋 P2P DMA (peer-to-peer DMA,裝置對裝置的直接 DMA) 並用白名單控管可互通的對象。它還引入以 CPU 監看點 (watchpoint) 偵測存取的事件驅動設計,以及模組化的 PCI capability 架構,讓合成裝置能更貼近真實硬體的行為。
專案展示了多個「用真實驅動去驅動不存在的卡」的例子:例如 ProtoPCIem card 把裝置初始化與命令處理放在 QEMU (機器模擬器) 端,主機上跑的驅動程式對裝置的讀寫會被轉送到 QEMU,最後能跑軟體算圖的 DOOM,甚至支援 OpenGL 1.x 的一些遊戲。作者也提到做過簡單的 NVMe (Non-Volatile Memory Express) 控制器原型,用 malloc 配出 1GB 的「碟」就能讓 Linux 的 nvme 區塊裝置驅動正常掛上,進而格式化、掛載與建立檔案/資料夾。由於裝置的出現與移除只需要開啟或關閉使用者空間 shim,測試修改可以反覆快速進行;授權則以 MIT 為主,部分檔案採 MIT/GPLv2 雙授權。
Hacker News 討論普遍認為這對驅動與硬體研發是「迭代速度」上的巨大提升,作者也補充典型情境包含:在尚未拿到晶片前先把 NVMe/RAID/NIC (Network Interface Card,網路介面卡) 驅動雛形寫好、對既有驅動做資安測試、刻意注入故障來驗證容錯(例如模擬裝置異常、甚至在不關機下從匯流排消失),以及把功能/行為測試放進 CI/CD (Continuous Integration/Continuous Delivery,持續整合/持續交付) 於一般伺服器上跑。也有人拿 FPGA (Field-Programmable Gate Array,現場可程式化閘陣列) 原型卡當對照:FPGA 在時序與真實性上更好,但硬體板卡與工具鏈成本高;相對地,PCIem 以免費、在 userspace 快速試驗為賣點。另一些留言延伸到「用另一台裝置當 PCIe 端點」的想像(例如 Raspberry Pi 或可做 endpoint mode 的 ARM/STM32MP2 類晶片),並討論 x1 通道頻寬限制下哪些工作負載仍可行;也有人補充 Linux 其實已有 nvme-pci-endpoint-target 這類把裝置假扮成 NVMe 的既有路徑。關於更進階的應用如把主機 GPU 切分給 VM (virtual machine,虛擬機器),作者回應正在探索類似 passthrough 的可能性,但難點在於裝置解除綁定、IOMMU 與中斷路由重設等核心子系統協作。討論串也岔到 PCIe 是否未來 5–10 年仍值得投資,較多人的看法是短期不易被取代(即使未來走向光纖連接,協定與生態也可能長期延續),並有人提醒:許多驅動 bug 只在特定時序或裝置回應異常時才會爆出,這類可控的合成裝置對除錯與測試特別有價值。
👥 30 則討論、評論 💬
https://news.ycombinator.com/item?id=46689065