【问题标题】:How does Linux kernel discover PCI devices?Linux 内核如何发现 PCI 设备?
【发布时间】:2020-05-02 21:07:33
【问题描述】:

在驱动方面,pci_register_driver() 在加载驱动模块时调用,或者如果模块是内置的,则在引导时调用。 (每当添加设备/驱动程序时,驱动程序/设备列表都会循环查找匹配项,我得到了那个部分。)

但是 pci 设备在何处/何时被发现并在总线上注册?我想这是特定于架构的,并且会涉及 x86 上的 BIOS,例如 - BIOS 例程探测 PCI 设备,然后在加载内核之前将结果放入 RAM 中某个位置的列表中,并且每个列表条目都包含单个 pci 的信息设备,包括 vendorId/deviceId 等。然后内核选择列表并将它们插入到pci_bus_type.p.klist_devices 中。不过这纯属猜测,谁能给点提示?

【问题讨论】:

    标签: c linux-kernel linux-device-driver pci


    【解决方案1】:

    其实不需要涉及BIOS。

    PCI 标准化了用于发现总线上的设备的特定程序。这个过程可以通过热插拔控制器随时触发(不仅是在启动时),甚至可以通过/sys/bus/pci/rescan(参见pci_rescan_bus)手动触发。

    扫描将递归进行,遍历发现的网桥并读取遇到的每个设备的配置空间数据(请参阅PCI configuration space)。

    对于找到的每个设备,如果尚未激活,内核将查找具有匹配pci_device_idpci_driver 对象的实例。然后它将调用该对象的probe 方法(其余部分是特定于驱动程序实现的)。

    如果找不到合适的pci_driver 实例,内核将向用户空间守护进程(udevhotpug 或其他)发出一个事件,该守护进程可能会加载合适的模块并创建必要的pci_driver 对象。

    【讨论】:

    • 实际上 BIOS 会影响 x86 上 Linux(以及 Windows 中的 AFAIK)中的资源管理。也就是说,操作系统会BIOS 辅助 PCI 资源管理。
    • Linux 和 PCI 在许多平台上使用,其中大多数完全没有类似 PC BIOS 或 ACPI 的东西。 :-)
    • 我的意思是你的第一句话对于一般答案是不正确的
    • BIOS 不需要参与。就 PCI 而言,您的根 PCI 桥接器可以是 USB 设备或位于网络的另一端。此外,英特尔 x86 并不是英特尔 PC 的代名词(考虑众多嵌入式设备、HPC 节点和 SGi Visual Workstation 等奇怪的野兽)。
    • 如果您假装以一般方式回答,则需要涵盖多种可能性,其中之一是BIOS 辅助资源处理。
    猜你喜欢
    • 2015-10-05
    • 2016-03-20
    • 1970-01-01
    • 2012-07-06
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多