成功地在直接注册了一个总线,并且在总线目录下创建了属性文件,什么会在 sys/bus 目录下生成 mybus,目录以及对应的 devices,drivers, drivers_autoprobe,drivers_probe,uevent目录和属性呢?
/sys,目录下的目录都对应一个kobject,所以能猜测到 mybus,目录和 devices,drivers 目录是和 kobject,有关系的。而 kobject.一般要嵌入到其他结构体中去使用。 比如我的设备结构体
所以我们猜测这些/sys/bus/下的目录是和 struct device 结构体中的 kobj 有关系。 接下来我
们追踪 bus_register 函数, 函数原型如下所示:
这是bus_register 函数内部
开始分析
新的结构体: struct subsys private,在 Linux 中,stnuct subsys_private 结构体通常表示一个子系统(subsystem)的私有数据,每个子系统都可以有私有数据,这些礼有数据存储在 structsubsys_private 结构体中。
新的概念:子系统在 unux 中,子系统是一种机制,用于将特定功能的实现抽象为一个子系统。它可以方便地将相关的代码和数据结构封装到一起,提供给用户和应用程序使用,以实现某种特定功能。常见的子系统有:文件系统子系统:负责管理和处理文件系统的代码和数据结构,允许用户和应用程序在文件系统上存储和访问文件。网络子系统:管理和处理网络通信的代码和数据结构,提供TCP/P协议栈、网络接口设备等功能。设备驱动程序子系统:负责管理和处理系统设备的驱动程序,允许用户和应用程序通过设备接口与硬件设备进行交互。系统调用子系统:允许用户和应用程序通过系统调用接口调用内核中的功能服务。内存子系统:用于管理系统内存的代码和数据结构,包括物理内存和虚拟内存管理。
struct subsys_private *priv; //定义了一个指向 stnuctsubsys_private 结构体指针 priv。表示当前
注册的总线所示的子系统的私有数据。
priv->bus = bus;
将 priv,结构体中的 bus成员设置为当前注册的总线,这样做的目的是:将 bus 成员设置成当
前总线,priv 结构体就可以和当前总线关联。
bus->p = priv
将 priv 结构体指针存储在当前注册的总线结构体的成员p中,这样做的目的是让当前注册
的总线结构体可以快速找到并访问与之关联的 priv 结构体。
这就是 mybus目录下的 devices,drivers, uevent由来,它都是kset,kset是kobject的集合。
这两句代码就是初始化两个链表
klist init(&priv->klist devices, klist devices _get, klist devices put)的作用是
1.调用此函数的目的是:初始化一个内核链表(klist),用来存储当前注册的总线下已注册
的设备对象
2.priv,是当前注册的总线所属的子系统的私有数据,将 priv,里面的成员变量 klist devices 设
置为新创建的内核链接。
3.priv,可以记录当前注册的总线下的所有设备信息,方便进行查找和操作。klist_devices_get, klist devices_put 增加和减少引用计数。对这个链表操作不用担心会造成内存泄露
klist init(&priv->klist drivers, NUtLL, NULL);的作用是:
1.调用此函数的目的是:初始化一个内核链表(klist),用来存储当前注册的总线下已注册
的驱动对象
2..priv,是当前注册的总线所属的子系统的私有数据,将priv,里面的成员变量 klist drivers 设
置为新创建的内核链接。
3.priv ,可以记录当前注册的总线下的所有驱动信息,注意,因为没有对引用计数加减测操作
所以不能对这个内核链表进行增删改查的操作。
该函数需要传入三个参在 Linux 内核中,klist init 函数用于初始化一个内核链表(klist)
数:k:指向 structklist 结构体的指针,表示需要初始化的内核链表;一个函数指针,用于在访问 内核链表前增加相应对象的引用计数;
get:一个函数指针,用于在释放内存时减少相应对象的引用计数。
put:这些参数分别用于指定需要初始化的内核链表、以及在访问该链表时所需要调用的回调函
数。其中,get 和 put 回调函数用于对链表中的对象进行引用计数的管理,从而确保在内
存分配和释放时不会出现问题
剩下这部分的代码就是和drivers_autoprobe,drivers_probe这两个文件有关系了
再次深入体会:
1.kobject,和 kset是设备模型的基本框架(嵌入式到其他结构体来使用)
2.属性文件的作用:内核空间和用户空间数据交换。
3.sysfs,虚拟文件系统可以将设备模型的组织层次展现出来。