从内核模块创建 sysfs 条目

2023-12-05

我想将一个大于 1024 个字符的字符串传递给我的模块(文件系统)。 由于内核参数限制为 1024 个字符,有人推荐使用 sysfs 代替。

我试图包括这个例子在我的 super.c 类中为我的模块在 sysfs 中创建字符串“文件名”和字符串“代码”条目。

static decl_subsys(myfs, NULL, NULL);

struct myfs_attr {
    struct attribute attr;
    char *value;
};

static struct myfs_attr fname = {
    .attr.name="filename",
    .attr.owner = THIS_MODULE,
    .attr.mode = 0644,
    .value = "/my/test/path",
};

static struct myfs_attr code = {
    .attr.name="code",
    .attr.owner = THIS_MODULE,
    .attr.mode = 0644,
    .value = "0101",
};

编译我的模块时出现很多错误(第 41 行是 decl_subsys):

fs/myfs/super.c:41:26: error: expected ‘)’ before ‘(’ token
fs/myfs/super.c:50:2: error: unknown field ‘owner’ specified in initializer
fs/myfs/super.c:50:2: warning: initialization from incompatible pointer type [enabled by default]
fs/myfs/super.c:50:2: warning: (near initialization for ‘fname.attr.name’) [enabled by default]
...
fs/myfs/super.c: At top level:
fs/myfs/super.c:83:15: error: variable ‘myfsops’ has initializer but incomplete type
fs/myfs/super.c:84:2: error: unknown field ‘show’ specified in initializer
fs/myfs/super.c:84:2: warning: excess elements in struct initializer [enabled by default]
fs/myfs/super.c:84:2: warning: (near initialization for ‘myfsops’) [enabled by default]
fs/myfs/super.c:85:2: error: unknown field ‘store’ specified in initializer
fs/myfs/super.c:85:2: warning: excess elements in struct initializer [enabled by default]
fs/myfs/super.c:85:2: warning: (near initialization for ‘myfsops’) [enabled by default]
fs/myfs/super.c:89:2: error: unknown field ‘myfs_ops’ specified in initializer
fs/myfs/super.c:89:2: warning: initialization from incompatible pointer type [enabled by default]
fs/myfs/super.c:89:2: warning: (near initialization for ‘myfstype.release’) [enabled by default]
fs/myfs/super.c: In function ‘init_myfs_fs’:
fs/myfs/super.c:1554:2: error: implicit declaration of function ‘kobj_set_kset_s’ [-Werror=implicit-function-declaration]
fs/myfs/super.c:1554:19: error: ‘myfs_subsys’ undeclared (first use in this function)
fs/myfs/super.c:1554:19: note: each undeclared identifier is reported only once for each function it appears in
fs/myfs/super.c:1554:32: error: ‘fs_subsys’ undeclared (first use in this function)
fs/myfs/super.c:1557:2: error: implicit declaration of function ‘subsystem_register’ [-Werror=implicit-function-declaration]
fs/myfs/super.c: In function ‘exit_myfs_fs’:
fs/myfs/super.c:1579:2: error: implicit declaration of function ‘subsystem_unregister’ [-Werror=implicit-function-declaration]
fs/myfs/super.c:1579:24: error: ‘myfs_subsys’ undeclared (first use in this function)
  1. 本教程对于我的 3.5 内核来说是否已经过时,或者我是否遗漏了其他内容?
  2. 如何在 sysfs 中为我的模块创建 2 个字符字符串条目?

这是将数据传输到“param_buf”字符串的源代码。按照要求,没有读取方法。仅限商店。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <asm/string.h>

static struct kobject *register_kobj;
static char *param_buf;

// function for many symbol data enter
static ssize_t __used store_value(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count){ 
    printk(KERN_ALERT "you entered %s\n", buf);
    strncpy(param_buf, buf, PAGE_SIZE - 1);
    return count;
}

// register function to attribute
static struct kobj_attribute store_val_attribute = __ATTR( put_parameters, 0220, NULL, store_value);

// put attribute to attribute group
static struct attribute *register_attrs[] = {
    &store_val_attribute.attr,
    NULL,   /* NULL terminate the list*/
};
static struct attribute_group  reg_attr_group = {
    .attrs = register_attrs
};

static int hello_init(void){
    param_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
    // create sysfs object ( /sys/kernel/test_1025_sym directory )
    register_kobj = kobject_create_and_add("test_1025_sym", kernel_kobj);
    if (!register_kobj)
    return -ENOMEM;

    //create attributes (files)
    if(sysfs_create_group(register_kobj, &reg_attr_group)){
        kobject_put(register_kobj);
        return -ENOMEM;
    }

    return 0;
}

static void hello_exit(void){
    printk(KERN_ALERT "last value was %s\n", param_buf);
    kfree(param_buf);
    kobject_put(register_kobj);
}

MODULE_LICENSE("Dual BSD/GPL");
module_init(hello_init);
module_exit(hello_exit);

你可以用这样的方式测试它:

cat /etc/fstab > /sys/kernel/test_1025_sym/put_parameters

对于两个字符串条目:复制一个 store_value 函数,再注册一个 store_val_attribute 并将其放入属性列表中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从内核模块创建 sysfs 条目 的相关文章

随机推荐

  • 如何在文本按钮上放置图标?

    我想在同一个按钮上同时显示图像图标和文本 例如在 Word 中 我在按钮上设置了图标 但文本消失了 HANDLE hBmp HBITMAP LoadImage g hDllInstance MAKEINTRESOURCE IDB BITMA
  • 如何在 Spark 中设置 ORC 条带大小

    我正在尝试在 Spark 2 3 中生成数据集并以 ORC 文件格式编写 我正在尝试设置 ORC 条带大小和压缩大小的一些属性 我从中得到了暗示this所以帖子 但 Spark 不尊重这些属性 并且生成的 ORC 文件中的条带大小比我设置的
  • PHP:如何识别并更改数组中的重复值?

    好的 在 php 数组中有很多重复检测和删除的示例 使用 array unique 等 但是如果您想查找重复项 修改它们 再次循环检查直到所有重复项现在都是唯一的 该怎么办 我认为这就像使用 array filter 所以作为一个更具体的示
  • TFS:构建具有多种配置的解决方案

    设想 在 TFS 2013 上 我必须构建 300 多个项目 C 和 VC 分为大约 40 个解决方案 有些项目有多个发布和调试配置 例如一个项目可能有 3 个发布配置 如版本 1 版本 2 版本 3 x86 版本 4 x64 等 要求 我
  • 这是使用 Python 3 unittest 测试 stdout 的正确方法吗?

    假设我有一个提交文件 fileFromStudent py 其中唯一的内容是 print hello world 我想测试标准输出 看看学生是否正确写出了打印语句 根据我所读到的内容 我已经能够创建以下代码 from io import S
  • 序列化多态接口

    我希望从其关联的接口序列化一个多态类 这是我发现的这个问题 它似乎做了我需要做的事情 如何在Boost Serialization中创建序列化接口 然而 序列化是从类本身而不是接口完成的 到目前为止我得到了什么 网络消息 hpp using
  • 可以知道变量所在的内存部分吗?

    C 程序中有什么方法可以知道变量所在的部分吗 例如 char str Word1 char str2 Word2 printf String1 s Location p n str str lt would be on the stack
  • java 如何打印经过的时间(秒)

    在游戏循环的 run 方法中 我尝试打印程序在 java 中运行的时间 我只是尝试过System out println System nanoTime 1000000 因为这就是一秒有多少毫秒 如果您不知道 它会打印接近尾声的秒数 但我想
  • 角度2错误httpclientmodule

    have some error with httpclientmodule i have app module ts and there is code import NgModule from angular core import Br
  • SVG 填充颜色透明度/alpha?

    是否可以在 SVG 填充颜色上设置透明度或 Alpha 级别 我尝试向填充标签添加两个值 将其从fill 044B94 to fill 044B9466 但这不起作用 您使用附加属性 fill opacity 该属性采用 0 0 到 1 0
  • Windows Phone 键盘打开事件和属性

    在我的 Windows Phone 应用程序上 我需要根据键盘更改视图 我有几个问题 如何判断键盘是否打开 是否有键盘打开的视图事件 有没有办法获得键盘的高度 或者被阻止的 UI 区域大小 通过键盘 您可以通过以下方式访问键盘信息Windo
  • 使用 SWIG 作为参数传递给 C 库的错误值

    跟随我的three previous posts 我现在可以将托管结构数组传递给我的包装方法 以下是文件的摘录 packer i typedef struct int width input int height input frame t
  • VBA Excel/Word 查找和替换

    我正在开发一个 Excel 工作表 用于在 Word 文档中搜索特定实例 A 列 并将其替换为单元格 B 中的实例 我只想更改与搜索条件匹配的第一个实例 并继续循环该列到下一个实例 我写了下面的代码 如果我使用 wdReplaceAll 它
  • Rstudio 控制台中的命令行错误

    如何将一个很长的字符串分配给r中的变量 以下工作正常 testVar lt test test 但以下给出了一个奇怪的 在 RStudio 控制台中 testVar lt test test test test test test test
  • 检索 x509 证书的序列号时缺少前导零

    我正在尝试从 X 509 证书获取序列号 当我将代码生成的序列号与实际序列号 在 Windows 上 进行比较时 实际序列号 X509 证书 的前导零是丢失的 有任何建议或替代方法来获取带有前导零的十六进制 x 509 证书的序列号吗 以下
  • MVC 异步错误 - 异步操作方法“Complete”无法同步执行

    我正在将 MVC4 与 VS 2010 一起使用 我有一个正在尝试运行的异步操作 我的控制器继承自 AsyncController 并且我有 Async 和 Completed 方法 我能够在示例测试项目中正确执行异步操作 但是当我将它作为
  • 具有自定义内容模板的 WPF 创建按钮

    我在 WPF 中有一个应用程序 需要创建许多具有相同内容布局的按钮 目前它在 Window 中定义为
  • Office365 REST API - 日历事件附件对收件人不可见

    The 添加附件端点似乎有问题 附加到日历事件的文件are not对日历收件人可见 附件are对事件创建者可见 直到最近 我的代码已经运行了几个月 这让我相信这是一种回归 重现步骤 必须有两个用户 创建者和接收者 通过创建事件https g
  • 启用 openmp 时出错 - “ld: 找不到 -lgomp 的库”和 Clang 错误

    我试图让 openmp 在 Mavericks 上的程序中运行 但是当我尝试使用标志进行编译时 fopenmp我收到以下错误 ld library not found for lgomp clang error linker command
  • 从内核模块创建 sysfs 条目

    我想将一个大于 1024 个字符的字符串传递给我的模块 文件系统 由于内核参数限制为 1024 个字符 有人推荐使用 sysfs 代替 我试图包括这个例子在我的 super c 类中为我的模块在 sysfs 中创建字符串 文件名 和字符串