gpt4 book ai didi

c - sysfs 中内核模块的参数 - 对更改的快速 react

转载 作者:太空狗 更新时间:2023-10-29 15:20:21 27 4
gpt4 key购买 nike

是否可以在其中一个 sys 文件更改时通知模块?我的任务是做一个控制模块内部缓冲区大小的文件,我想在文件中的值更改时调整缓冲区的大小。我的另一个想法(如果我不能通知模块)是在每次使用模块时检查以前的值,然后调整缓冲区的大小。

最佳答案

这不就是Sysfs的目的吗?

当您创建一个 kobject 并在 Sysfs(这是一个目录)中给它一个表示时,您然后为该对象创建属性,这些属性将成为该目录中的文件。您向 kobject 提供一个 store 和一个 show 回调,它们基本上等同于 resp。 写入读取

store 就是你想要的。它看起来像这样:

ssize_t (*store)(struct kobject *kobj, struct attribute *attr, 
const char *buffer, size_t size);

一旦虚拟文件写入用户空间,您就会在 buffer 中收到 size 字节。

看看执行此操作的模块(取自 here ):

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/slab.h>

struct my_attr {
struct attribute attr;
int value;
};

static struct my_attr my_first = {
.attr.name="first",
.attr.mode = 0644,
.value = 1,
};

static struct my_attr my_second = {
.attr.name="second",
.attr.mode = 0644,
.value = 2,
};

static struct attribute * myattr[] = {
&my_first.attr,
&my_second.attr,
NULL
};

static ssize_t default_show(struct kobject *kobj, struct attribute *attr,
char *buf)
{
struct my_attr *a = container_of(attr, struct my_attr, attr);
return scnprintf(buf, PAGE_SIZE, "%d\n", a->value);
}

static ssize_t default_store(struct kobject *kobj, struct attribute *attr,
const char *buf, size_t len)
{
struct my_attr *a = container_of(attr, struct my_attr, attr);
sscanf(buf, "%d", &a->value);
return sizeof(int);
}

static struct sysfs_ops myops = {
.show = default_show,
.store = default_store,
};

static struct kobj_type mytype = {
.sysfs_ops = &myops,
.default_attrs = myattr,
};

struct kobject *mykobj;
static int __init sysfsexample_module_init(void)
{
int err = -1;
mykobj = kzalloc(sizeof(*mykobj), GFP_KERNEL);
if (mykobj) {
kobject_init(mykobj, &mytype);
if (kobject_add(mykobj, NULL, "%s", "sysfs_sample")) {
err = -1;
printk("Sysfs creation failed\n");
kobject_put(mykobj);
mykobj = NULL;
}
err = 0;
}
return err;
}

static void __exit sysfsexample_module_exit(void)
{
if (mykobj) {
kobject_put(mykobj);
kfree(mykobj);
}
}

module_init(sysfsexample_module_init);
module_exit(sysfsexample_module_exit);
MODULE_LICENSE("GPL");

另外:您可能希望在读取条目时向用户输出缓冲区大小。这通常是这样做的方式。还要确保信息(读取和写入)采用人类可读的格式以跟上 Unix 理念。

更新:参见this recent interesting article关于 Sysfs 文件的创建,由顶级内核开发人员之一 Greg Kroah-Hartman 撰写。

关于c - sysfs 中内核模块的参数 - 对更改的快速 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com