内核中用结构体device_driver来表示一个驱动。不过大家通常在驱动程序中看到是另外的结构体,比如pci驱动用的是pci_driver。但是我们打开这个pci_driver就可以看到其中包含了device_driver。所以驱动的核心数据结构还是device_driver。
device_driver
+----------------------------------+
|name |
| (char *) |
+----------------------------------+
|bus |
| (struct bus_type*) |
+----------------------------------+
|owner |
| (struct module*) |
+----------------------------------+
|probe |
|remove |
|shutdown |
|suspend |
|resume |
| |
+----------------------------------+
|p |
| (struct driver_private*) |
| +-----------------------------+
| |driver |
| | (struct device_driver*) |
| |kobj |
| | +------------------------+
| | |name | = device_driver->name
| | |kset | = device_driver->bus->p->drivers_kset
| | |ktype | = driver_ktype
| | +------------------------+
| |klist_devices |
| | |
+----+-----------------------------+
暂时没有更多可以解释的,想强调的一点是p->kobj.kset设置成了对应总线的drivers_kset。这点表明了驱动在sysfs中的根是在对应的总线上。当我们看设备的时候,会发现两者之间有所不同。