总线struct bus_type
总线是处理器与设备之间的通道,在设备模型中,所有的设备都是通过总线相连的。在设备模型中,总线由bus_type表示。
struct bus_type {
const char *name; //总线类型名称
struct bus_attribute *bus_attrs; //总线属性
struct device_attribute *dev_attrs; //设备属性
struct driver_attribute *drv_attrs; //驱动属性
int (*match)(struct device *dev, struct device_driver *drv); //匹配总线中的dev和driver
int (*uevent)(struct device *dev, struct kobj_uevent_env *env); //用于总线对uevent环境变量添加
int (*probe)(struct device *dev); //总线匹配成功时会调用,bus和drv的probe中只有一个起效//,如果bus存在就调用bus->probe
int (*remove)(struct device *dev); //总线上设备或者驱动删去时调用
void (*shutdown)(struct device *dev); //函数在所有设备都关闭时候调用
int (*suspend)(struct device *dev, pm_message_t state);//总线上设备休眠
int (*resume)(struct device *dev); //处理热插拔、电源管理
const struct dev_pm_ops *pm;
struct iommu_ops *iommu_ops;
struct subsys_private *p; //将bus同device、driver、sysfs联系起来
};
struct subsys_private
其中最后一个指向subsys_private的指针,定义了将bus同其他类型联系起来的关系,将bus同device、driver、sysfs联系起来。
subsys是kset类型,代表bus在sysfs中的类型
devices_kset代表bus目录下的device的子目录
driver_kset代表bus目录下的driver的子目录
klist_devices是bus的设备链表,klist_drivers是bus的驱动链表
struct subsys_private {
struct kset subsys;
struct kset *devices_kset;
struct kset *drivers_kset;
struct klist klist_devices;
struct klist klist_drivers;
struct blocking_notifier_head bus_notifier;
unsigned int drivers_autoprobe:1;
struct bus_type *bus;
struct list_head class_interfaces;
struct kset glue_dirs;
struct mutex class_mutex;
struct class *class;
};
总线属性struct bus_attribute
linux设备中的每层都有自己特有的属性的表示方法bus_attribute
struct bus_attribute {