前面了解过:
驱动-设备模型kobject实现属性文件读写功能,这里我们需要掌握几个属性文件读写的知识点。
文章目录
前言-需求
在了解过 驱动-设备模型kobject实现属性文件读写功能 驱动-设备模型kobject实现属性文件读写功能 后,我们需要掌握以下几个知识点,进一步优化和掌握设备模型中读写属性的知识点。
必备知识点: 也就是这里我们需要讨论和阐述的知识点
-
驱动-设备模型kobject实现属性文件读写功能 中演示了两个属性读写,我们是通过
kobj_type来定义成员结构体 属性default_attrs操作。 在属性default_attrs中定义属性数组,同步声明数组每个属性的声明和权限;在sysfs_ops结构体里面定义读写方法。 在读写方法中通过kobject来的到封装的结构体,通过得到封装结构体的属性名称来判断是哪一个属性,进而实现读写操作。
**需求:**那么现在我需要在当前基础上把属性和属性的读取、存储方法分隔开来,单独分开容易操作,不要把所有的属性都混在一起。 -
在 驱动-设备模型kobject实现属性文件读写功能 篇章中和 设备模型基本框架-kobject-kset 中都讨论过 kobject的创建方式 ,前篇我们是通过
kobject_init_and_add方法创建kobject 对象的参数kobj_type来关联属性进而对属性声明、定义、读写操作。
需求;那么如何在kobject_create_and_add方法创建kobject的方式中来实kobject属性的读写操作呢? -
在需求二的基础上, 如何实现多个属性创建呢? 当然只有做了2的实验的时候,首先搞清楚 在
kobject_create_and_add方法创建kobject对于属性的创建和读写操作
小结:其实就是一步一步,针对不同的需求来解决不同需求的技术知识点的阐述。
参考资料
什么是引用计数器
引用计数器实验
kobject释放实例分析实验
迅为设备模型篇
Linux驱动-引用计数器kref
引入并完善kobject_type结构体
创建属性文件并实现读写功能实验1
驱动-设备模型kobject实现属性文件读写功能
优化属性文件读写函数实验
创建多个属性文件的简便方法
在线查看Linux 系统源码:Linux Kernel Cross Reference (LXR)
一、不同属性实现各自读写回调
结构体 __ATTR 分析
我们还是借助上篇 驱动-设备模型kobject实现属性文件读写功能 的代码来分析下我们目前的需求:

需求分析清楚了,其实系统就给我们提供了这样一个结构体:__ATTR,直接看源码:
/*
* Use these macros to make defining attributes easier.
* See include/linux/device.h for examples..
*/
#define SYSFS_PREALLOC 010000
#define __ATTR(_name, _mode, _show, _store) {
\
.attr = {
.name = __stringify(_name), \
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
.show = _show, \
.store = _store, \
}
如结构体注释:更好的去定义attributes ,而且它有自己的show /store 关联的读写属性方法,这样不就是把 属性名字和这个属性的读写属性方法关联起来了嘛 。 然后在合适的时候通过 attributes 的属性来调用自己关联的 show/store 方法,不就实现了不同属性的读写隔离功能吗?
__ATTR 声明定义和应用
定义属性
// 定义attribute对象value1和value2
struct kobj_attribute value1 = __ATTR(value1, 0664, show_myvalue1, store_myvalue1);
struct kobj_attribute value2 = __ATTR(value2, 0664, show_myvalue2, store_myvalue2);
属性关联读写回调方法
// 自定义的show函数,用于读取属性值
ssize_t show_myvalue1(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
ssize_t count;
count = sprintf(buf, "show_myvalue1\n");
return count;
};
// 自定义的store函数,用于写入属性值
ssize_t store_myvalue1(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
printk("buf is %s\n", buf);
return count;
};
将attribute对象放入数组中
// 将attribute对象放入数组中
struct attribute *myattr[] = {
&value1.attr,
&value2.attr,
NULL,
};
案例源码示例
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
// 自定义的kobject结构体,包含一个kobject对象和两个整型值
struct mykobj
{
struct kobject kobj;
int value1;
int value2;
};
// 定义了mykobj结构体指针变量mykobject01
struct mykobj *mykobject01;
// 自定义的show函数,用于读取属性值
ssize_t show_myvalue1(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
ssize_t count;
count = sprintf(buf, "show_myvalue1\n");
printk("show_myvalue1 ");
return count;
};
// 自定义的store函数,用于写入属性值
ssize_t store_myvalue1(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
printk("store_myvalue1 buf is %s\n", buf);
return count;
};
// 自定义的show函数,用于读取属性值
ssize_t show_myvalue2(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
ssize_t count;
count

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



