このページの目次
PCIe と USB ドライバモデル
カバー範囲: PCIe 列挙 (BAR/MMIO/MSI) → pci_driver → USB プロトコルスタック (URB/エンドポイント) → usb_driver → ホットプラグ → 電源管理 カーネルバージョン: 2.6 ~ 6.x
PCIe
バス列挙
pci_dev
// include/linux/pci.h
;
pci_driver
;
// 登録: pci_register_driver(&mydrv)
// バインディング: PCI バス列挙 → 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 を 1 つ割り当て → 割り込みの並列処理
USB
USB プロトコルスタック
// drivers/usb/core/
// 階層構造:
// USB Core (usbcore): プロトコル実装、URB 管理
// ホストコントローラドライバ (HCD): xHCI, EHCI, OHCI
// デバイスドライバ: usb_driver(例: usb-storage, usbhid)
// USB デバイスの記述子階層:
// デバイス記述子 → 構成記述子 → インターフェース記述子 → エンドポイント記述子
// 1 つの USB デバイス: 1 デバイス、N 構成、M インターフェース、K エンドポイント
// エンドポイントの種類:
// Control: セットアップパケット(設定コマンド)
// Bulk: 大量データ転送(ストレージ、プリンタ)
// Interrupt: 定期的ポーリング(HID: キーボード/マウス)
// Isochronous: リアルタイムストリーム(音声/映像、再送なし)
URB(USB リクエストブロック)
// include/linux/usb.h
;
usb_driver
;
重要: probe の対象は usb_device ではなく usb_interface である。1 つの USB デバイスに複数のインターフェースが存在する場合があるため(例: ウェブカメラのビデオインターフェースとオーディオインターフェース)、異なるインターフェースに異なるドライバをバインドできる。
ホットプラグ
参考
- ソースコード:
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