dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么

2023-11-25

我只是想知道当我们必须使用这些设置并获取驱动程序 API 时,可能的用例是什么。 我所知道的是数据被保存了,稍后我们可以使用数据来做一些事情。我的问题是我们什么时候真的需要这样做?

     /*
      * These exports can't be _GPL due to .h files using this within them, and it
      * might break something that was previously working...
     */
     void *dev_get_drvdata(const struct device *dev)
     {
          if (dev && dev->p)
                  return dev->p->driver_data;
          return NULL;
     }
     EXPORT_SYMBOL(dev_get_drvdata);

     void dev_set_drvdata(struct device *dev, void *data)
     {
        int error;
 
        if (!dev)
                 return;
        if (!dev->p) {
                 error = device_private_init(dev);
                 if (error)
                         return;
        }
        dev->p->driver_data = data;
     }
     EXPORT_SYMBOL(dev_set_drvdata);

驱动程序核心处理运行驱动程序的不同阶段。您可以将驱动程序代码视为一组回调,例如->probe(), ->remove(), 等等。详细信息您可以查看struct platform_driver or struct pci_driver定义。

那么,如何在回调之间进行通信呢?

是的,你至少有两种方法:

  • 在模块中引入全局变量[通常是坏主意]
  • 根据您的情况,在回调参数中指定一些内容struct device或其子项(struct pci_dev例如)。

因此,我们有一个指向私有成员的指针,它可以用作应通过回调传递的有用信息的容器。

为什么我们需要那个?大多数驱动程序请求一些资源并将指向它们的指针保存在probe阶段。为了避免资源泄漏,您必须在remove阶段。就是这么用的。

正如所指出的allsey87,另一个有用的模式是通过回调传递设备的当前状态。真实的例子之一是电源管理回调(->suspend(), ->resume(), etc).

有趣的是,该书的作者Linux Misc Device:一般保护故障misc_deregister()在具有私有数据分配的驱动程序上问题尝试使用其他设备的驱动程序数据(可通过this_device成员struct miscdevice)。然而,正如我们所看到的,misc 设备框架使用该字段来满足自己的需要,用户不得干预。在这种情况下,正确的方法是嵌入struct miscdevice进入您的自定义结构和使用container_of()方法(记住 Linux 内核是用 OOP 范式编写的)。例子:https://elixir.bootlin.com/linux/v6.5-rc3/source/lib/test_kmod.c#L121(定义),https://elixir.bootlin.com/linux/v6.5-rc3/source/lib/test_kmod.c#L153(吸气剂)。

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

dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么 的相关文章

  • 如何使用 Yocto SDK 构建 Linux 内核模块?

    我正在尝试使用 Yocto SDK 构建 Linux 内核模块 但是 我遇到了编译错误 它抱怨 include uapi asm generic int ll64 h 12 10 fatal error asm bitsperlong h
  • 为什么linux内核中的udelay和ndelay不准确?

    我做了一个这样的函数 trace printk 111111 udelay 4000 trace printk 222222 日志显示它是 4 01 毫秒 没问题 但当我这样打电话时 trace printk 111111 ndelay 1
  • 在设备树中注册 snd-soc-dummy

    我正在尝试在我的设备树源文件中注册 soc utils 中提供的 ALSA 虚拟编解码器 以将其与 i2s 设备驱动程序 sun8i i2s 一起使用 我尝试在 i2s 配置中设置 sound dai 字段 如下所述 https patch
  • 何时使用linux内核add_timer与queue_delayed_work

    要安排稍后在 Linux 内核驱动程序中发生的操作 我有 2 个选项 add timer queue delayed work 我知道的一个区别 对于计时器 您需要指定expires这是定时器到期时的 jiffies 值 对于延迟工作 您需
  • C 中的函数模拟?

    我正在编写一个单元测试来检查一些 API 调用 我正在使用检查来测试 我的模块是使用 CMake 构建的 如果重要的话 我不知道 我的测试调用一个函数 我需要测试 并且该函数调用另一个二进制文件 它的简化版本看起来像这样 unitTest
  • Linux下删除/重写/生成键盘事件

    我想在 Linux 下挂钩 拦截和生成键盘 make break 事件 然后再将它们传递给任何应用程序 更准确地说 我想检测关键事件流中的模式 并能够根据检测到的模式丢弃 插入事件到流中 我在 SO 上看到了一些相关问题 但是 它们要么只处
  • Linux内核:从内核空间调用用户空间的回调函数

    我正在编写 Linux 用户空间应用程序 我想从内核空间调用用户空间区域中注册的回调函数 即中断到达 GPIO 引脚 开关按下事件 并在用户空间中调用注册函数 有没有什么方法可以做到这一点 Thanks 经过大量挖掘后 我发现了下面的代码
  • 如何从 Linux 内核空间向用户空间发送信号以通知输入硬件事件

    我的内核模块代码需要向用户态程序发送信号 以将其执行转移到注册的信号处理程序 事实上 我为我的嵌入式板开发了一个 C 程序 当我按下按钮 输入事件 时 它可以使 LED 打开和关闭 另一方面 我刚刚开发了一个简单的 Linux 模块及其基本
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • Spidev 不使用 ioctl 同时写入/读取

    我希望找到一些帮助 即使这个问题可能更多地与硬件相关而不是与软件相关 我们将会看到 我正在开发基于 Freescales P1021 处理器 ppc e500v2 内核 的定制板 将连接外部 PCB 并可通过 SPI 进行配置 该外部 PC
  • P1010 MAC到交换机端口直连,无需PHY

    我有一个带有飞思卡尔 P1010 处理器的定制板 其中 P1010 的 eTSEC2 增强型 3 速以太网控制器 端口在 SGMII 模式下直接连接到 Marvell 88E6046 以太网交换机端口 9 Linux 3 17 DSA 驱动
  • request_threaded_irq 的“处理函数”中的 I2c 读取和写入操作如何影响整个驱动程序?

    我有一个带有 request threaded irq 的处理函数和线程函数的驱动程序代码 与此类似 irq handler fn disable device interrupt i2c read from register set di
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓
  • 类似于 ftrace 打印 CPU 编号

    我想打印当前进程或函数正在执行的 CPU 编号 类似于 ftrace 如下所示 TASK PID CPU TIMESTAMP FUNCTION
  • 添加条目到task_struct并初始化为默认值

    我想添加一个条目到进程控制块结构 task struct 让我们说一种标记某些进程的方法 我想将除 一些特殊进程 之外的所有进程的该字段初始化为 0 稍后通过调用sched setscheduler 我将为 特殊进程 设置此标志 有谁知道如
  • 以零长度调用 write() 会产生什么后果?

    在 Linux 中处于相当高的水平write 函数 它会过滤掉写入 0 长度缓冲区的请求 这是有道理的 谁愿意操作系统浪费时间钻探各层只是为了确定没有任何工作要做 嗯 我 这与Linux 内核中的 I2C 写入确认轮询 https stac
  • Linux内核中断处理程序互斥保护?

    我是否需要保护我的中断处理程序被同一中断多次调用 鉴于以下代码 我不确定应该进行的系统调用 我在当前的实现中遇到了罕见的随机死锁 void interrupt handler void down interruptible sem or u
  • 将内核内置模块替换为可加载模块

    我开发了一个内核模块来管理 nf4 标签作为字符设备 我在内核之外开发了这个模块 并在开发阶段将其编译为可加载内核模块 即 ko 进行了测试 一旦驱动程序功能正常且足够稳定 我就使用补丁将其插入 Linux 内核源代码 v4 9 30 以便
  • 开放固件设备树概述/参考手册

    我正在尝试为嵌入式 PowerPC 板设置驱动程序 今天执行此操作的正确方法是使用 OpenFirmware 设备树数据结构 dtb 文件 从 dts 文件编译 创建树非常简单 但是如何让我的设备驱动程序找到它的节点和其中的数据 我还没有找
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct

随机推荐

  • PyCharm导入外部库

    我在 Houdini 中使用 PyCharm 作为 python 代码的编辑器 每当我尝试导入主 Houdini 库 hou 时 我都会在 PyCharm 中收到错误标记 如果我包含代码片段 try import hou except Im
  • jQuery nth-child 在之后添加 html

    我有一个简单的无序列表 其中包含 16 个列表项 我想使用 jQuery 在每四个现有列表项之后添加一个新列表项 我该怎么做呢 代码如下 ul li some stuff li li some stuff li li some stuff
  • 在内存限制的嵌入式系统中使用boost

    我们正在使用 C 开发一个在嵌入式系统上的 Windows CE 4 中运行的应用程序 我们的限制之一是应用程序使用的所有内存都应在仅启动 我们编写了许多仅使用预先分配的内存而不是分配新内存的容器和算法 您认为在这种情况下我们可以使用 bo
  • QListView 当列表为空时显示文本

    当 QListView 中没有项目时 我想显示一些文本 例如 没有项目 我尝试重写QListView的paintEvent方法 但没有任何效果 下面的代码展示了一种简单的方法 通过重载paintEvent视图的方法 文本的绘制可能应该使用样
  • jQuery 表单验证不起作用

    我花了几个小时在这上面 但我不知道为什么这个 jquery validate 不起作用 我最后把它分解到最低限度 但它仍然不起作用 这是实际的代码
  • 如何通过GA4测量协议识别用户所在国家

    可以通过 GA4 测量协议检索地理位置吗 我必须如何配置 json 正文来发送地理位置 例如通过 HitBuilder 我有同样的问题 并在下面的票证中询问谷歌 https issuetracker google com issues 23
  • .Net 和 iPhone 之间的 AES 互操作性?

    我需要加密 iPhone 上的字符串并将其发送到 Net Web 服务进行解密 我可以在 iPhone 上使用 Net 进行加密 解密 但来自 iPhone 的加密字符串无法通过 Net 解密 我收到的错误是 填充无效且无法删除 Net代码
  • 如何使用 PHP 连接 Dropzone.js 上传的分块文件?

    我使用 Dropzone js 获取各种类型的文件 包括图像和非图像 例如 PDF 并将它们以 1mb 块的形式上传到我们的服务器 然后 我尝试使用 PHP 连接这些文件 然后将它们上传到我们公司的 FileMaker 数据库 到目前为止
  • 在 github 操作上运行 firebase 模拟器

    我正在尝试在 Github Actinos 上运行测试 但经过多次尝试后我无法做到这一点 接收 错误 firestore Firestore 模拟器已退出 因为未安装 java 您可以从以下位置安装它https openjdk java n
  • PHP sendmail 在 Ubuntu 命令行中工作,但不能在 php 文件中工作

    我在 Ubuntu 上使用 PHP 和 apache 安装了 sendmail 当我尝试以下命令行时 php r mail email protected test test 它成功发送电子邮件 但是 运行文件 test send mail
  • 在 C# 客户端中为 gRPC 设置 keepalive

    我在 C 中使用 gRPC 客户端并使用长期存在的双工流 但是 TCP 连接有时会关闭 因此我想在客户端中使用 keepalive 服务器 用 Go 编写 已经针对 keepalive 进行了正确配置 并且已经使用 Go 编写的客户端进行了
  • 在设备上运行 OCUnit 应用程序测试套件时偶尔出现错误

    运行应用程序测试 即在设备上 时 我的 OCUnit 测试套件遇到一些问题 有时 我会收到一个棘手的错误 该错误似乎是从 OCUnit 类引发的 我一直在尝试查看添加到测试套件中的文件 但无法理解它 在设置测试目标时 我遵循了 Apple
  • JTextField,使用文档过滤器过滤整数和句点

    编辑 在帖子末尾添加我们能够实现的答案 这是我在 SO 的第一篇文章 所以我希望我能问好一切 尽管发布了类似的问题 但我进行了搜索 但没有找到我的问题的答案 所以我希望这不是重新发布 这就是我得到的 一个使用的小应用程序JTextField
  • 在SendComplete中处置SmtpClient?

    当我使用SmtpClient的SendAsync发送电子邮件时 如何处理smtpclient实例正确吗 比方说 MailMessage mail new System Net Mail MailMessage Body MailBody T
  • Python 中与 pandas 进行大型合并时出现 MemoryError

    我正在用 pandas 来做outer合并一组大约 1000 2000 个 CSV 文件 每个 CSV 文件都有一个标识符列id它在所有 CSV 文件之间共享 但每个文件都有一组唯一的 3 5 列列 大约有 20 000 个独特的id每个文
  • openpyxl 无法读取严格的 Open XML 电子表格格式:用户警告:文件包含 Sheet1 的无效规范。这将被删除

    我的一些用户 都使用 Mac 已将 Excel 上传到我的应用程序中 但应用程序拒绝了它 因为该文件似乎是空的 经过一些调试后 我确定该文件是以 Strict Open XML Spreedsheet 格式保存的 并且 openpyxl 2
  • 如何限制哪些国家/地区可以查看我的网站 ( PHP )

    在 PHP 中有一个简单的方法可以做到这一点 我想确保只有来自某些国家 地区的网络请求才能访问我的网站 有任何想法吗 使用 IP 地理定位数据库 有些是免费的 和 SERVER REMOTE ADDR 来获取访问者的 IP 地址 http
  • Numpy 中 Scipy 模式函数的替代方案?

    numpy 中是否有另一种方法来实现 scipy stats mode 函数以获取 ndarrays 中沿轴最频繁的值 无需导入其他模块 即 import numpy as np from scipy stats import mode a
  • onActivityResult 未在片段 android 中调用[重复]

    这个问题在这里已经有答案了 这是我从画廊拍照的代码 public class FragmentLayout1 extends Fragment implements OnClickListener View root Context c B
  • dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么

    我只是想知道当我们必须使用这些设置并获取驱动程序 API 时 可能的用例是什么 我所知道的是数据被保存了 稍后我们可以使用数据来做一些事情 我的问题是我们什么时候真的需要这样做 These exports can t be GPL due