笔记整理—linux驱动开发部分(5)linux设备驱动模型

news/2025/3/14 22:11:59/

        类(class)、总线(bus)、设备(device)、驱动(driver)这四个结构体可以实例化从而形成驱动模型。

        kobject是抽象的内核对象的父类。对象的生命周期是在kobject中有相关机制实现的。

        sysfs,在内核与用户空间建立映射为虚拟文件,是内核结构的一种体现,可用echo操作设备节点。

        udev,用户空间得知驱动状态的虚拟文件,可创建设备文件节点。

        为什么要存在设备驱动模型:①面对越来越多的设备、功耗等要求的特殊性,要求驱动体系更易用、更优秀。②设备驱动模型负责统一实现、维护一些特性,如电源管理、热插拔、对象生命周期、用户空间与驱动空间的加护等基础设施。③设备驱动模型目的是简化驱动程序的编写,但在客观上设备驱动模型与设计很复杂。

        热插拔180\,插上就能挂载驱动,拔下就能卸载驱动。

        设备驱动模型,更好的实现交互,将用户空间与驱动空间更好的结合。

        kobject结构体,各种结构体定义的变量包括,class、bus、driver、device,提供了公用型服务:如对象引用计数;维护对象链表;对象上锁;用户空间等。

struct kobject {const char		*name;//名字struct list_head	entry;//挂接平行链表struct kobject		*parent;//挂接上层链表struct kset		*kset;//提供上锁服务struct kobj_type	*ktype;//对用户空间表示struct sysfs_dirent	*sd;//文件系统目录节点struct kref		kref;//引用计数,(几个对象在使用)用于维护生命周期unsigned int state_initialized:1;//是否初始化完成unsigned int state_in_sysfs:1;//是否完成文件创建unsigned int state_add_uevent_sent:1;//是否发送过添加的ueventunsigned int state_remove_uevent_sent:1;//是否发送过移除的ueventunsigned int uevent_suppress:1;//是否忽略uevent
};

        设备驱动模型中,各对象中都有一个kobject,kobject相当于面向对象的总基类。

        kobj_type(ktype),每个kobject都要绑定一个ktype,是一个指针,指向外面的一个结构体,不在kobject中实现。

struct kobj_type {void (*release)(struct kobject *kobj);//释放方法,引用计数为0时则全部free,否则引用计数-1const struct sysfs_ops *sysfs_ops;//show、store方法struct attribute **default_attrs;//文件属性有多个文件const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);const void *(*namespace)(struct kobject *kobj);
};

        ktype本质是在sysfs中的操作方法。kset结构体也是kobject的绑定。

struct kset {struct list_head list;//一个集合kobject的链表spinlock_t list_lock;//自旋锁struct kobject kobj;//自身的kobjectconst struct kset_uevent_ops *uevent_ops;//uevent相关实现
};

        kset是kobject的容器类,用于做顶层容器。kset主要目的是为各kobject各目录做框架。kset是做目录与层级调度的;ktype是目录中的文件操作方法;kobject是模型最基础是属性。

        总线式设备驱动组成方式。总线是在物理层面上的一种设备,是一种结构,一种树状的结构,起到连接的作用(bus)。

        驱动框架中的总线是用于管理驱动的一种方式,帮助内核进行设备与驱动管理,总线或设备驱动的管理方式。         

        总线bus_type结构体在/sysfs中可见名字,struct bus_type在/sysfs/bus中分为devices与drivers进行管理。

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);//设备与驱动匹配方式//等等抽象的管理方法与功能int (*uevent)(struct device *dev, struct kobj_uevent_env *env);int (*probe)(struct device *dev);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 bus_type_private *p;
};

        设备部分:struct device是设备结构体,是硬件在内核中的抽象,通常是被包含的对象;device_register注册设备,由驱动框架提供。

        驱动部分:struct device_driver是驱动在内核中的抽象,*name与struct device中的*name相匹配;int(*probe) ()是驱动探测方法,用于检测一个设备是否可被该驱动管理(驱动能不能与硬件相对应)。

        类class,用于提供一些功能,用于管理设备。是一个容器。/sys/class提供udev功能,总线从设备连接角度管理(连的什么总线方式),类从设备种类进行管理(是什么种类的设备)。

        总线中在一个总线管理方法中的文件,在class中可能分为两类,类与总线是相关联的,但二者都在/sys/devices中实现。

        模型构想:面向对象;继承思想;父类是共性,子类是个性。绑定的是指针,包含是实际struct套struct而不是struct指针。


http://www.ppmy.cn/news/1544329.html

相关文章

ElasticSearch - Bucket Script 使用指南

文章目录 官方文档Bucket Script 官文1. 什么是 ElasticSearch 中的 Bucket Script?2. 适用场景3. Bucket Script 的基本结构4. 关键参数详解5. 示例官方示例:计算每月 T 恤销售额占总销售额的比率百分比示例计算:点击率 (CTR) 6. 注意事项与…

Python代码解析:处理JSON数据并导入Neo4j数据库

Python代码解析:处理JSON数据并导入Neo4j数据库 引言代码结构概览代码详解1. 导入必要的库2. 定义数据文件路径3. 读取JSON文件内容4. 连接Neo4j服务器5. 遍历数据并处理 总结参考资料 引言 在数据处理和分析中,JSON是一种常见的数据格式。Neo4j是一个高…

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天,电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界,更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

详解Envoy

23-1-Envoy 你觉得为什么它能击败Nginx以及HAProxy等竞品,成为Service Mesh体系核心? Envoy 是由 Lyft 开发并开源的一款高性能开源代理,近年来迅速成为 Service Mesh 体系的核心组件之一。它之所以能够击败 Nginx 和 HAProxy 等竞品&#xf…

进程守护SuperVisord内部的进程定时监测并重启

一个swoole的wensocket程序运行在SuperVisord下端口9503 设置一个每分钟任务监测9503的端口链接数,输出链接数,并在链接数为0的情况下重启wensocket进程。 以下截图是宝塔面板环境下 #!/bin/bash current$(date %H.%M) ws9503_procnumnetstat -nat | gre…

2024年网鼎杯朱雀组|MISC

1.MISC01 文件打开一堆01,差分曼彻斯特 from libnum import * f open("data","r",encoding"utf-8") all_str f.read() f.close() out "" n (len(all_str) // 2) - 1 for i in range(0, n):tmp1 all_str[i*2:i*22]tmp…

LeetCode3226题. 使两个整数相等的位更改次数解法二(原创)

我之前文章LeetCode3226题. 使两个整数相等的位更改次数(原创)-CSDN博客对于LeetCode第3226题中给出了解法,后来思考了一下可以用位操作来完成更简洁优雅的实现: 首先计算n和k的异或值m.m中的所有位数中为1的值就是n中为1k中为0&…

【题】C#-数组:二维数组

1. 将1~10000赋值给一个二维数组(100行100列) int[,] array new int[100,100]; int index 1; for(int i 0;i < array.GetLength(0);i){for(int j 0;j < array.GetLength(1);j){array[i,j] index;index;} }2. 将二维数组的右上半部分置零 int[,] array new int[4,…