Linux 内核 struct device 设备

在最低层, 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 成员必须在设备结构被注册前设置.

posted @ 2019-07-07 21:01  樊伟胜  阅读(2650)  评论(0编辑  收藏  举报