驱动-设备模型kobject实现属性文件读写终篇

前面了解过:驱动-设备模型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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值