设备型号

简介

在 Fuchsia 中,设备驱动程序以 ELF 共享库 (DSO) 的形式实现,这些库会加载到驱动程序主机进程中。驱动程序管理器进程包含设备协调器,该协调器跟踪驱动程序和设备,管理驱动程序的发现,驱动程序主机进程的创建和方向,以及维护设备文件系统 (devfs);用户空间服务和应用(受其命名空间限制)可通过该机制访问设备。

驱动程序管理器将设备视为单个统一树的一部分。该树的分支(和子分支)由驱动程序主机进程中的一些设备组成。关于如何在驱动程序主机中细分整个树,这一决定基于以下系统政策:出于安全性或稳定性原因隔离驱动程序,以及出于性能原因隔离驱动程序。

设备、驱动程序和驱动程序主机

以下是在 Qemu x86-64 上运行的紫色设备树的转储(为清楚起见,略有修改):

$ driver dump
[root]
   <root> pid=1509
      [null] pid=1509 /boot/driver/builtin.so
      [zero] pid=1509 /boot/driver/builtin.so
   [misc]
      <misc> pid=1645
         [console] pid=1645 /boot/driver/console.so
         [dmctl] pid=1645 /boot/driver/dmctl.so
         [ptmx] pid=1645 /boot/driver/pty.so
         [i8042-keyboard] pid=1645 /boot/driver/pc-ps2.so
            [hid-device-001] pid=1645 /boot/driver/hid.so
         [i8042-mouse] pid=1645 /boot/driver/pc-ps2.so
            [hid-device-002] pid=1645 /boot/driver/hid.so
   [sys]
      <sys> pid=1416 /boot/driver/bus-acpi.so
         [acpi] pid=1416 /boot/driver/bus-acpi.so
         [pci] pid=1416 /boot/driver/bus-acpi.so
            [00:00:00] pid=1416 /boot/driver/bus-pci.so
            [00:01:00] pid=1416 /boot/driver/bus-pci.so
               <00:01:00> pid=2015 /boot/driver/bus-pci.proxy.so
                  [bochs_vbe] pid=2015 /boot/driver/bochs-vbe.so
                     [framebuffer] pid=2015 /boot/driver/framebuffer.so
            [00:02:00] pid=1416 /boot/driver/bus-pci.so
               <00:02:00> pid=2052 /boot/driver/bus-pci.proxy.so
                  [e1000] pid=4628 /boot/driver/e1000.so
                     [ethernet] pid=2052 /boot/driver/ethernet.so
            [00:1f:00] pid=1416 /boot/driver/bus-pci.so
            [00:1f:02] pid=1416 /boot/driver/bus-pci.so
               <00:1f:02> pid=2156 /boot/driver/bus-pci.proxy.so
                  [ahci] pid=2156 /boot/driver/ahci.so
            [00:1f:03] pid=1416 /boot/driver/bus-pci.so

方括号中的名称是设备。尖括号中的名称是代理设备,在提供进程隔离时,系统会在“下层”驱动程序主机中实例化代理设备。pid= 字段指示设备所属的驱动程序主机进程的进程对象 ID。该路径指示实现该设备的驱动程序。

例如,上面的 pid 1416 驱动程序主机包含 pci 总线驱动程序,该驱动程序为系统中的每个 PCI 设备创建设备。PCI 设备 00:02:00 恰好是一个 Intel 以太网接口,我们有一个驱动程序 (e1000.so)。创建一个新的驱动程序主机 (pid 2052),为 PCI 00:02:00 设置代理设备,然后加载并绑定到 Intel 以太网驱动程序。

代理设备在设备文件系统中不可见,因此该以太网设备会显示为 /dev/sys/platform/pci/00:02:00/e1000

驱动程序框架版本 2 (DFv2)

在驱动程序框架版本 2 中,设备称为节点,节点树的转储看起来会略有不同:

$ driver dump
[root] pid=4766 fuchsia-boot:///#meta/platform-bus.cm
   [sys] pid=4766
      [platform] pid=4766
         [pt] pid=4766 fuchsia-boot:///#meta/platform-bus-x86.cm
            [acpi] pid=4766
               [pwrbtn] pid=4766 fuchsia-boot:///#meta/hid.cm
               [_SB_] pid=4766
               [PCI0] pid=4766
               [ISA_] pid=4766
               [RTC_] pid=7264 fuchsia-boot:///#meta/intel-rtc.cm
                  [rtc] pid=7264
               [KBD_] pid=7359 fuchsia-boot:///#meta/pc-ps2.cm
                  [i8042] pid=7359
                     [i8042-keyboard] pid=7359
                     [i8042-mouse] pid=7359
               [MOU_] pid=4766
               [COM1] pid=4766
               [PRES] pid=4766
               [GPE0] pid=4766
               [FWCF] pid=4766
               [S00_] pid=4766
               [S08_] pid=4766
               [S10_] pid=4766
               [S18_] pid=4766
               [S20_] pid=4766
               [S28_] pid=4766
               [S30_] pid=4766
               [S38_] pid=4766
               [S58_] pid=4766
               [HPET] pid=4766
               [LNKE] pid=4766
               [LNKF] pid=4766
               [LNKG] pid=4766
               [LNKH] pid=4766
               [GSIE] pid=4766
               [GSIF] pid=4766
               [GSIG] pid=4766
               [GSIH] pid=4766
               [GFBY] pid=4766
               [GFEV] pid=4766
               [GFPP] pid=4766
               [GFFB] pid=4766
               [GFAU] pid=4766
               [GFSK] pid=4766
               [GFRT] pid=4766
               [GFRO] pid=4766
               [CPUS] pid=4766
               [_TZ_] pid=4766
            [PCI0] pid=4766 fuchsia-boot:///#meta/bus-pci.cm
               [bus] pid=4766
                  [00_00_0] pid=4766
                  [00_00_0_] pid=4766
                  [00_01_0] pid=4766
                  [00_01_0_] pid=4766
                  [00_02_0] pid=4766 fuchsia-boot:///#meta/virtio_block.cm
                     [virtio-block] pid=4766 fuchsia-boot:///#meta/block.core.cm
                        [block] pid=4766 fuchsia-boot:///#meta/fvm.cm
                           [fvm] pid=4766
                              [blobfs-p-1] pid=4766 fuchsia-boot:///#meta/block.core.cm
                                 [block] pid=4766
                              [data-p-2] pid=4766 fuchsia-boot:///#meta/block.core.cm
                                 [block] pid=4766 fuchsia-boot:///#meta/zxcrypt.cm
                                    [zxcrypt] pid=4766
                                       [unsealed] pid=4766 fuchsia-boot:///#meta/block.core.cm
                                          [block] pid=4766
                  [00_02_0_] pid=4766
                  [00_03_0] pid=4766
                  [00_03_0_] pid=4766
                  [00_04_0] pid=4766 fuchsia-boot:///#meta/virtio_ethernet.cm
                     [virtio-net] pid=4766 fuchsia-boot:///#meta/netdevice-migration.cm
                        [netdevice-migration] pid=4766 fuchsia-boot:///#meta/network-device.cm
                           [network-device] pid=4766
                  [00_04_0_] pid=4766
                  [00_05_0] pid=4766
                  [00_05_0_] pid=4766
                  [00_06_0] pid=4766
                  [00_06_0_] pid=4766
                  [00_07_0] pid=4766
                  [00_07_0_] pid=4766
                  [00_0b_0] pid=4766
                  [00_0b_0_] pid=4766
                  [00_1f_0] pid=4766
                  [00_1f_0_] pid=4766
                  [00_1f_2] pid=4766
                  [00_1f_2_] pid=4766
                  [00_1f_3] pid=4766
                  [00_1f_3_] pid=4766
         [00_00_2d] pid=4766 fuchsia-boot:///#meta/ramdisk.cm
            [ramctl] pid=4766
         [00_00_2e] pid=4766
         [00_00_2f] pid=4766 fuchsia-pkg://fuchsia.com/virtual_audio#meta/virtual_audio_driver.cm
            [virtual_audio] pid=4766
         [00_00_30] pid=4766
         [00_00_1b] pid=4766 fuchsia-boot:///#meta/sysmem.cm
            [sysmem] pid=4766

方括号中的名称是节点。pid= 字段指示设备所属的驱动程序主机进程的进程对象 ID。该网址是绑定到节点的驱动程序的组件清单。没有网址的节点没有绑定到任何驱动程序。