没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux那些事儿 之 我是Sysfs上.pdf
Linux那些事儿 之 我是Sysfs上.pdf
4星 · 超过85%的资源 需积分: 33 65 下载量 96 浏览量
更新于2023-07-20
1
收藏 364KB PDF 举报
"sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace.” --- documentation/filesystems/sysfs.txt 可以先把documentation/filesystems/sysfs.txt读一遍。文档这种东西,真正读起来就嫌少了。Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。 去/sys看一看, localhost:/sys#ls /sys/ block/ bus/ class/ devices/ firmware/ kernel/ module/ power/ Block目录:包含所有的块设备 Devices目录:包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构 Bus目录:包含系统中所有的总线类型 Drivers目录:包括内核中所有已注册的设备驱动程序 Class目录:系统中的设备类型(如网卡设备,声卡设备等)
资源详情
资源推荐
Linux那些事儿之我是Sysfs(1)sysfs初探
"sysfs is a ram-based filesystem initially based on ramfs. It provides a
means
to export kernel data structures, their attributes, and the linkages between
them to
userspace.” --- documentation/filesystems/sysfs.txt
可以先把 documentation/filesystems/sysfs.txt 读一遍。文档这种东西,真正读起来就
嫌少了。Sysfs 文件系统是一个类似于 proc 文件系统的特殊文件系统,用于将系统中的设
备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。
去/sys 看一看,
localhost:/sys#ls /sys/
block/ bus/ class/ devices/ firmware/ kernel/ module/ power/
Block 目录:包含所有的块设备
Devices 目录:包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构
Bus 目录:包含系统中所有的总线类型
Drivers 目录:包括内核中所有已注册的设备驱动程序
Class 目录:系统中的设备类型(如网卡设备,声卡设备等)
sys 下面的目录和文件反映了整台机器的系统状况。比如 bus,
localhost:/sys/bus#ls
i2c/ ide/ pci/ pci express/ platform/ pnp/ scsi/ serio/ usb/
里面就包含了系统用到的一系列总线,比如 pci, ide, scsi, usb 等等。比如你可以在 usb
文件夹中发现你使用的 U 盘,USB 鼠标的信息。
我们要讨论一个文件系统,首先要知道这个文件系统的信息来源在哪里。所谓信息来
源是指文件组织存放的地点。比如,我们挂载一个分区,
mount -t vfat /dev/hda2 /mnt/C
我们就知道挂载在/mnt/C 下的是一个 vfat 类型的文件系统,它的信息来源是在第一
块硬盘的第 2 个分区。
但是,你可能根本没有去关心过 sysfs 的挂载过程,她是这样被挂载的。
mount -t sysfs sysfs /sys
ms 看不出她的信息来源在哪。sysfs 是一个特殊文件系统,并没有一个实际存放文件
的介质。断电后就玩完了。简而言之,sysfs 的信息来源是 kobject 层次结构,读一个 sys
fs 文件,就是动态的从 kobject 结构提取信息,生成文件。
所以,首先,我要先讲一讲 sysfs 文件系统的信息来源 -- kobject 层次结构。kobj
ect 层次结构就是 linux 的设备模型。
Linux那些事儿之我是Sysfs(2)linux设备底层模型
关于 linux 设备模型网上有一些论述,有些东西我就用了拿来主义,进行了修改和整
理。
§1 Kobject
Kobject 是 Linux 2.6 引入的新的设备管理机制,在内核中由 struct kobject 表示。通
过这个数据结构使所有设备在底层都具有统一的接口,kobject 提供基本的对象管理,是构
成 Linux2.6 设备模型的核心结构,它与 sysfs 文件系统紧密关联,每个在内核中注册的 k
object 对象都对应于 sysfs 文件系统中的一个目录。Kobject 是组成设备模型的基本结构。
类似于 C++中的基类,它嵌入于更大的对象的对象中--所谓的容器--用来描述设备模型的
组件。如 bus,devices, drivers 都是典型的容器。这些容器就是通过 kobject 连接起来
了,形成了一个树状结构。这个树状结构就与/sys 向对应。
kobject 结构为一些大的数据结构和子系统提供了基本的对象管理,避免了类似机能的重
复实现。这些机能包括
- 对象引用计数.
- 维护对象链表(集合).
- 对象上锁.
- 在用户空间的表示.
Kobject 结构定义为:
struct kobject {
char * k name; 指向设备名称的指针
char name[KOBJ NAME LEN]; 设备名称
struct kref kref; 对象引用计数
struct list head entry; 挂接到所在 kset 中去的单元
struct kobject * parent; 指向父对象的指针
struct kset * kset; 所属 kset 的指针
struct kobj type * ktype; 指向其对象类型描述符的指针
struct dentry * dentry; sysfs 文件系统中与该对象对应的文件节点路径指针
};
其中的 kref 域表示该对象引用的计数,内核通过 kref 实现对象引用计数管理,内核提供两
个函数 kobject_get()、kobject_put()分别用于增加和减少引用计数,当引用计数为 0
时,所有该对象使用的资源释放。Ktype 域是一个指向 kobj type 结构的指针,表示该对
象的类型。
相关函数
void kobject_init(struct kobject * kobj);kobject 初始化函数。
int kobject_set_name(struct kobject *kobj, const char *format, ...);设置指定
kobject 的名称。
struct kobject *kobject_get(struct kobject *kobj);将 kobj 对象的引用计数加 1,
同时返回该对象的指针。
void kobject_put(struct kobject * kobj); 将 kobj 对象的引用计数减 1,如果引用
计数降为 0,则调用 kobject release()释放该 kobject 对象。
int kobject_add(struct kobject * kobj);将 kobj 对象加入 Linux 设备层次。挂接该
kobject 对象到 kset 的 list 链中,增加父目录各级 kobject 的引用计数,在其 parent 指
向的目录下创建文件节点,并启动该类型内核对象的 hotplug 函数。
int kobject_register(struct kobject * kobj);kobject 注册函数。通过调用 kobject
init()初始化 kobj,再调用 kobject_add()完成该内核对象的注册。
void kobject_del(struct kobject * kobj);从 Linux 设备层次(hierarchy)中删除 ko
bj 对象。
void kobject_unregister(struct kobject * kobj);kobject 注销函数。与 kobject r
egister()相反,它首先调用 kobject del 从设备层次中删除该对象,再调用 kobject put
()减少该对象的引用计数,如果引用计数降为 0,则释放 kobject 对象。
§2 Kobj type
struct kobj_type {
void (*release)(struct kobject *);
struct sysfs_ops * sysfs_ops;
struct attribute ** default_attrs;
};
Kobj type 数据结构包含三个域:一个 release 方法用于释放 kobject 占用的资源;一个
sysfs ops 指针指向 sysfs 操作表和一个 sysfs 文件系统缺省属性列表。Sysfs 操作表包括
两个函数 store()和 show()。当用户态读取属性时,show()函数被调用,该函数编码指定
属性值存入 buffer 中返回给用户态;而 store()函数用于存储用户态传入的属性值。
attribute
struct attribute {
char * name;
struct module * owner;
mode_t mode;
};
attribute, 属性。它以文件的形式输出到 sysfs 的目录当中。在 kobject 对应的目录下面。
文件
名就是 name。文件读写的方法对应于 kobj type 中的 sysfs ops。
§3. kset
kset 最重要的是建立上层(sub-system)和下层的(kobject)的关联性。kobject 也会利用
它了分辨自已是属于那一個类型,然後在/sys 下建立正确的目录位置。而 kset 的优先权
比较高,kobject 会利用自已的*kset 找到自已所属的 kset,並 把*ktype 指定成該 kset
下的 ktype,除非沒有定义 kset,才会用 ktype 來建立关系。Kobject 通过 kset 组织成
层次化的结构,kset 是具有相同类型的 kobject 的集合,在内核中用 kset 数据结构表示,
定义为:
struct kset {
struct subsystem * subsys; 所在的 subsystem 的指针
struct kobj type * ktype; 指向该 kset 对象类型描述符的指针
struct list head list; 用于连接该 kset 中所有 kobject 的链表头
struct kobject kobj; 嵌入的 kobject
struct kset hotplug ops * hotplug ops; 指向热插拔操作表的指针
};
包含在 kset 中的所有 kobject 被组织成一个双向循环链表,list 域正是该链表的头。Ktyp
e 域指向一个 kobj type 结构,被该 kset 中的所有 kobject 共享,表示这些对象的类型。
Kset 数据结构还内嵌了一个 kobject 对象(由 kobj 域表示),所有属于这个 kset 的 ko
bject 对象的 parent 域均指向这个内嵌的对象。此外,kset 还依赖于 kobj 维护引用计数:
kset 的引用计数实际上就是内嵌的 kobject 对象的引用计数。
见图 1,kset 与 kobject 的关系图
这幅图很经典,她反映了整个 kobject 的连接情况。
相关函数
与 kobject 相似,kset_init()完成指定 kset 的初始化,kset_get()和 kset_put()分别
增加和减少 kset 对象的引用计数。Kset_add()和 kset_del()函数分别实现将指定 keset
对象加入设备层次和从其中删除;kset_register()函数完成 kset 的注册而 kset_unregi
ster()函数则完成 kset 的注销。
§4 subsystem
如果說 kset 是管理 kobject 的集合,同理,subsystem 就是管理 kset 的集合。它描述
系统中某一类设备子系统,如 block subsys 表示所有的块设备,对应于 sysfs 文件系统中
的 block 目录。类似的,devices subsys 对应于 sysfs 中的 devices 目录,描述系统中
所有的设备。Subsystem 由 struct subsystem 数据结构描述,定义为:
struct subsystem {
struct kset kset; 内嵌的 kset 对象
struct rw semaphore rwsem; 互斥访问信号量
};
可以看出,subsystem 与 kset 的区别就是多了一个信号量,所以在后来的代码中,s
ubsystem 已经完全被 kset 取缔了。
每个 kset 属于某个 subsystem,通过设置 kset 结构中的 subsys 域指向指定的 su
bsystem 可以将一个 kset 加入到该 subsystem。所有挂接到同一 subsystem 的 kset
共享同一个 rwsem 信号量,用于同步访问 kset 中的链表。
相关函数
subsystem 有一组类似的函数,分别是:
void subsystem_init(struct subsystem *subsys);
int subsystem_register(struct subsystem *subsys);
void subsystem_unregister(struct subsystem *subsys);
struct subsystem *subsys_get(struct subsystem *subsys)
void subsys_put(struct subsystem *subsys);
关于那些函数的用法,会在后面的举例中详细讲。这里仅仅是一个介绍
Linux那些事儿之我是Sysfs(3)设备模型上层容器
§1 bus
系统中总线由 struct bus_type 描述,定义为:
struct bus_type {
char * name; 总线类型的名称
struct subsystem subsys; 与该总线相关的 subsystem
struct kset drivers; 所有与该总线相关的驱动程序集合
struct kset devices; 所有挂接在该总线上的设备集合
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 (*hotplug) (struct device *dev, char **envp, int num_envp, char *buff
er, int buffer_size);
int (*suspend)(struct device * dev, u32 state);
int (*resume)(struct device * dev);
};
每个 bus_type 对象都内嵌一个 subsystem 对象,bus_subsys 对象管理系统中所有总
线类型的 subsystem 对象。每个 bus_type 对象都对应/sys/bus 目录下的一个子目录,
如 PCI 总线类型对应于/sys/bus/pci。在每个这样的目录下都存在两个子目录:devices
和 drivers(分别对应于 bus type 结构中的 devices 和 drivers 域)。其中 devices 子
剩余20页未读,继续阅读
madoba
- 粉丝: 4
- 资源: 45
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功