如果系统没有合适的驱动程序,硬件设备是否可见?如果它们可见,是否有用于设备识别甚至属性列表的标准协议。因此,例如,在不知道设备D存在的情况下,我可以看到设备并知道它是D设备。它甚至可以告诉我它需要什么样的驱动程序。
硬件设备必须提供一些低级信息,否则即插即用将如何工作?设备必须提供一些身份。即使操作系统包括注册表,也可以从中检索更多信息的一些库存,设备必须提供一些查找键。所以...
当然,有一种识别设备的方法。也就是说,这取决于总线类型。例如,PCI设备提供PCI ID。说,我的英特尔NIC是8086:1503
。冒号前面的数字代表设备制造商,最后一个数字表示确切的设备型号。很少,后者可能不会反映硬件,而是包含一些虚拟值(可能是一位数字改变)以指示一些衍生物(例如,设备的PCI虚拟功能)。
当然,即插即用广泛使用它。比如说,PCI设备驱动程序通常会填充特殊结构,让内核知道应该为某些类型的泛型操作调用哪些处理程序。这样的结构将在内核中注册,以及该特定驱动程序要服务的PCI ID列表。因此,内核会提示要使用某些PCI ID探测哪个驱动程序。
对于我的NIC,ID(0x1503
)中的最后一个数字在E1000_DEV_ID_PCH2_LV_V
的源代码中定义为e1000e
,并在PCI ID表(drivers/net/ethernet/intel/e1000e/netdev.c
)中引用:
static const struct pci_device_id e1000_pci_tbl[] = {
...
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_V), board_pch2lan },
...
};
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
我相信,谈论其他类型的总线可能不值得。可以这么说,这些可能在某种程度上依赖于或多或少类似的约定。
使用lshw
可能并不总是提供详尽的信息或触摸特定方面。搜索更好的应用程序可能也不会结果。相反,更好的方法是检查内核维护的sysfs。
说,我知道(例如,来自lspci -vvv
)我的英特尔NIC PCI插槽号是0000:00:19.0
。了解到这一点后,我可以继续以下步骤:
cat /sys/bus/pci/devices/0000:00:19.0/uevent
这将显示许多有用的提示,包括PCI ID和当前使用的驱动程序:
DRIVER=e1000e
PCI_CLASS=20000
PCI_ID=8086:1503
PCI_SUBSYS_ID=1043:849C
PCI_SLOT_NAME=0000:00:19.0
...
如果我然后将网卡重新绑定到vfio-pci
或其他一些狡猾的驱动程序,此输出将更改一点:
DRIVER=vfio-pci
总而言之,无论是否有驱动程序,操作系统通常都可以看到硬件。