如何正确初始化平台驱动程序的属性组?

2023-12-01

EDIT #4:我发现我不应该分配attr_groups to the groups领域中的driver领域的struct platform_driver结构。找评论吧/* WRONGO: should not be assigned here. */以下。

我还没弄清楚我在哪里should正在分配它...


由于 NULL 引用,我的平台驱动程序代码在读取 sysfs 属性时设法导致内核“OOPS”。我确信这是以下代码中的一个简单的疏忽,但我看不到它:

...

static int samples_per_frame = SAMPLE_CHANNEL_COUNT;

DEVICE_INT_ATTR(samples_per_frame, S_IRUGO | S_IWUSR, samples_per_frame);

static struct attribute *attrs[] = {
    &dev_attr_samples_per_frame.attr.attr, NULL,
};

static struct attribute_group attr_group = {
    .attrs = attrs,
};

static const struct attribute_group *attr_groups[] = {
    &attr_group, NULL,
};

static struct platform_driver platform = {
    .remove = my_remove,
    .probe = my_probe,
    .driver = {
        .name = DRIVER_NAME,
        .owner = THIS_MODULE,
        .groups = attr_groups, /* WRONGO: should not be assigned here. */
        .of_match_table = of_match,
    },
};

...

其中,编译干净(Linux 3.12),并且当加载模块时,安装和探测运行顺利,该属性出现在 sysfs 中,但是当我尝试读取它时,会发生内核“oops”。

/sys/bus/platform/drivers/my_driver# ls
ff250000.my_driver   samples_per_frame  uevent
/sys/bus/platform/drivers/my_driver#
/sys/bus/platform/drivers/my_driver# cat samples_per_frame
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = bf1e0000
[00000000] *pgd=3f1d8831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1] SMP ARM
Modules linked in: my_driver(O)
CPU: 1 PID: 194 Comm: cat Tainted: G           O 3.12.0 #6
task: bf054000 ti: bf194000 task.ti: bf194000
PC is at device_show_int+0x2c/0x38
LR is at drv_attr_show+0x2c/0x38
pc : [<80308f58>]    lr : [<8030b6fc>]    psr: a0000013
sp : bf195ee8  ip : 00000d58  fp : bf195ef4
r10: bf1d1380  r9 : 7e946c20  r8 : bf195f78
r7 : bf1d13d8  r6 : bf1d13c0  r5 : bfbc9e00  r4 : 8055d520
r3 : 00000000  r2 : 80620d58  r1 : 00001000  r0 : bf190000
Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 10c5387d  Table: 3f1e004a  DAC: 00000015
Process cat (pid: 194, stack limit = 0xbf194248)
Stack: (0xbf195ee8 to 0xbf196000)
5ee0:                   bf195f04 bf195ef8 8030b6fc 80308f38 bf195f44 bf195f08
5f00: 80166118 8030b6dc 8076ed30 bf14b000 bfbd8d80 00001000 bfbd8d88 bfbd8d80
5f20: 00001000 7e946c20 bf195f78 00000000 bf194000 00001000 bf195f74 bf195f48
5f40: 8010722c 80166084 801061e4 801118c0 00000000 00000000 bfbd8d80 7e946c20
5f60: 00000000 00001000 bf195fa4 bf195f78 8010741c 80107190 00000000 00000000
5f80: 00001000 7e946c20 00000003 00000003 8000ec88 00000000 00000000 bf195fa8
5fa0: 8000ea40 801073dc 00001000 7e946c20 00000003 7e946c20 00001000 00000000
5fc0: 00001000 7e946c20 00000003 00000003 00000001 00000001 00000001 00000003
5fe0: 00000000 7e946bfc 0001079d 76f5e1cc 40000010 00000003 00000000 00000000
[<80308f58>] (device_show_int+0x2c/0x38) from [<8030b6fc>] (drv_attr_show+0x2c/0x38)
[<8030b6fc>] (drv_attr_show+0x2c/0x38) from [<80166118>] (sysfs_read_file+0xa0/0x144)
[<80166118>] (sysfs_read_file+0xa0/0x144) from [<8010722c>] (vfs_read+0xa8/0x148)
[<8010722c>] (vfs_read+0xa8/0x148) from [<8010741c>] (SyS_read+0x4c/0x80)
[<8010741c>] (SyS_read+0x4c/0x80) from [<8000ea40>] (ret_fast_syscall+0x0/0x30)
Code: e5913010 e1a0200c e3a01a01 e3482062 (e5933000)
---[ end trace 5cdf9dda0d86a7db ]---
Segmentation fault

为什么我得到空引用?


EDIT #1:

如果我更换DEVICE_INT_ATTR()宏与DEVICE_ATTR()并提供我自己的show() & store()功能,用起来还不错。


EDIT #2:

It appears the DEVICE_INT_ATTR() macro sets the var field to NULL. hmmm....


EDIT #3:当我创建struct dev_ext_attribute结构与DEVICE_INT_ATTR()宏,我可以转储变量。那是;当使用以下命令查看时,我试图在 sysfs 中公开的结构地址、函数指针和整数地址都是正确的printk()在我的探测功能中,但是当我的家旋转时show()函数查看结构,该结构位于不同的地址,并且var字段为 NULL。


问题是由于分配attr_groups结构在这里:

static struct platform_driver platform = {
    .remove = my_remove,
    .probe = my_probe,
    .driver = {
        .name = DRIVER_NAME,
        .owner = THIS_MODULE,
        .groups = attr_groups, /* WRONGO: should not be assigned here. */
        .of_match_table = of_match,
    },
};

通过这样做struct class相反,一切都按预期进行:

static int __init cz_tdm_init(void)
{
    int ret;
    pr_info("MODNAME=%s", KBUILD_MODNAME);
    /* Dynamically allocate a major number and a
     * range of DEV_MINOR_NUMBER_COUNT (1) minor numbers. */
    if ((ret = alloc_chrdev_region(&first, 0, DEV_MINOR_NUMBER_COUNT, DRIVER_NAME)) < 0) {
        ret = -ENODEV;
        goto exit;
    }
    /* Add the char device to the system. */
    cdev_init(&cdev, &fops);
    if ((ret = cdev_add(&cdev, first, DEV_MINOR_NUMBER_COUNT)) < 0) {
        ret = -ENODEV;
        goto exit;
    }
    resources.cdev = 1;
    /* Create a class entry in sysfs */
    if ((class = class_create(THIS_MODULE, "coveloz")) == NULL) {
        pr_err("Couldn't create 'struct class' structure.");
        ret = -ENODEV;
        goto exit;
    }
    class->dev_groups = attr_groups; /* RIGHTO */

    /* Create the /dev/ file system entry */
    /* return value ignored: there's a 'struct class' to 'struct device' mapping */
    if (device_create(class, NULL, first, NULL, DRIVER_NAME) == NULL) {
        pr_err("Couldn't create entry in '/dev/' file system.");
        ret = -ENODEV;
        goto exit;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确初始化平台驱动程序的属性组? 的相关文章

  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期

随机推荐

  • Excel如何在不使用VBA的情况下从逗号分隔列表中查找匹配元素的所有行

    这是我的问题 我有一个包含两列的表 产品参考和相应的通知 ID A B C D 1 Product Notice 2 p1 n1 3 p2 n2 4 p3 n3 5 6 p1 p3 edi
  • 是否可以在 java Manifest 文件中包含 SHA1-Digest 而无需实际使用密钥

    目前我们使用 jarsigner 来签署我们的 jar 然后 我们显示某些特定类的一些 SHA1 Digest 值 以向外部审计员证明代码在版本之间没有更改 我们只依靠META INF xxx SF文件来获取摘要信息 我们从不使用META
  • ANSI 转义序列不会打印到 Windows 上的标准输出

    我正在尝试在 Windows 上使用 node js 将 ANSI 转义序列写入 stdout 但它似乎不起作用 具体来说 我使用ConEmu这确实supportANSI 代码的子集 我创建了一个测试文件 该文件应重命名当前控制台选项卡 p
  • jQuery:如何确定div是否向下滚动

    我有一个具有定义高度的 div 并且overflow scroll 它的内容太长 因此出现滚动条 现在是发痒的部分 它的一些内部 HTML 总是奇怪地出现 准确地说 是 tableFilter 插件生成的表格的页脚 我想让这个页脚在不需要时
  • 从特定行开始读取目录中的多个文件

    我正在尝试从工作目录读取 R 中的多个文件 并且想从每个文件的第 7 行读取 我不知道我该怎么做 我发现如何用这个读取单个文件 data read csv file choose skip 6 或者我可以像这样读取多个文件 j list f
  • 使用 VBA 从文件中提取 XML 值

    请相信我 我really已经用谷歌搜索过 但我是使用 VBA 的 XML 新手 我见过的所有示例都使用我所说的 简单 XML 而我的示例 对我来说 似乎更复杂 首先 这是我的 XML 的简单摘录 如果我能设法用块引号附加它
  • 从 PowerShell 执行外部命令不接受参数

    我正在执行以下代码 尝试执行 7z exe 命令来解压缩文件 dir 包含用户输入的 zip 文件路径can当然包含空格 下面的 dir temp2 是我之前创建的目录 Get ChildItem path dir Filter zip F
  • 在 requirejs 模块 javascript 中调用函数内部的函数

    大家好 这可能吗 在 requirejs 模块内的函数内调用函数 TIA define common function Common return func1 function return this is function 1 func2
  • 另一个排列词难题......使用 Linq?

    我见过很多获取给定字母集的所有排列的例子 递归似乎可以很好地获得一组字母的所有可能组合 尽管它似乎没有考虑其中两个字母是否相同 我想知道的是 您是否可以使用 linq 或不使用 将所有可能的字母组合减少到 3 个字母组合 例如 给定字母 P
  • 更新/编辑 localStorage - JSONObject

    是否可以编辑存储在 Web 本地存储上的 JSON 对象 目前我有一个字符串化的 JSON 对象 fname Jerry lname Lewis email email protected password 使用该功能 localStora
  • 将 pdf 页面添加到现有 pdf Objective-c

    我正在为 iphone ipad 编写一个应用程序 将相机图像 png 转换为 pdf 并保存到 user documents 文件夹 现在我试图弄清楚如何将另一个 pdf 附加到现有文档中 这样它们就会变成多页 基本上 如果您将 doc1
  • TJSON.JsonToObject 不通过 setter

    将 Json 字符串转换为我自己的对象时遇到一些问题 我举一些例子 我的课 TClasse class private Fid integer Fnome string procedure Setid const Value integer
  • 如何扩展顶级QTreeview项目

    我不明白为什么这似乎没有扩展 QTreeView 中的顶级根项目 clear existing treeview data model self treeview model sourceModel model clear add tree
  • Android:由同一意图启动多个活动实例。将一个独特的元素带到前台?

    我正在努力开发启动多个实例的应用程序 使用相同意图的相同活动 我的主要活动是课堂类型 A 它对两个相同的子项执行 startActivity B类 所以我们推出了B1和B2 如果 B1 和 B2 都是 暂停 通过按后退按钮并确保未调用 fi
  • Google 运算符的正则表达式

    使用 PHP 我试图通过支持类似 Google 的运算符 例如 关键字 自然 默认 关键字 或 搜索短语 完全匹配 关键字 部分匹配 为此 我需要将字符串拆分为两个数组 一种将确切的单词 但没有双引号 放入 Array1 中 并将其他所有内
  • 合并两个 XElement

    我不太确定如何问这个问题 或者这是否存在 但我需要合并两个 XElement 其中一个优先于另一个 以成为一个元素 这里首选 VB NET 和 Linq 但任何语言如果能够演示如何执行此操作 而无需我编写代码来手动分离和解析每个元素和属性
  • Cucumber:不允许扩展定义步骤定义或挂钩的类

    我从别人那里继承了一个大的测试项目 主要的Java类是CommonSteps CommonBase和CommonScript 它们目前是这样关联的 CommonSteps 扩展了 CommonBase CommonBase 扩展了 Comm
  • 如何在不输入时间的情况下读取两个相同的日期

    我有一个如下查询 SELECT occupation AS Contact occupation sum total AS Quantity FROM SELECT CASE WHEN contacts occupation IS NULL
  • 时间事件监听器

    我的问题 如何让我的应用程序在特定时间执行某些操作 特别是在技术上无法运行的情况下 这可能吗 最佳实践 事件监听器 ETC 扩张 我对 Android 开发还很陌生 我想构建一个调度应用程序 它可以在预先安排的时间控制手机的某些功能 假设我
  • 如何正确初始化平台驱动程序的属性组?

    EDIT 4 我发现我不应该分配attr groups to the groups领域中的driver领域的struct platform driver结构 找评论吧 WRONGO should not be assigned here 以