没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux sysfs 文件系统机制详解
Linux sys文件系统机制是非常难懂的一个机制。文章主要介绍了一些设备驱动相关的sys文件系统,结合ldd3(linux device driver 3)中的示例代码(主要是lddbus 和sculld 文件夹),详细分析虚拟文件系统sysfs,以及如何编写基于sysfs的模块化的驱动程序。使用的内核是2.6.18。
资源详情
资源评论
资源推荐
sysfs 文件系统浮世绘
来自 http://blog.csdn.net/aaronychen/archive/2008/01/24/2062444.aspx
目录
目录目录
目录
1 sysfs 初探 ....................................................................................................................................... 2
2 linux 设备底层模型 ....................................................................................................................... 3
2.1 Kobject ................................................................................................................................ 3
2.2 kobj_type ............................................................................................................................. 5
2.3 kset ...................................................................................................................................... 5
2.4 subsystem ............................................................................................................................ 6
3 设备模型上层容器 ....................................................................................................................... 7
3.1 bus ....................................................................................................................................... 7
3.2 device .................................................................................................................................. 8
3.3. driver .................................................................................................................................. 9
4 Sysfs 应用举例——lddbus ............................................................................................................ 9
5 Sysfs 应用举例——sculld ............................................................................................................ 14
6 文件系统..................................................................................................................................... 17
6.1 文件系统.......................................................................................................................... 18
6.2 磁盘文件.......................................................................................................................... 20
6.3 特殊文件.......................................................................................................................... 21
6.4 pathwalk ............................................................................................................................ 22
6.5 superblock 与 vfsmount .................................................................................................... 23
7 sysfs 文件系统模型 ..................................................................................................................... 24
8 sysfs 创建目录 ............................................................................................................................ 26
9 sysfs 创建普通文件 .................................................................................................................... 30
10 sysfs 读入文件夹内容 ............................................................................................................... 32
11 sysfs 读入普通文件内容 ........................................................................................................... 35
12 sysfs 后记 ................................................................................................................................... 39
看到复旦人甲热火朝天的写作,我心底不禁暗暗敬佩。话说我进入 linux 领域也有 2 年了,
我学习 linux 完全是兴趣。因为我觉得用 linux 比较 酷,比较吊。当年看过一篇捧 linux
大骂 windows 的文章,看了以后我是热血沸腾,当天就把 windows 给删了。后来发现实在不
习惯,因为没法斗 地主了。无奈之下,只好又装上了 windows。当时我就有一个愿望,我
一定要打入腾讯内部,响应毛主席号召,让全世界 linux 用户也能斗上地主。大学 生活,
丰富多彩,我只有一个爱好,打篮球,时间充裕,一有时间就看看 linux 相关书籍。但总是
静不下心来,每次看到一定阶段就放下了。等隔了一段时间, 不看不用,就忘了,只是大
概知道有这么一回事。现在总结学习 linux 的关键是,多用多看,持之以恒。我也把自己看
linux 内核的心得写下来响应复旦人 甲的号召,与其去打游戏,看片,灌 BBS,还不如静下
心来,踏踏实实看点书,写点文章。现在社会风气浮躁,就缺肯踏踏实实干事情的人。
我主要写一些文件系统相关的,结合 ldd3(linux device driver 3)中的示例代码
(主要是 lddbus 和 sculld 文件夹),分析虚拟文件系统 sysfs。使用的内核是 2.6.10。
目标:理解设备模型和 sysfs 文件系统
欢迎各位朋友发邮件指正,讨论,交流。
linux.fans.afu@gmail.com
知行合一,王阳明如是说。
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 层次结构,读一个 sysfs 文件,
就是动态的从 kobject 结构提取信息,生成文件。
所以,首先,我要先讲一讲 sysfs 文件系统的信息来源 -- kobject 层次结构。kobject 层
次结构就是 linux 的设备模型。
莫愁前路无知己,天下谁人不识君。 唐·高适· 别董大
2 linux 设备底层模型
设备底层模型设备底层模型
设备底层模型
关于 linux 设备模型网上有一些论述,有些东西我就用了拿来主义,进行了修改
和整理。
2.1 Kobject
Kobject 是 Linux 2.6 引入的新的设备管理机制,在内核中由 struct kobject 表示。通过
这个数据结构使所有设备在底层都具有统一的接口,kobject 提供基本的对象管理,是构成
Linux2.6 设备模型的核心结构,它与 sysfs文件系统紧密关联,每个在内核中注册的kobject
对象都对应于 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)中删除 kobj 对象。
void kobject_unregister(struct kobject * kobj);
kobject 注销函数。与 kobject register()相反,它首先调用 kobject del 从设备层次中删
除该对象,再调用 kobject put()减少该对象的引用计数,如果引用计数降为 0,则释放
kobject 对象。
2.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。
2.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 对象类型描述符的指针
剩余38页未读,继续阅读
yunsongice
- 粉丝: 1111
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的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直接复制
信息提交成功
评论9