【问题标题】:Unload kernel module for only a specific device (preferrably from code in another kernel module)仅为特定设备卸载内核模块(最好从另一个内核模块中的代码)
【发布时间】:2013-11-21 02:07:47
【问题描述】:

我正在做一个项目,我有一个管理系统,可以通过 PCI Express 将 PCIe 硬件设备导出到其他系统。我有一个工作的管理内核模块,但需要找到一种方法来确保我导出的设备在管理系统上没有为其加载驱动程序。否则,设备最终会发生冲突,因为同一个驱动程序将从 2 个不同的系统访问它并且显然会导致问题。

例如,假设我在管理器上安装了双端口 Intel 100MBps NIC 设备,它将在系统中显示 2 个 PCIe 端点(例如 Fn 0 和 1)。将为这两个设备加载英特尔模块 e1000。如果我想将该设备的端口 2 导出到另一个系统,我想将它与 e1000 模块“分离”。

有没有人知道在不破解内核或调整 e1000 驱动程序的探测功能的情况下这样做的干净方法?我不能简单地做一个 rmmod 因为这将删除两个 NIC 设备的模块。我希望我未导出的 NIC 在仍为其加载 e1000 驱动程序的情况下在管理系统中保持功能。

本质上,rmmod 会执行此操作,但会删除驱动程序探测并拥有的所有设备的驱动程序。有什么方法可以告诉 Linux “仅为此特定设备卸载模块”?在 Windows 上,我想这相当于在设备管理器中右键单击设备并选择“禁用”。

【问题讨论】:

    标签: linux-kernel device


    【解决方案1】:

    您可以通过编写以下方法禁用您设备的驱动程序:

    • 使用sudo -i或在任何命令前写sudo以root用户身份操作。并按照以下步骤操作:
    • 转到/sys/bus/pci/<driver_name>/ 文件夹。
    • 下达命令echo -n 0000:03:00.1 > unbind
    • 0000:03:00.1 是您要为驱动程序解除技术的设备。
    • 阅读 this 链接了解有关 pci 总线的 sysfs 的想法。

    【讨论】:

      【解决方案2】:

      Linux 驱动模型中负责设备/驱动配对的机制称为“总线”(通常通过 /sys/bus 中的条目控制)。问题是,您的设备所连接的特定总线驱动程序必须支持此类操作(在一般情况下支持此功能绝非易事)。

      特别是对于 PCI,如果您启用了“pci hotplug”,您将能够通过将数字写入 /sys/bus/pci 中相应的“hotplug”条目来将设备踢出 pci 总线(您也可以重新连接它们通过触发总线重新扫描返回)。问题将在稍后开始,因为您必须以某种方式说服 Linux 设备子系统更喜欢您的驱动程序而不是已为相关设备 ID 注册的驱动程序。

      通常注册的驱动程序被添加到某种列表中,然后一个一个地尝试查看它们中的任何一个是否在其“*_device_id”表中列出了新的或重新启用的设备。如果 PCI 子系统更喜欢以“先注册,先尝试”的顺序尝试驱动程序,您将不得不破解它以实现您的目标。

      【讨论】:

        【解决方案3】:

        要从设备上取消绑定 PCI 驱动程序,请使用 sysfs 中驱动程序的 unbind 文件。

        来自Documentation/ABI/testing/sysfs-bus-pci

        /sys/bus/pci/drivers/.../取消绑定 描述: 将设备位置写入此文件将导致 驱动程序尝试与找到的设备解除绑定 这个位置。这在覆盖默认值时可能很有用 绑定。该位置的格式为:DDDD:BB:DD.F。 即 Domain:Bus:Device.Function 和相同 在 /sys/bus/pci/devices/ 中找到。例如: # echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/unbind

        【讨论】:

          【解决方案4】:

          您可以通过重置相应设备的启用值来禁用特定 pci 设备

          例如:

          echo 0 > /sys/bus/pci/devices/0000:00:1a.2/enable
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-22
            • 1970-01-01
            • 2020-12-31
            • 1970-01-01
            • 2012-03-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多