教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

linux设备模型深探

来源:网络收集 时间:2026-08-05
导读: 一:前言 Linux设备模型是一个极其复杂的结构体系,在编写驱动程序的时候,通常不会用到这方面的东西,但是。理解这部份内容,对于我们理解linux设备驱动的结构是大有裨益的。我们不但可以在编写程序程序的时候知其然,亦知其所以然。又可以学习到一种极其精

一:前言

Linux设备模型是一个极其复杂的结构体系,在编写驱动程序的时候,通常不会用到这方面的东西,但是。理解这部份内容,对于我们理解linux设备驱动的结构是大有裨益的。我们不但可以在编写程序程序的时候知其然,亦知其所以然。又可以学习到一种极其精致的架构设计方法。由于之前已经详细分析了sysfs文件系统。所以本节的讨论主要集中在设备模型的底层实现上。上层的接口,如pci.,usb ,网络设备都可以看成是底层的封装。

二:kobject ,kset和ktype

Kobject,kset,kypte这三个结构是设备模型中的下层架构。模型中的每一个元素都对应一个kobject.kset和ktype可以看成是kobject在层次结构与属性结构方面的扩充。将三者之间的关系用图的方示描述如下:

如上图所示:我们知道。在sysfs中每一个目录都对应一个kobject.这些kobject都有自己的parent。在没有指定parent的情况下,都会指向它所属的kset->object。其次,kset也内嵌了kobject.这个kobject又可以指它上一级的parent。就这样。构成了一个空间上面的层次关系。

其实,每个对象都有属性。例如,电源管理,执插拨事性管理等等。因为大部份的同类设备都有相同的属性,因此将这个属性隔离开来,存放在ktype中。这样就可以灵活的管理了.记得在分析sysfs的时候。对于sysfs中的普通文件读写操作都是由kobject->ktype->sysfs_ops来完成的.

经过上面的分析,我们大概了解了kobject.kset与ktype的大概架设与相互之间的关系。下面我们从linux源代码中的分析来详细研究他们的操作。

三:kobject,kset和ktype的操作

为了说明kobject的操作,先写一个测试模块,代码如下:

#include

#include

#include

#include

#include

#include

#include

MODULE_AUTHOR(\

MODULE_LICENSE(\

void obj_test_release(struct kobject *kobject);

ssize_t eric_test_show(struct kobject *kobject, struct attribute *attr,char *buf);

ssize_t eric_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count);

struct attribute test_attr = {

.name = \

.mode = S_IRWXUGO, };

static struct attribute *def_attrs[] = {

&test_attr,

NULL, };

struct sysfs_ops obj_test_sysops = {

.show = eric_test_show,

.store = eric_test_store, };

struct kobj_type ktype = {

.release = obj_test_release,

.sysfs_ops=&obj_test_sysops,

.default_attrs=def_attrs, };

void obj_test_release(struct kobject *kobject) {

printk(\ }

ssize_t eric_test_show(struct kobject *kobject, struct attribute *attr,char *buf) {

printk(\

printk(\

sprintf(buf,\

return strlen(attr->name)+2; }

ssize_t eric_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count) {

printk(\

printk(\

return count; }

struct kobject kobj;

static int kobject_test_init() {

printk(\

kobject_init_and_add(&kobj,&ktype,NULL,\

return 0; }

static int kobject_test_exit() {

printk(\

kobject_del(&kobj);

return 0; }

module_init(kobject_test_init);

module_exit(kobject_test_exit);

加载模块之后,会发现,在/sys下多了一个eric_test目录。该目录下有一个叫eric_xiao的文件。如下所示:

[root@localhost eric_test]# ls

eric_xiao

用cat察看此文件:

[root@localhost eric_test]# cat eric_xiao

eric_xiao

再用echo往里面写点东西;

[root@localhost eric_test]# echo hello > eric_xiao

Dmesg的输出如下:

have show.

attrname:eric_xiao.

havestore

write: hello

…… 此处隐藏:388字,全部文档内容请下载后查看。喜欢就下载吧 ……
linux设备模型深探.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/448127.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)