Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux PCI 設備驅動程序開發基礎架構

編輯:Linux 系統常見問題解答

PCI 總線系統架構

  • PCI Bridge:CPU 通過 Host-PCI Bridge (北橋) 掛掛主 PCI 總線 (Bus 0);PCI-PCI Bridge 級聯從屬總線 (Bus 1, 2...)。
  • 地址空間:配置空間 (256B/4KB, 總線/設備/功能號寻址)、I/O 空間、內存空間 (32/64位 BAR)。
  • 枚舉:BIOS/內核掃描總線,分配總線號、配置 BAR、分配中斷線 (IRQ)。

Linux 設備驅動模型核心

設備文件類型

類型特點典型設備
字符設備 (c)字節流、無緩衝、順序訪問、不支持隨機讀寫串口、鍵鼠、GPU、大多數 PCI 卡
塊設備 (b)塊為單位、緩衝區緩存、支持隨機訪問、請求隊列磁盤、SSD、RAID 卡

設備號與文件操作

  • 主設備號:標識驅動程序 (如 4=ttyS, 250=my_pci_drv)。
  • 次設備號:標識同驅動下的不同設備實例。
  • file_operations:驅動核心結構體,實現 open/release/read/write/ioctl/mmap/llseek/poll 等回調。

PCI 驅動核心流程

  1. 定義 pci_device_id 表:
    
    static const struct pci_device_id my_pci_ids[] = {
        { PCI_DEVICE(0x10EC, 0x8168) },  // Realtek RTL8111
        { 0, }
    };
    MODULE_DEVICE_TABLE(pci, my_pci_ids);
    
  2. 實現 probe/remove:
    
    static int my_probe(struct pci_dev *dev, const struct pci_device_id *id) {
        // 1. 啟用設備 pci_enable_device(dev)
        // 2. 請求 BAR 區域 pci_request_regions(dev, "my_drv")
        // 3. 映射 I/O 內存 pci_ioremap_bar(dev, 0)
        // 4. 分配設置中斷 pci_alloc_irq_vectors / request_irq
        // 5. 初始化字符設備 cdev_add / device_create
        // 6. 保存私有數據 pci_set_drvdata(dev, priv)
        return 0;
    }
    
    static void my_remove(struct pci_dev *dev) {
        // 逆序釋放:釋放中斷、解除映射、釋放 BAR、禁用設備、銷毀 cdev/device
    }
    
  3. 註冊驅動:
    
    static struct pci_driver my_pci_driver = {
        .name     = "my_pci_drv",
        .id_table = my_pci_ids,
        .probe    = my_probe,
        .remove   = my_remove,
    };
    
    module_pci_driver(my_pci_driver);  // 內建 init/exit
    

關鍵 API 速查

功能API說明
啟用設備pci_enable_device(dev)分配資源、設置命令寄存器 (Memory/IO/BusMaster)
請求 BARpci_request_regions(dev, name)標記 I/O 內存區域佔用,防衝突
映射 BARpci_ioremap_bar(dev, bar_idx)返回內核虛擬地址,自動處理 64位 BAR
MSI-X 中斷pci_alloc_irq_vectors(dev, 1, n, PCI_IRQ_MSIX)分配向量,配合 request_irq 使用
DMA 映射dma_alloc_coherent / dma_map_single獲取總線地址,處理一致性/流式映射
電源管理pci_save_state / pci_restore_state掛起/恢復時保存恢復配置空間

調試技巧

  • lspci -vvv -s <域:總線:設備.功能> 查看配置空間、BAR、驅動綁定。
  • cat /proc/bus/pci/devices (舊) 或 cat /sys/bus/pci/devices/.../config (二進制配置空間)。
  • dmesg -T 追蹤驅動 probe 打印。
  • echo 1 > /sys/bus/pci/devices/.../remove 觸發熱拔除測試。
Copyright © Windows教程網 All Rights Reserved