linux中设备驱动程序模型,Linux设备模型1 - Linux设备驱动程序学习笔记_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/10 3:32:32/文章来源:https://blog.csdn.net/weixin_30767945/article/details/116817249

extern int __must_check kobject_init_and_add(struct kobject *kobj,

struct kobj_type *ktype,

struct kobject *parent,

const char *fmt, ...);

这样的函数,所以请根据你使用的内核版本自己研究了.

kset 在一个标准的内核链表中保存了它的子节点,在大部分情况下, 被包含的 kobjects 在它们的 parent 成员中保存指向 kset内嵌的 kobject的指针,关系如下:

d19dc8ae80d0427d898acbf216b9cd86.png

图表中所有被包含的 kobjects 实际上被嵌入在一些其他类型中, 甚至可能是其他的 kset。

kset 上的操作

ksets 有类似于kobjects初始化和设置接口:void kset_init(struct kset *kset);

int kset_add(struct kset *kset);

int kset_register(struct kset *kset);

void kset_unregister(struct kset *kset);

/*管理 ksets 的引用计数:*/

struct kset *kset_get(struct kset *kset);

void kset_put(struct kset *kset);

/* kset 也有一个名字,存储于嵌入的 kobject,因此设置它的名字用:*/

kobject_set_name(&my_set->kobj, "The name");

ksets 还有一个指针指向 kobj_type 结构来描述它包含的 kobject,这个类型优先于 kobject 自身中的 ktype 。因此在典型的应用中, 在 struct kobject 中的 ktype 成员被设为 NULL, 而 kset 中的ktype是实际被使用的。

在新的内核里, kset 不再包含一个子系统指针struct subsystem * subsys, 而且subsystem已经被kset取代。

子系统

子系统是对整个内核中一些高级部分的表述。子系统通常(但不一定)出现在 sysfs分层结构中的顶层,内核子系统包括 block_subsys(/sys/block 块设备)、 devices_subsys(/sys/devices 核心设备层)以及内核已知的用于各种总线的特定子系统。

对于新的内核已经不再有subsystem数据结构了,用kset代替了。每个 kset 必须属于一个子系统,子系统成员帮助内核在分层结构中定位 kset 。

/*子系统通常用以下的宏声明:*/

decl_subsys(name, struct kobj_type *type, struct kset_uevent_ops * uevent_ops);

/*子系统的操作函数:*/

void subsystem_init(struct kset *s);

int subsystem_register(struct kset *s);

void subsystem_unregister(struct kset *s);

struct subsystem *subsys_get(struct kset *s)

void subsys_put(struct kset *s);

/*这些函数基本上是kset操作函数的包装,以实现子系统的操作*/

在新的内核里连以上的subsystem的函数都已经被取消了,完全被kset取代了。其原因可能是因为原来的subsystem的函数根本就是kset函数的简单包装,而在Linux世界里简单就是美,多余的东西被剔出了。

底层sysfs操作

kobject 是在 sysfs 虚拟文件系统后的机制。对每个在 sysfs 中的目录, 在内核中都会有一个 kobject 与之对应。每个 kobject 都输出一个或多个属性, 它在 kobject 的 sysfs 目录中以文件的形式出现, 其中的内容由内核产生。  包含 sysfs 的工作代码。

在 sysfs 中创建kobject的入口是kobject_add的工作的一部分,只要调用 kobject_add 就会在sysfs 中显示,还有些知识值得记住:

(1)kobjects 的 sysfs 入口始终为目录, kobject_add 的调用将在sysfs 中创建一个目录,这个目录包含一个或多个属性(文件);

(2)分配给 kobject 的名字( 用 kobject_set_name ) 是 sysfs 中的目录名,出现在 sysfs 层次的相同部分的 kobjects 必须有唯一的名字. 分配给 kobjects 的名字也应当是合法的文件名字: 它们不能包含非法字符(如:斜线)且不推荐使用空白。

(3)sysfs 入口位置对应 kobject 的 parent 指针。若 parent 是 NULL ,则它被设置为嵌入到新 kobject 的 kset 中的 kobject;若 parent 和 kset 都是 NULL, 则sysfs 入口目录在顶层,通常不推荐。

默认属性

当创建kobject 时, 每个 kobject 都被给定一系列默认属性。这些属性保存在 kobj_type 结构中:struct kobj_type {

void (*release)(struct kobject *);

struct sysfs_ops *sysfs_ops;/*提供实现���下属性的方法*/

struct attribute **default_attrs; /*用于保存类型属性列表(指针的指针) */

};

struct attribute {

char *name;/*属性的名字( 在 kobject 的 sysfs 目录中显示)*/

struct module *owner;/*指向模块的指针(如果有), 此模块负责实现这个属性*/

mode_t mode; /*属性的保护位,modes 的宏定义在 :例如S_IRUGO 为只读属性等等*/

}; /*default_attrs 列表中的最后一个元素必须用 0 填充*/

sysfs 读写这些属性是由 kobj_type->sysfs_ops 成员中的函数完成的:struct sysfs_ops {

ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buffer);

ssize_t (*store)(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size);

};

当用户空间读取一个属性时,内核会使用指向 kobject 的指针(kobj)和正确的属性结构(*attr)来调用show 方法,该方法将给定属性值编码进缓冲(buffer)(注意不要越界( PAGE_SIZE 字节)), 并返回实际数据长度。sysfs 的约定要求每个属性应当包含一个单个人眼可读值; 若返回大量信息,需将它分为多个属性.

也可对所有 kobject 关联的属性使用同一个 show 方法,用传递到函数的 attr 指针来判断所请求的属性。有的 show 方法包含对属性名字的检查。有的show 方法会将属性结构嵌入另一个结构, 这个结构包含需要返回属性值的信息,这时可用container_of 获得上层结构的指针以返回属性值的信息。

store 方法将存在缓冲(buffer)的数据( size 为数据的长度,不能超过 PAGE_SIZE )解码并保存新值到属性(*attr), 返回实际解码的字节数。store 方法只在拥有属性的写权限时才能被调用。此时注意:接收来自用户空间的数据一定要验证其合法性。如果到数据不匹配, 返回一个负的错误值。非默认属性

虽然 kobject 类型的 default_attrs 成员描述了所有的 kobject 会拥有的属性,倘若想添加新属性到 kobject 的 sysfs 目录属性只需简单地填充一个attribute结构并传递到以下函数:int sysfs_create_file(struct kobject *kobj, struct attribute *attr);

/*若成功,文件以attribute结构中的名字创建并返回 0; 否则, 返回负错误码*/

/*注意:内核会调用相同的 show() 和 store() 函数来实现对新属性的操作,所以在添加一个新非默认属性前,应采取必要的步骤确保这些函数知道如何实现这个属性*/

若要删除属性,调用:int sysfs_remove_file(struct kobject *kobj, struct attribute *attr);

/*调用后, 这个属性不再出现在 kobject 的 sysfs 入口。若一个用户空间进程可能有一个打开的那个属性的文件描述符,在这个属性已经被删除后,show 和 store 仍然可能被调用*/

二进制属性

sysfs 通常要求所有属性都只包含一个可读文本格式的值,很少需要创建能够处理大量二进制数据的属性。但当在用户空间和设备间传递不可改变的数据时(如上传固件到设备)就需要这个特性。二进制属性使用一个 bin_attribute 结构来描述:struct bin_attribute {

struct attribute    attr;/*属性结构体*/

size_t            size;/*这个二进制属性的最大大小(若无最大值则为0)*/

void            *private;

ssize_t (*read)(struct kobject *, char *, loff_t, size_t);

ssize_t (*write)(struct kobject *, char *, loff_t, size_t);

/*read 和 write 方法类似字符驱动的读写方法;,在一次加载中可被多次调用,每次调用最大操作一页数据,且必须能以其他方式判断操作数据的末尾*/

int (*mmap)(struct kobject *, struct bin_attribute *attr,

struct vm_area_struct *vma);

};

/*二进制属性必须显式创建,不能以默认属性被创建,创建一个二进制属性调用:*/

int sysfs_create_bin_file(struct kobject *kobj, struct bin_attribute *attr);

/*删除二进制属性调用:*/

int sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr);

符号链接

sysfs 文件系统具有树型结构, 反映 kobject之间的组织层次关系。为了表示驱动程序和所管理的设备间的关系,需要额外的指针,其在 sysfs 中通过符号链接实现。/*在 sysfs 创建一个符号链接:*/

int sysfs_create_link(struct kobject *kobj, struct kobject *target, char *name);

/*函数创建一个链接(name)指向target的 sysfs 入口作为 kobj 的一个属性,是一个相对连接,与它在sysfs 系统中的位置无关*/

/*删除符号连接调用:*/

void sysfs_remove_link(struct kobject *kobj, char *name);

热插拔事件产生

一个热插拔事件是一个从内核空间发送到用户空间的通知, 表明系统配置已经改变. 无论 kobject 被创建或删除,都会产生这种事件。热插拔事件会导致对 /sbin/hotplug 的调用, 它通过加载驱动程序, 创建设备节点, 挂载分区或其他正确动作响应事件。

热插拔事件的实际控制是通过一套存储于 kset_uevent_ops (《LDD3》中介绍的struct kset_hotplug_ops * hotplug_ops;在2.6.22.2中已经被kset_uevent_ops 结构体替换)结构的方法完成:struct kset_uevent_ops {

int (*filter)(struct kset *kset, struct kobject *kobj);

const char *(*name)(struct kset *kset, struct kobject *kobj);

int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp,

int num_envp, char *buffer, int buffer_size);

};

可以在 kset 结构的uevent_ops 成员中找到指向kset_uevent_ops结构的指针。

若在 kobject 中不包含指定的 kset , 内核将通过 parent 指针在分层结构中进行搜索,直到发现一个包含有kset的 kobject ; 接着使用这个 kset 的热插拔操作。

kset_uevent_ops 结构中的三个方法作用如下:

(1) filter 函数让 kset 代码决定是否将事件传递给用户空间。如果 filter 返回 0,将不产生事件。以磁盘的 filter 函数为例,它只允许kobject产生磁盘和分区的事件,源码如下:

static int block_hotplug_filter(struct kset *kset, struct kobject *kobj)

{

struct kobj_type *ktype = get_ktype(kobj);

return ((ktype == &ktype_block) || (ktype == &ktype_part));

}

(2) 当调用用户空间的热插拔程序时,相关子系统的名字将作为唯一的参数传递给它。name 函数负责返回合适的字符串传递给用户空间的热插拔程序。

(3)热插拔脚本想得到的任何其他参数都通过环境变量传递。uevent 函数的作用是在调用热插拔脚本之前将参数添加到环境变量中。函数原型:

int (*uevent)(struct kset *kset, struct kobject *kobj, /*产生事件的目标对象*/

char **envp,/*一个保存其他环境变量定义(通常为 NAME=value 的格式)的数组*/

int num_envp, /*环境变量数组中包含的变量个数(数组大小)*/

char *buffer, int buffer_size/*环境变量被编码后放入的缓冲区的指针和字节数(大小)*/

/*若需要添加任何环境变量到 envp, 必须在最后的添加项后加一个 NULL 入口,使内核知道数组的结尾*/

);

/*返回值正常应当是 0,若返回非零值将终止热插拔事件的产生*/

热插拔事件的产生通常是由在总线驱动程序层的逻辑所控制。

以上是Linux设备模型的底层原理简介,具体的细节应该参阅内核源码和《ULK3》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_738802.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目交友网如何实现,基于jsp的交友网站-JavaEE实现交友网站 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的交友网站, 该项目可用各类java课程设计大作业中, 交友网站的系统架构分为前后台两部分, 最终实现在线上进行交友网站各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类交友网站相关的实体进行管理。该交友…

看板娘全是php的怎么办,【教程】给网站添加互动二次元看板娘老婆

【本教程来自网络,已亲测可用,以下教程为详解,如有问题请指出】【关于二次元看板娘】这是在PC网页上的效果及位置这是在手机端的效果(可能没有对话框,因为没有电脑端的鼠标指示)教程开始首先你要有自己的服务器和网站 (废话)&…

win2008支持mysql asp.net_asp.net网站部署在云服务器windows server 2008上

搭建一个网站需要以下4个准备:1.域名解析2.(云)服务器3.数据库4.网站代码其中1可以可以去DNSPOD申请,同时需要进行备案,在上面就都可以完成。2用的是阿里云服务器windows server 2008 R2,去阿里云购买一个,一般400多一个月就好。3…

推荐一些学习软件编程的网站

给大家推荐一些学习软件编程的网站,综合了老师和同学,包括自己收藏的,有用的网站。学习软件不是一件很容易的事,作为一名程序员,我们每天除了睡觉,吃饭,就是打代码。一直以来,我们的…

从运维角度看中大型网站架构的演变之路

前言网上有很多文章类似于我今天要分享的课程,有架构师写的,有运维写的,还有开发些的,偏重点都不同,今天我以咱们运维角度全面讲解。一个成熟的网站架构并不是一开始设计就具备高可用、高伸缩、高性能等特性的&#xf…

杨泽业:给你的网站添加百度自动推送页面代码

最近我的 博客添加了360的自动推送页面代码,今天浏览百度的官方文件里面,也发现了,其实百度也是可以把你自己的网站内容自动推送到百度搜索引擎里面,以方便更快的收录。看完了百度官方的介绍,也是和360推送一样的&…

SEO独家揭秘:政府高权重锚文本虚拟外链技术!

最近不少人都在问怎么做外链,其实外链严格来说有两种,一种用于投票,一种用于单纯的吸引蜘蛛抓取。虽然外链的作用的本质还有一种,就是引流,但是大多数情况下不现实,除非是一些导航网站才有可能做到这些真正…

如何用 Python 爬取需要登录的网站?

2019独角兽企业重金招聘Python工程师标准>>> 最近我必须执行一项从一个需要登录的网站上爬取一些网页的操作。它没有我想象中那么简单,因此我决定为它写一个辅助教程。 在本教程中,我们将从我们的bitbucket账户中爬取一个项目列表。 教程中的…

[SakuraiYo][软工作业(4)]用户体验分析:以 “师路南通网站” 为例

一.页面初览(“师路南通”、“UMU学习平台”、“学生安全教育平台”) 1.“师路南通”页面初览。 *初览亮点:进入网站时的欢迎页面,不仅切合网站主题,且会变幻显示各类相关知识内容,会一定程度上…

简单动态网站搭建

如何在windows服务器上配置wordPress和discuz 网站建设中的概念讲解 网站建设的基础操作 网站程序的基础使用 网站程序的优化 简单动态网站搭建 软件部署域名和主机的购买 域名解析 环境部署 安装程序 软件的使用和优化 wordpress的基础设置和使用 discuz的基础设置…

超强的工具集合,只需要这一个网站足以!墙都不服我就只服它!

随着信息化时代的普及,很多功能性的网站如雨后春笋般出现,比如VIP解析、音乐搜索及影视观看等,但是这些网站只有屈指可数的几种功能,功能都比较单一。 今天给大家推荐一个功能强大到你无法想象的工具集合网站,拥有上百…

大学我都是自学走来的,这些私藏的实用工具/学习网站我贡献出来了,建议收藏精品推荐

作者 | Jeskson 来源 | 达达前端小酒馆 1 https://www.h5jun.com/archives/ 十年踪迹的博客 2 https://www.zhangxinxu.com/ 3 http://www.ruanyifeng.com/home.html 4 https://www.cnblogs.com/yexiaochai/ 5 https://www.cnblogs.com/rubylouvre/ 6 https://www.cnblogs.…

jar包下载网站

http://mvnrepository.com/ 【下载方式】 javadoc是文档(可选) sources是源代码(可选) jar可以通过外部引入加入工程的buildpath

IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)

IIS - 自动申请、部署Lets Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一、HTTPS 协议介绍 1,什么是 HTTPS 协议? HTTPS(全称:Hyper Text Transfer …

使用CSS3开启GPU硬件加速提升网站动画渲染性能

遇到的问题: 网站本身设计初衷就没有打算支持IE8及以下版本浏览器,并不是因为代码兼容性问题,而是真的不想迁就那些懒得更新自己操作系统和浏览器的用户,毕竟是我自己的网站,所以我说了算!哈哈~ 没有了低版…

织梦怎么样备份网站

很多用织梦的朋友不知道怎么备份网站,还有些朋友备份网站的方式不对。当遇到网站被黑、服务器到期等关键时刻,导致数据丢失,网站不能用。新搭建网站就得一切从头再来,找技术恢复,又是一笔不小的开支。这是一种无形的损…

19期-当你在百度搜索关键字的时候,哪个网站会排在最前面?今天给大家科普一下“网站SEO”

前言 什么是SEO呢?SEO是Search Engine Optimization,意为“搜索引擎优化”,一般简称为搜索优化。对于SEO的主要工作就是通过了解各类搜索引擎如何抓取互联网页面,如何进行索引以及如何确定其对某一个特定关键词的搜索结果排名等技…

工具网站

http://tool.oschina.net/

技术整合网站

表格功能实现 1.阿里的easyexecl 数据导出功能实现 https://blog.csdn.net/weixin_38546942/article/details/87878983 2.Apache POI的实现方式 https://www.cnblogs.com/huajiezh/p/5467821.html