驱动程序绑定

如需为 Fuchsia 系统中的设备提供服务,驱动程序必须绑定到代表设备的节点驱动程序管理器会维护节点的拓扑,其中每个节点代表对系统中硬件或虚拟设备的访问权限。当驱动程序与节点匹配时,驱动程序可以绑定到该节点。绑定到节点后,驱动程序便可开始为节点代表的设备提供服务。例如,USB 键盘驱动程序可以绑定到表示键盘设备的节点。

为了确定哪些驱动程序可以绑定到哪些节点,每个驱动程序都有绑定规则,每个节点都有一组节点属性。驱动程序的绑定规则描述了驱动程序可以有效服务的节点的资格条件。当驱动程序框架尝试将驱动程序与节点进行匹配时,系统会将每个未绑定的节点的属性与驱动程序的绑定规则进行比较。如果节点属性满足驱动程序的绑定规则,驱动程序框架会允许驱动程序绑定到节点。

绑定序列

当 Fuchsia 系统启动时,驱动程序管理器会尝试构建一个节点拓扑,以表示系统中的所有硬件和虚拟设备,并且驱动程序索引会枚举系统已知的所有驱动程序。

Fuchsia 系统的初始启动期间会发生以下事件:

  1. (从根节点及其驱动程序开始)驱动程序请求驱动程序管理器创建新的子节点。
  2. 驱动程序管理器会询问驱动程序索引,以确定哪个驱动程序最符合此节点的属性:
    1. 驱动程序索引会将每个已知驱动程序的绑定规则与节点的属性进行比较。
    2. 驱动程序索引会将匹配的驱动程序的网址返回给驱动程序管理器。
  3. 驱动程序管理器将驱动程序绑定到节点:
    1. 驱动程序管理器会为驱动程序创建(或分配)驱动程序主机。
    2. 驱动程序主机会启动驱动程序的实例。
  4. 正在运行的驱动程序可能会决定创建子节点。
    1. 该过程会从第 1 步重复。

在初始运行扫描和绑定后,每当出现新驱动程序(例如,系统加载新驱动程序)时,驱动程序管理器都会将拓扑中的所有未绑定节点发送到驱动程序索引,以便与新驱动程序进行匹配。匹配到某个节点后,驱动程序管理器会将此新驱动程序绑定到该节点,驱动程序的实例会放置在驱动程序主机中,然后驱动程序主机会开始向系统中的其他 Fuchsia 组件提供设备功能。

如需详细了解绑定规则,请参阅驱动程序绑定,该文档之前是为驱动程序框架版本 1 (DFv1) 编写的。

开发板驱动程序和 USB 设备

虽然驱动程序通常绑定到设备,但某些驱动程序(例如 PCI 和 ACPI)会绑定到可能有多个设备(静态和动态)连接到它们的板级设备

在首次绑定到节点时,板级驱动程序(例如 acpi)会解析从系统传递的二进制 blob(可以是 ACPI 字节码或已编译的设备树),并告知驱动程序管理器板上连接的一组静态设备。这些设备会通过由驱动程序索引协调的常规绑定流程绑定到驱动程序。从此时起,这些驱动程序(绑定到板级驱动程序的子节点)会动态查询硬件以获取更多信息。通过这些信息,驱动程序可以发现要添加到拓扑中的新设备。随着系统发现更多设备并将其引入拓扑中,此过程会递归地发生。