sysfs是什么??
来源:https://blog.csdn.net/qq_36412526/article/details/83751520
第一次接触:sysfs, 这里记录过程:
原文:Documenttation/filesystems/sysfs.txt sysfs-用于导出内核对象(kobject)的文件系统
sysfs是什么: sysfs是一个基于ram的内存文件系统(ramfs)。它提供了一种方法用于导出内核数据结构,属性,以及它们两者之间的联系到用户空间。 sysfs和kobject结构关联。参考Documenttation/kobject.txt获取更多kobject信息。
sysfs用法: 如果定义了CONFIG_SYSFS sysfs就会编译进内核。可以用以下命令挂载: mount -t sysfs sysfs /sys
目录创建 每个注册在系统的kobject都会在sysfs创建一个目录。创建的目录位于kobject的parent目录下,展现了kobject之间的内部层级关系。sysfs顶层的目录表示共同的祖先目录;比如object归属的subsystems。 sysfs内部保存了一个指向kobject的指针。过去kobject指针被sysfs直接用来处理引用次数在文件打开或关闭的时候。现在的sysfs实现了kobject的引用次数只能被函数sysfs_schedule_callback()修改。
属性(attribute) attribute能为kobject导出普通文件的格式。sysfs用文件I/O操作来操作attribute定义的函数,提供了一种读写内核属性的途径。 attributes应该是ASCII文本文件,最好每个文件保存一个值。有人注意到一个文件保存一个值显得效率不高,所以保存同类型的一组值也是普遍认可的。 混合类型、保存多行数据,且比较花哨的数据是不赞成的。这样做会让你在公众面前丢脸且你的代码会被毫无征兆地重写。 attribute定义如下
struct attribute{
char *name;
struct module *owner;
mode_t mode;
};
int sysfs_create_file(struct kobject *kobj,const struct attribute *attr);
void sysfs_remove_file(struct kobject *kobj,const struct attribute *attr);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
空的attribute不含读写attribute的函数。子系统(subsystems)鼓励定义自己的attribute结构体和包装函数用于添加和删除object的attribute。
举例来说,设备驱动模型定义了device_attribute的结构体如下:
struct device_attribute{
struct attribute attr;
ssize_t (*show)(struct device *dev,struct device_attribute *attr,char *buf);
ssize_t (*strore)(struct device *dev,struct device_attibute *attr,char *buf,size_t count);
};
int device_create_file(struct device *,const struct device_attribute *);
void device_remove_file(struct device *,const struct device_attribute *);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
它同时定义了辅助宏来定义设备attributes:
#define DEVICE_ATTR(_name,_mode,_show,_store)\
struct device_attribute dev_attr_##_name =__ATTR(_name,_mode,_show,_store)
- 1
- 2
举例,声明
static DEVICE_ATTR(foo,S_IWUSR | S_IRUGO,show_foo,store_foo);
- 1
等效于:
static struct device_attribute dev_attr_foo =
.attr = {
.name = "foo",
.mode = S_IWUSR | S_IRUGO,
.show = show_foo,
.store = store_foo,
},
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
subsystem相关的callbacks
当subsystem定义了新的attribute类型,它必须实现一组自己的sysfs操作函数用于sysfs读写调用.
struct sysfs_ops {
ssize_t (*show)(struct kobject *, struct attribute *, char *);
ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
};
- 1
- 2
- 3
- 4
[subsystems 应该已经定义了一个kobj_type结构体作为类型描述符,它保存了sysfs_ops指针.详情参考kobject文档.]
当读写文件的时候,sysfs调用kobj_type的相应方法函数.该函数随后转换kobject和attribute指针到相应的指针类型,然后调用相应的方法函数. 举例:
#define to_dev(obj) container_of(obj, struct device, kobj)
#define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr)
static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr,
char *buf)
{
struct device_attribute *dev_attr = to_dev_attr(attr);
struct device *dev = to_dev(kobj);
ssize_t ret = -EIO;
if (dev_attr->show)
ret = dev_attr->show(dev, dev_attr, buf);
if (ret >= (ssize_t)PAGE_SIZE) {
print_symbol("dev_attr_show: %s returned bad count\n",
(unsigned long)dev_attr->show);
}
return ret;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
读/写 attribute 数据 为了读写attribute,在声明attribute的时候必须定义show()或store()函数.这些函数应该尽量简单如device attribute定义的函数:
ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
- 1
- 2
- 3
IOW,这些函数只需要一个object,attribute,buffer作为参数. sysfs分配了一个buffer(PAGE_SIZE字节)并把它传入这些函数.sysfs会在每次读写的时候调用这些函数.要求这些函数实现以下功能:
-on read(2),show()函数会填充整个buffer.一个attribute应该只导出一个值,或一组相似的值,因此这个效率不高. 这 使用户空间可以部分读且随意向后搜索.如果用户空间向前搜索到0或使用pread(2)在0位置读,show()函数会被再次调用 并填充整个buffer.
-on write(2),sysfs在首次写的时候传递整个buffer,sysfs然后传递整个buffer到store()函数. 当写sysfs文件时,用户空间先读整个文件,然后修改,最后再写回文件. attribute函数读和写的时候应该使用同一个buffer.
其他注意点:
-写操作将导致show()函数被再次调用,不管当前文件位置在哪里.
-buffer的长度固定为PAGE_SIZE.在i386,长度为4096
-show()函数返回输出到buffer的字节数.也就是scnprintf()函数的返回值
-show()函数应该使用scnprintf()函数
-store()函数应该返回buffer占用的字节数,如果整个buffer都被占用,应该返回count参数
-show()和store()函数可以返回错误,如果有错误的值,确保返回一个错误
-函数的参数object将被保存在内存中通过它的引用计数器计数.但object代表的实体不一定在内存中,如果有必要,要有方法检测.
一个设备属性的简单的实现如下:
static ssize_t show_name(struct device *dev, struct device_attribute *attr,
char *buf)
{
return scnprintf(buf, PAGE_SIZE, "%s\n", dev->name);
}
static ssize_t store_name(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
snprintf(dev->name, sizeof(dev->name), "%.*s",
(int)min(count, sizeof(dev->name) - 1), buf);
return count;
}
static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
(注意,实际上设备的名字不能在用户空间更改.)
顶层目录安排
sysfs目录展现了内核数据结构之间的关系. 顶层目录如下: block/ bus/ class/ dev/ devices/ firmware/ net/ fs/
devices/ 一个文件系统代表了设备树(device tree).直接映射到内核的设备树,它是device结构体的层级关系. bus/ 内核的多种总线类型的目录布局.每个总线目录含两个子目录: devices/ 系统里发现的每个设备的符号连接指向root/目录下的 device目录 drivers/ 特定总线上设备加载的驱动目录 fs/ 某些文件系统的目录.每个文件系统如果要导出attributes必须要创建它自己的目录层级到fs/下 dev/ 里面有两个目录char/和block/.这两个目录里有命名为:的符号连接.这些符号连接到sysfs目录下对应的device./sys/dev提供了一个快速的方式来查找sysfs中stat操作的结果
更多关于驱动模型的特征信息可以参考Documentation/driver-model/.
Current Interfaces
The following interface layers currently exist in sysfs:
- devices (include/linux/device.h)
Structure:
struct device_attribute {
struct attribute attr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Declaring:
DEVICE_ATTR(_name, _mode, _show, _store);
- 1
Creation/Removal:
int device_create_file(struct device *dev, const struct device_attribute * attr);
void device_remove_file(struct device *dev, const struct device_attribute * attr);
- 1
- 2
- 3
- bus drivers (include/linux/device.h)
Structure:
struct bus_attribute {
struct attribute attr;
ssize_t (*show)(struct bus_type *, char * buf);
ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
};
- 1
- 2
- 3
- 4
- 5
Declaring:
BUS_ATTR(_name, _mode, _show, _store)
- 1
Creation/Removal:
int bus_create_file(struct bus_type *, struct bus_attribute *);
void bus_remove_file(struct bus_type *, struct bus_attribute *);
- 1
- 2
- 3
- device drivers (include/linux/device.h)
Structure:
struct driver_attribute {
struct attribute attr;
ssize_t (*show)(struct device_driver *, char * buf);
ssize_t (*store)(struct device_driver *, const char * buf,
size_t count);
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Declaring:
DRIVER_ATTR(_name, _mode, _show, _store)
- 1
- 2
Creation/Removal:
int driver_create_file(struct device_driver *, const struct driver_attribute *);
void driver_remove_file(struct device_driver *, const struct driver_attribute *);
- 1
- 2
- 3
文档
sysfs目录结构和每个目录的attribute定义了一种ABI在内核和用户空间.对于任何ABI,稳定和正确的文档是很重要的.所有新的sysfs attributes必须配上文档.参考Documentation/ABI/README阅读更多的信息.
sysfs是什么??的更多相关文章
- Linux设备管理(五)_写自己的sysfs接口
我们在Linux设备管理(一)_kobject, kset,ktype分析一文中介绍了kobject的相关知识,在Linux设备管理(二)_从cdev_add说起和Linux设备管理(三)_总线设备的 ...
- Linux设备管理(四)_从sysfs回到ktype
sysfs是一个基于ramfs的文件系统,在2.6内核开始引入,用来导出内核对象(kernel object)的数据.属性到用户空间.与同样用于查看内核数据的proc不同,sysfs只关心具有层次结构 ...
- Non Lasting Storage File System、procfs、sysfs
catalog . 引言 . proc文件系统 . 简单的文件系统 . sysfs 0. 引言 传统上,文件系统用于在块设备上持久存储数据,但也可以使用文件系统来组织.提供.交换并不存储在块设备上的信 ...
- sysfs接口函数的建立_DEVICE_ATTR(转)
sysfs接口函数到建立_DEVICE_ATTR 最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作. 说道s ...
- Linux设备模型——设备驱动模型和sysfs文件系统解读
本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的 ...
- sysfs - 用于导出内核对象(kobject)的文件系统
sysfs - _The_ filesystem for exporting kernel objects.sysfs - 用于导出内核对象(kobject)的文件系统Patrick Mochel & ...
- sysfs实例
转自:http://blog.chinaunix.net/u1/51562/showart_1076295.html 一:前言 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象 ...
- sysfs分析
Linux设备模型——设备驱动模型和sysfs文件系统解读 内核版本:2.6.30 1. What is sysfs? 个人理解:sysfs向用户空间展示了驱动设备的层次结构.我们都知道设备和对应 ...
- Linux设备管理之权限倾斜——mem、proc、devfs、sysfs、udev(下)
linux发展第一阶段 01devfs(linux2.6之前) 02udev(用户空间) 03sysfs(linux2.6之后,描述设备属性) linux发展第二阶段 01sysfs+udev(ude ...
- sysfs接口整理
SYS节点 目录结构: 1:sysfs相关知识点介绍(介绍sysfs的体系结构) 2:sys节点核心知识(使用sys节点核心的知识) 3:代码实例(创建sys节点的代码实例) 1:sysfs相关知识点 ...
随机推荐
- Android开发java开发之常用英文词汇汇总。程序员必备英语单词
ANR (Application Not Response ) bundle 捆, entire 整个的,完整的 lifetime 生命周期 entire lifetime 完整生命周期 visi ...
- 攻防世界——web新手练习区解题总结<2>(5-8题)
第五题cookie: 所需工具:burpsuite(需自行下载) 老规矩看完题,先获取在线场景,得到如下网页 那么什么是cookie呢?大体上就是网站为了识别用户身份而储存在用户本地终端上的数据,类型 ...
- qqmini
QQ玩一玩最新调试方法 https://blog.csdn.net/zyw_java/article/details/83686645 LayaBox 接入QQ玩一玩 轻游戏流程 https://bl ...
- java初探(1)之秒杀中的rabbitMQ
rabbitMQ 消息队列,通过一定的通信协议,生产者和消费者在应用程序内传递通信. 主要的作用,提高负载,减耦合. 场景描述:当点击秒杀按钮的那个时刻,有很高的并发量,客户端发出请求之后,会判断库存 ...
- vue实现局部预览打印
html <div id="subOutputRank-print"> <h1></h1> </div> js doPrint(e) ...
- 太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!
前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥. 上一节,我们一起学习了关于跳表的理论知识,相信通过上一节的学习,你一定可以给面试官完完 ...
- 小白也能弄懂的卷积神经网络(Convolutional Neural Networks )
本系列主要是讲解卷积神经网络 - Convolutional Neural Networks 的系列知识,本系列主要帮助大家入门,我相信这是所有入门深度学习的初学者都必须学习的知识,这里会用更加直接和 ...
- js判断一个字符串中出现次数最多的字符及次数
最近面试总是刷到这个题,然后第一次的话思路很乱,这个是我个人思路 for循环里两个 if 判断还可以优化 var maxLength = 0; var maxStr = ''; var count = ...
- 【新阁教育】基于Log4Net实现日志信息双向存储(含源码)
1.引言 在上位机开发中,日志记录是必不可少的,我们可以通过日志记录做日志分析及错误追踪.初学者会采用txt文本写入来实现日志保存,但是文本写入不是线程安全,当存在多个线程同时写入日志时,就会出现一些 ...
- pycharm写的代码提交到git上,提示需要merge失败时解决办法
当遇到pycharm代码提交需要合并报错时 原因:pycharm目录和git中目录冲突了 解决办法:1.先在git仓库中创建一个文件夹,比如day1 2.然后在pycharm中update一下,可以看 ...