本页目录
PCIe 与 USB 驱动模型
覆盖: PCIe 枚举 (BAR/MMIO/MSI) → pci_driver → USB 协议栈 (URB/endpoint) → usb_driver → 热插拔 → 电源管理 内核版本: 2.6 ~ 6.x
PCIe
总线枚举
pci_dev
// include/linux/pci.h
;
pci_driver
;
// 注册: pci_register_driver(&mydrv)
// 绑定: PCI bus 枚举 → match vendor:device → probe()
MSI/MSI-X
// 基于消息的中断替代 INTx 线中断:
// MSI: 单个向量或少量向量
// MSI-X: 最多 2048 个独立向量
// 分配:
int nvec = ;
// → 16 个 MSI-X 向量 → pci_irq_vector(pdev, i) 获取 Linux IRQ 号
// 每个向量独立亲和性 → 可绑到不同 CPU
// NVMe: 每 IO 队列一个 MSI-X → 中断并行处理
USB
USB 协议栈
// drivers/usb/core/
// 分层:
// USB Core (usbcore): 协议实现, URB 管理
// Host Controller Driver (HCD): xHCI, EHCI, OHCI
// Device Driver: usb_driver (如 usb-storage, usbhid)
// USB 设备的描述符层次:
// Device Descriptor → Config Descriptor → Interface Descriptor → Endpoint Descriptor
// 一个 USB 设备: 1 device, N configs, M interfaces, K endpoints
// Endpoint 类型:
// Control: setup packet (配置命令)
// Bulk: 大块传输 (存储, 打印机)
// Interrupt: 定时轮询 (HID: 键盘/鼠标)
// Isochronous: 实时流 (音视频, 无重传)
URB (USB Request Block)
// include/linux/usb.h
;
usb_driver
;
关键: probe 的对象是 usb_interface,不是 usb_device——因为一个 USB 设备可以有多个接口(如 webcam: video interface + audio interface),不同接口可以绑定不同驱动。
热插拔
参考
- 源码:
drivers/pci/,drivers/usb/core/,include/linux/pci.h,include/linux/usb.h - 内核文档:
Documentation/PCI/,Documentation/driver-api/usb/ - LWN: "The PCI subsystem", "USB in the Linux kernel"
关键词: PCIe, BAR, MSI-X, pci_driver, USB, URB, endpoint, usb_driver, hotplug, udev