linux设备树的建立过程
为了阐明表示总线、设备和设备驱动程序的各个数据结构之间彼此的关联,它们的注册过程是很有必要的。顺序一定是如下:(1)注册总线---bus_register;(2)注册设备device_register;(3)注册设备驱动程序----bus_add_driver。
下文摘自:点击打开链接
= &bus->drivers ; 想象一下我们折腾了那么长时间的 kobject 与 kset 的意义,是的,这里就是将 driver 的 kobj 所属的 kset 挂接上总线的 kset 。我们这里显得很绕对吗?幸运的是我在网上找到了一个非常棒的示意图:

我该怎么样来形容这个图呢? 它把依赖关系说的已经足够清楚了!!我这里唯一要解释的仅仅是在驱动文件夹被正确后所谓的文件属性有在那里。同样我们顺着目录 /sys/bus/sdio/driver/wlan_sdio/ 下我们发现了 bind 、unbind 和 new_id 三个文件。
好了,别忘了我们在前面提过的问题,kset 是如何扮演容器的角色的呢?图中很清楚吧,看看粉红色的箭头,kset children list用来将将同类型的kobject连接起来以达到容器的效果。
但是我们的驱动还没有结束,关于这个图的建立,我们势必要用代码才能说得明白。
我们还是花费一点时间来看一下内核中的代码,关于 sdio 总线注册的代码部分,其它的部分,大家类举就可以了。懂了这段自然就懂了全部:
int bus_register( struct bus_type
* bus)
{
int retval;
BLOCKING_INIT_NOTIFIER_HEAD (&bus->bus_notifier);
retval = kobject_set_name(&bus->subsys.kobj, "%s", bus->name); // 总线的名字 ”sdio”, 我们说过了一个 kobject对应一个目录,这时会为这个目录赋值名字。
if (retval)
goto out;
bus->subsys.kobj.kset = &bus_subsys; // 将其 kset 指向 bus_subsys., 如何理解? 看看ldd_bus_type 指向 bus_subsys 的那条蓝线
retval = subsystem_register(&bus->subsys); //bus->subsys 的注册,实际上是用 kset 指针将其链接在一起。好吧 我得承认实际上这里取消了 subsysem 结构的概念,用 kset 代替了。这里会创建一个目录。它是一个 kset 也是一个 kobject,因为 kset 包含了 kobject 。
if (retval)
goto out;
retval = bus_create_file(bus, &bus_attr_uevent); // 创建属性文件
if (retval)
goto bus_uevent_fail;
kobject_set_name(&bus->devices.kobj, "devices"); // 设置 devices
kset 的名字为 devices
bus->devices.kobj.parent = &bus->subsys.kobj; // 参见 ldd_bus_type->devices 指向 ldd_bus_type->sub_sys的红色箭头(注意这里也不是 subsystem, 而是 kset )
retval = kset_register(&bus->devices); // 创建 devices 命名的目录
if (retval)
goto bus_devices_fail;
kobject_set_name(&bus->drivers.kobj, "drivers"); // 设置 devices
kset 的名字为 drivers
bus->drivers.kobj.parent = &bus->subsys.kobj; // 同样参见 ldd_bus_type->drivers 指向 ldd_bus_type->sub_sys的红色箭头(注意这里也不是 subsystem, 而是 kset )。
bus->drivers.ktype = &driver_ktype; // 对 kobject 默认属性的赋值
retval = kset_register(&bus->drivers); // 创建 drivers 命名的目录
if (retval)
goto bus_drivers_fail;
klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put); //klist 结构的初始化,关于 klist 链接的作用我们已经说得很清楚了
klist_init(&bus->klist_drivers, NULL, NULL);
bus->drivers_autoprobe = 1;
retval = add_probe_files(bus); // 添加探测属性
if (retval)
goto bus_probe_files_fail;
retval = bus_add_attrs(bus); // 添加其他属性
if (retval)
goto bus_attrs_fail;
pr_debug("bus type '%s' registered/n", bus->name);
return 0;
bus_attrs_fail :
remove_probe_files(bus);
bus_probe_files_fail :
kset_unregister(&bus->drivers);
bus_drivers_fail :
kset_unregister(&bus->devices);
bus_devices_fail :
bus_remove_file(bus, &bus_attr_uevent);
bus_uevent_fail :
subsystem_unregister(&bus->subsys);
out :
return retval;
}
至此 我们终于理顺了整个过程。
linux设备树的建立过程的更多相关文章
- 宋牧春: Linux设备树文件结构与解析深度分析(2) 【转】
转自:https://mp.weixin.qq.com/s/WPZSElF3OQPMGqdoldm07A 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...
- linux 设备树【转】
转自:http://blog.csdn.net/chenqianleo/article/details/77779439 [-] linux 设备树 为什么要使用设备树Device Tree 设备树的 ...
- linux设备树语法
设备树语法及绑定 概述 Device Tree是一种用来描述硬件的数据结构,类似板级描述语言,起源于OpenFirmware(OF). 就ARM平台来说,设备树文件存放在arch/arm/boot/d ...
- 【转载】Linux设备树(Device Tree)机制
转:Linux设备树(Device Tree)机制 目录 1. 设备树(Device Tree)基本概念及作用2. 设备树的组成和使用 2.1. DTS和DTSI 2.2. DTC 2.3. DT ...
- Linux设备树语法详解
概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代 ...
- Linux设备树语法详解【转】
转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...
- Linux设备树学习
1.概念 设备树用于实现驱动代码与设备信息相分离.驱动代码只负责处理驱动的逻辑而关于设备的具体信息存放到设备树文件中.(dts文件,编译后为dtb文件).一个dts文件对应一个ARM的machine, ...
- Linux内核树的建立-基于ubuntu系统
刚看 O'REILLY 写的<LINUX 设备驱动程序>时.作者一再强调在编写驱动程序时必须 建立内核树.先前的内核只需要有一套内核头文件就够了,但因为2.6的内核模块吆喝内核源码树中的目 ...
- linux设备驱动程序注冊过程具体解释
Linux的驱动程序注冊过程,大致分为两个步骤: 模块初始化 驱动程序注冊 以下以内核提供的演示样例代码pci-skeleton.c,具体说明一个pci设备驱动程序的注冊过程.其它设备的驱动代码注冊过 ...
随机推荐
- mysql索引原理及优化(四)
聚簇索引和非聚簇索引 分析了MySQL的索引结构的实现原理,然后我们来看看具体的存储引擎怎么实现索引结构的,MySQL中最常见的两种存储引擎分别是MyISAM和InnoDB,分别实现了非聚簇索引和聚簇 ...
- ElementUi tree 指定节点是否显示复选框
场景:树的内容是省份下面的城市有酒店 需求:只能多选酒店(为了删除它们),至于为啥不能选省份或者城市更加灵活的去删除相应酒店,这你得去问后台0.0,他只弄了根据酒店id去删除.嗯,连创建酒店的时候级联 ...
- [LeetCode] 249. Group Shifted Strings 分组偏移字符串
Given a string, we can "shift" each of its letter to its successive letter, for example: & ...
- C++和C API调用
c++是C的超集,不可避免的要兼容C的特性,C++在C基础山的拓展部分叫做C with class,同时C++有自己特有的属性比如模板template. C并不完全是C++的子集. 那么如何在C/C+ ...
- Idea破解到2100年的简单方法
第一步下载IntelliJ IDEA 2018.1.6版本,比这个更新的版本得你自己找注册码,因为旧的注册码对最新版本的软件不管用,所以建议还是下载这个版本,或者这个版本之前的也可以: 地址:http ...
- INV*账户别名接收发放
DECLARE --p_old_new_flag OLD 为导出 NEW 为导入 l_iface_rec inv.mtl_transactions_interface%ROWTYPE; l_iface ...
- 使用 python 进行微信好友分析
使用 python 进行微信好友分析 1. 使用到的库 ① wxpy:初始化微信机器人 ② openpyxl:保存微信好友数据为Excel表格 ③ pyecharts:生成可视化的地图 ④ wordc ...
- 40 多线程(十二)——ReentrantLock 可重入锁
我们使用的synchronized加的锁是可以延续使用的,如下: public void test() { //第一次获得锁 synchronized(this) { while(true) { // ...
- python3 最基础
python 2乱码,源码混了,代码重复,ascii码 一个字节表示 显示中文 只有英文 python 3 utf-8 三个字节 表示中文 int 整型 str 字符串 类型 bool 布尔值 Tru ...
- REST-framework之频率组件
REST-framework之频率控制 一 频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二 自定义频率类,自定义频率规则 自定义的逻辑 ""&qu ...