Linux设备模型(三) sysfs 与 attribute

本文深入探讨Linux设备模型中的sysfs和attribute,讲解attribute的基础知识,包括普通attribute、attribute_group和bin_attribute的创建。通过sysfs,内核能够将数据结构导出到用户空间,实现内核与用户空间的信息交互。文章分析了attribute的read和write操作,以及sysfs_ops在其中的关键作用,并以device_attribute为例展示了如何使用。同时,文章还讨论了bin_attribute的read和write与普通attribute的区别。
摘要由CSDN通过智能技术生成

参考文章:http://www.wowotech.net/linux_kenrel/dm_sysfs.html

1. 前言

sysfs是一个基于RAM的文件系统,它和kobject一起,可以将Kernel的数据结构导出到用户空间,以文件目录结构的形式,提供对这些数据结构(以及数据结构的属性)的访问支持。

Linux设备模型(二) 基本数据结构 Kobject 已经讲过sysfs和Kobject相关数据结构的关系了,本文不再赘述,本文主要讨论属性和sysfs与普通文件系统的关系。

跟属性相关的关键数据结构有:

struct attribute
struct attribute_group
struct bin_attribute
struct sysfs_ops

2. sysfs 与 attribute

在sysfs中,为什么会有attribute的概念呢?其实它是对应kobject而言的,指的是kobject的“属性”。我们知道,sysfs中的目录描述了kobject,而kobject是特定数据类型变量(如struct device)的体现。因此kobject的属性,就是这些变量的属性。它可以是任何东西,名称、一个内部变量、一个字符串等等。而attribute,在sysfs文件系统中以文件的形式存在,即:kobject的所有属性,都在它对应的sysfs目录下以文件的形式呈现。这些文件一般是可读、写的,而kernel中定义了这些属性的模块,会根据用户空间的读写操作,记录和返回这些attribute的值。

总结:所谓的attibute,就是内核空间和用户空间进行信息交互的一种方法。例如某个driver定义了一个变量,却希望用户空间程序可以修改该变量,以控制driver的运行行为,那么就可以将该变量以sysfs attribute的形式开放出来。

2.1. attribute基础知识

Linux内核中,attribute分为普通attribute,attribute_group,bin_attribute

源码版本:Kernel 3.10
源码路径:
         include/linux/sysfs.h
         fs/sysfs/file.c

// include/linux/sysfs.h, line 26
struct attribute {
   
	const char		*name;
	umode_t			mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
	bool			ignore_lockdep:1;
	struct lock_class_key	*key;
	struct lock_class_key	skey;
#endif
};

name,属性的名字,对应sysfs中文件的名字。
mode,应用于属性(文件)的保护位,与文件的权限相同。
ignore_lockdepkeyskey,内核用于debug Kernel Lock(一般用不到)。

// include/linux/sysfs.h, line 57
struct attribute_group {
   
	const char		*name;
	umode_t			(*is_visible)(struct kobject *,
					      struct attribute *, int);
	struct attribute	**attrs;
};

name,属性组的名字,不为空的话对应一个sysfs的文件夹。
attrs,属性组里的普通属性列表。
is_visible,返回组中属性的读写权限。

// include/linux/sysfs.h, line 100
struct bin_attribute {
   
	struct attribute	attr;
	size_t			size;
	void			*private;
	ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
			char *, loff_t, size_t);
	ssize_t (*write)(struct file *,struct kobject *, struct bin_attribute *,
			 char *, loff_t, size_t);
	int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
		    struct vm_area_struct *vma);
};

attr,包含的普通属性。
size,二进制属性的最大长度,如果没有最大值可以设为0。
private,私有数据,与linux中大部分私有数据的用途一样,用于传递私有数据结构。
readwritemmap,操作二进制属性的函数。

二进制属性不能作为默认属性被设置,只能显式地创建。

struct attribute 为普通的attribute,使用该attribute生成的sysfs文件,只能用字符串的形式读写(第4节中说明)。
struct attribute_group 为普通的attributes的集合,可以在不借助Kobject创建一个目录,并在该目录下创建多个属性文件。
struct bin_attribute 在struct attribute的基础上,增加了read、write等函数,因此它所生成的sysfs文件可以用任何方式读写。固件一般使用bin_attribute属性。

2.2. attibute文件的创建

普通attibute文件的创建是由fs/sysfs/file.c中sysfs_create_file()接口完成的。
attribute_group为普通attributes的集合,由fs/sysfs/group.c中sysfs_create_group()接口来完成创建。
bin_attribute文件的创建是由fs/sysfs/bin.c中sysfs_create_bin_file()接口完成的。

注:上述三个接口的实现没有什么特殊之处,大多是文件系统相关的操作,和设备模型没有太多的关系,这里先略过不提。

2.3. 普通attibute文件的read和write

看到2.1章节struct attribute的原型时,也许我们会犯嘀咕,该结构很简单啊,name表示文件名称,mode表示文件模式,其它的字段都是内核用于debug Kernel Lock的,那文件操作的接口在哪里呢?

不着急,我们去fs/sysfs目录下看看sysfs相关的代码逻辑。

所有的文件系统,都会定义一个struct file_operations变量,用于描述本文件系统的操作接口,sysfs也不例外:

// fs/sysfs/file.c, line 479
const struct file_operations sysfs_file_operations = {
   
	.read		= sysfs_read_file,
	.write		= sysfs_write_file,
	.llseek		= generic_file_llseek,
	.open		= sysfs_open_file,
	.release	= sysfs_release,
	.poll		= sysfs_po
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值