内核中用结构体device来表示一个设备。不过大家通常在驱动程序中看到是另外的结构体,比如pci设备用的是pci_dev。但是我们打开这个pci_dev就可以看到其中包含了device。所以设备的核心数据结构还是device。
device
+----------------------------------------+
|init_name |
| (char *) |
|devt |
| (dev_t) |
|id |
| (u32) |
+----------------------------------------+
|kobj |
| (struct kobject) |
| +-----------------------------------+
| |name | = device->init_name or
| | | device->bus->dev_name + id
| |kset | = devices_kset
| |ktype | = device_ktype
+----+-----------------------------------+
|type |
| (struct device_type*) |
+----------------------------------------+
|bus | = [pci_bus_type|nvdimm_bus_type]
| (struct bus_type) |
+----------------------------------------+
|driver |
| (struct device_driver*) |
+----------------------------------------+
|p |
| (struct device_private *) |
+----------------------------------------+
这里着重强调一点kobj.kset,这个值和驱动的父节点有所不同。驱动的父节点指向了总线,而设备的父节点是另一个根节点。这个时候我们可以来看看有了驱动和设备后,kobj树形结构的样子了。
bus(bus_kset) <-------------+ devices(devices_kset)
| | |
--+-----------+------+----- | ----+----+-------------
| | | |
+- drivers +- devices | |
| | | |
+- drvA <- - - +- devA - * - * | > +- devA
| | | | |
| | +- subsystem --+ |
| | | |
+- drvB <- - - +- devB - * - * | > +- devB
| | | | |
| | +- subsystem --+ |
| | | |
+- drvC <- - - +- devC - * - * | > +- devC
| | | | |
| | +- subsystem --+ |
| | |
+- drvD <- - - +- devD - * - * - > +- devD