〇 需求
在DPDK程序運行時,但願可以實時的操縱PCI 網卡設備的驅動綁定與解綁。html
本文的目的是爲了調查知足以上需求的,kernel提供的,標準的API都有幾種,分別是什麼。以肯定實施方案。linux
一 背景
咱們已知有三個方法:bash
1. dpdk_devbind.pyide
2. driverctl [administrator][driver] driverctl 是如何在udev上層管理設備驅動的ui
3. sysfsspa
[knowledge][linux][sysfs] sysfs文件系統調試
[dpdk] 讀官方文檔(2) 這裏有個bind/unbind章節。code
二 分析
分析driverctl的源碼orm
driverctl 是一個bash腳本,也是用sysfs實現的。原理以下:htm
# 加載 > echo pci-stub > /sys/bus/pci/devices/0000:03:00.0/driver_override > echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind > echo 0000:03:00.0 > /sys/bus/pci/drivers_probe > # 卸載 > echo > /sys/bus/pci/devices/0000:03:00.0/preferred_driver > echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind > echo 0000:03:00.0 > /sys/bus/pci/drivers_probe >
分析dpdk_devbind.py的源碼
用lspci配合sysfs實現。
可是在dpdk-devbind中,作個了一個判斷,同時支持新舊兩種方式。
新的方式與 driverctl 的實現相同。
舊的方式與先前咱們在sysfs下的作法同樣,用new_id來操做, 以下:
[root@T9 usertools]# echo 0000:00:04.0 > /sys/bus/pci/drivers/igb_uio/unbind [root@T9 usertools]# echo "1af4 1000" > /sys/bus/pci/drivers/virtio-pci/new_id 或 [root@T9 usertools]# echo "0000:00:04.0" > /sys/bus/pci/drivers/virtio-pci/bind
根據dpdk-devbind中的註釋和郵件列表的patch郵件信息: 新的driver_override方式是kernel version >= 3.15才支持。可是實際調試過程當中,我當前在redhat kernel version 3.10的環境裏,便已經支持了新的方式了。
patch: https://patches.linaro.org/patch/27588/
三 結論
1. 以上三種方式是同一套接口,都是經過文件系統對sysfs進行讀寫操做來實現的。
2. 具體的sysfs操做方法有前文提到的兩種。 推薦較新的一種,即經過driver_override.
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-platform