在最低层, Linux 系统中的每个设备由一个 struct device 代表:
struct device { struct device *parent; struct kobject kobj; char bus_id[BUS_ID_SIZE]; struct bus_type *bus; struct device_driver *driver; void *driver_data; void (*release)(struct device *dev); /* Several fields omitted */ };
有许多其他的 struct device 成员只对设备核心代码感兴趣. 但是, 这些成员值得了解: struct device *parent
327
设备的
"parent" 设备 -- 它所附着到的设备. 在大部分情况, 一个父设备是某种 总线或者主控制器. 如果 parent 是 NULL,
设备是一个顶层设备, 这常常不是你 所要的.
struct kobject
kobj;
代表这个设备并且连接它到层次中的 kobject. 注意, 作为一个通用的规则,
device->kobj->parent 等同于 device->parent->kobj.
char
bus_id[BUS_ID_SIZE];
唯一确定这个总线上的设备的字符串. PCI 设备, 例如, 使用标准的 PCI ID 格式, 包含域, 总线, 设备, 和功能号.
struct bus_type *bus; 确定设备位于哪种总线.
struct
device_driver *driver;
管理这个设备的驱动; 我们查看 struct device_driver 在下一节. void
*driver_data;
一个可能被设备驱动使用的私有数据成员. void (*release)(struct device *dev);
当对这个设备的最后引用被去除时调用的方法; 它从被嵌入的 kobject 的 release 方法被调用. 注册到核心的所有的设备结构必须有一个 release 方法, 否则内核打印出慌乱的抱怨.
最少, parent,
bus_id, bus, 和 release 成员必须在设备结构被注册前设置.