前面讲过注册自己的总线,那么注册流程是怎样的呢? 这里就需要分析下。
前言
- 在 在总线目录下创建属性文件 驱动-注册自己的总线并创建属性文件 中,我们在总线目录 /sys/bus 目录下创建了自己的总线。 总线下面有几个目录:devices/drivers/drivers_autoproobe/drivers_probe/uevent, 那么这几个目录是怎么来的。
- 注册总线我们就调用了一个方法:bus_register,那么这个api 做了什么事情。
解决上面两个疑惑,就是分析 bus_register 这个方法,里面到底做了什么,理解流程、分析过程,通过这些来初步理解总线。
参考资料
迅为设备模型资料参考
注册一个自己的总线
在总线目录下创建属性文件
驱动-注册自己的总线并创建属性文件
总线注册流程理论分析实验
linux bus_register过程
Linux设备驱动模型简述(源码剖析)
驱动-平台总线-platform设备注册platform驱动注册篇
驱动-平台总线-probe
之前了解过平台总线platform 设置注册、驱动注册、平台总线probe 知识点。当了解这里bus 总线知识点时候好多地方似曾相识,拿来对比、参考、知识温习。
相关在线源码参考:
bus_register
kobject_set_name
kset_create_and_add
kset_create
kobject_set_name
一、结构体 subsys_private
注册总线,如下api 调用:
ret = bus_register(&mybus); // 注册总线
简单看一下 bus_register 源码:
**
* bus_register - register a driver-core subsystem
* @bus: bus to register
*
* Once we have that, we register the bus with the kobject
* infrastructure, then register the children subsystems it has:
* the devices and drivers that belong to the subsystem.
*/
int bus_register(struct bus_type *bus)
{
int retval;
struct subsys_private *priv; // 第一个结构体成员就是 subsys_private ,我们就先分析它
struct lock_class_key *key = &bus->lock_key;
......
return retval;
}
struct subsys_private 是 Linux 内核设备模型(Device Model)中的核心数据结构,用于管理总线、设备和驱动程序的内部状态。
结构体定义
struct subsys_private {
struct kset subsys;
struct kset *devices_kset;
struct list_head interfaces;
struct mutex mutex;
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 kset glue_dirs;
struct class *class;
};
核心参数详解
subsys (kset)
- 核心
kset对象,表示该子系统的顶层目录 - 在
sysfs中表现为一个目录,包含该总线的所有设备和驱动程序 - 用于实现内核对象的热插拔支持
我们分析下代码:
bus_register 方法中 代码片段:
struct subsys_private *priv;
struct lock_class_key *key = &bus->lock_key;
priv = kzalloc(sizeof(struct subsys_private),

最低0.47元/天 解锁文章
1054

被折叠的 条评论
为什么被折叠?



