我正在开发一个项目,我有一个管理系统,可以通过PCI Express将PCIe硬件设备导出到其他系统。我有一个工作管理内核模块,但需要找到一种方法来确保我导出的设备没有在管理系统上为它加载过驱动程序。没有它,设备将最终出现冲突,因为相同的驱动程序将从2个不同的系统访问它。显然会引起问题。
例如,假设我在Manager上安装了双端口Intel 100MBps NIC设备,该设备将在系统中显示2个PCIe端点(例如Fn 0& 1)。将为两个设备加载英特尔模块e1000。如果我想将该设备的端口2导出到另一个系统,我想将其从e1000模块“分离”。
有没有人知道这样做的干净方法,而不是破解内核或调整e1000的驱动程序的探测功能?我不能简单地做一个rmmod,因为这将为两个NIC设备全部删除模块。我希望我没有导出的NIC在管理系统中保持正常运行,但仍然为它加载了e1000驱动程序。
基本上,rmmod执行此操作但会删除所有探测到的设备的驱动程序。由司机拥有。有什么办法告诉Linux只是“只为这个特定设备卸载模块”?在Windows上,我想这相当于右键单击设备管理器和设备中的设备;选择“禁用”。
答案 0 :(得分:5)
您可以通过以下方法禁用设备的驱动程序:
sudo -i
或在任何命令写入sudo
之前以root用户身份运行。并按照以下步骤操作:/sys/bus/pci/<driver_name>/
文件夹。echo -n 0000:03:00.1 > unbind
0000:03:00.1
是设备,您想要检测驱动程序。 答案 1 :(得分:2)
负责Linux驱动程序模型中的设备/驱动程序配对的机制称为“总线”(通常通过/ sys / bus中的条目控制)。问题是,您的设备所连接的特定总线驱动程序必须支持这种操作(并且在一般情况下,这远远不是微不足道的支持此功能)。
特别是对于PCI,如果您启用了“pci hotplug”,则可以通过将数字写入/ sys / bus / pci中相应的“hotplug”条目来启动pci总线上的设备(您也可以重新连接它们)通过触发总线重新扫描返回)。这些问题将在稍后开始,因为您必须以某种方式说服Linux设备子系统更喜欢您的驱动程序而不是已经注册的设备ID的驱动程序。
通常已注册的驱动程序被添加到某种列表中,然后逐个尝试以查看它们中的任何一个是否在其“* _device_id”表中列出新的或重新启用的设备。如果PCI子系统更喜欢以“首次注册,首次尝试”的顺序尝试驱动程序,那么您将不得不破解它以实现您的目标。
答案 2 :(得分:0)
要从设备取消绑定PCI驱动程序,请使用sysfs中驱动程序的unbind
文件。
来自Documentation/ABI/testing/sysfs-bus-pci
:
/sys/bus/pci/drivers/.../unbind Description: Writing a device location to this file will cause the driver to attempt to unbind from the device found at this location. This may be useful when overriding default bindings. The format for the location is: DDDD:BB:DD.F. That is Domain:Bus:Device.Function and is the same as found in /sys/bus/pci/devices/. For example: # echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/unbind
答案 3 :(得分:0)
您可以通过重置相应设备的启用值来禁用特定的pci设备
例如:
echo 0 > /sys/bus/pci/devices/0000:00:1a.2/enable