从内核空间到用户空间的事件通知

2024-02-08

当内核空间发生事件时如何通知用户空间应用程序?

当数据到达某个 GPIO 时,硬件会生成中断。 该数据被复制到内核缓冲区。此时,我希望驱动程序通知应用程序它可以调用read函数将数据从内核缓冲区复制到用户空间缓冲区。

我想用epoll方法,但是epoll指示设备是否准备好读取。我想要的是,epoll指示内核缓冲区何时已满。

并且,有没有办法修改poll_wait()驱动程序中的功能?


(已在聊天会话中回复,但似乎这应该在答案中,因此将其更详细地放在这里。)

poll_wait 的作用是将您的驱动程序添加到用户空间程序正在等待的文件描述符列表中。模式是:

  • 用户程序调用poll/select/epoll_ctl
  • 核心内核调用驱动程序的轮询入口点
  • 驱动程序调用 poll_wait 将其等待队列添加到等待队列列表中(除非 GPIO 数据已经可读,您通过返回值指示)
  • 稍后,当设备中断时,您在等待队列上调用wake_up,如果进程(仍在)在轮询/选择调用中等待,则这会解除进程的阻塞
  • 用户态程序唤醒,调用read实际获取数据

IOW,poll_wait 本身不会休眠(或阻塞);它只是将您的设备添加到稍后可能唤醒该进程的程序列表中。睡眠是在核心内核中完成的(例如,在 select 系统调用内)。这样,用户程序可以使用 select 同时等待任意数量的设备。

如果您的用户空间程序在等待时确实没有其他事情可做,那么您可以简单地读取用户程序调用,并让您的驱动程序设置其等待队列并调用 wait_event_interruptible (或其他 wait_event_* 之一)变体)。这将阻塞进程,直到您的中断处理程序调用wake_up;此时您从内核缓冲区复制到用户缓冲区。

或者您可以支持这两种方法。通常,如果您支持 select 方法,您还可以在读取函数中检查 O_NONBLOCK 文件标志,以便用户代码可以选择not阻止读取。

是的,ISR 可以调用wake_up。这是设备 I/O 的常见模式:在“进程上下文”中等待/阻塞,在“中断上下文”中唤醒,然后返回进程上下文后完成 I/O。

BTW,从驱动程序的角度来看,使用 select、poll 或 epoll 通常是相同的。从用户的角度来看,使用 select 或 poll 更容易一些。这是一个“一次性”交易:“这里有一组文件描述符;阻塞直到其中一个准备好读取(或写入等)或直到超时”。

而使用 epoll,首先创建一个 epoll 描述符,然后单独添加 I/O 文件描述符。但是“wait”调用只指定单个 epoll 描述符。因此,如果您有大量文件描述符需要等待,则不必在每个系统调用中指定所有文件描述符,这会降低每个 epoll 调用的系统调用开销。

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

从内核空间到用户空间的事件通知 的相关文章

  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • Apache 端口转发 80 到 8080 并访问 Apache (80) 中托管的应用程序,即 phpMyadmin 和 Tomcat (8080)

    我想访问托管在 tomcat 服务器 8080 中的应用程序 myapp 当前可以通过以下方式访问http example com 8080 myapp http example com 8080 myapp in http example
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h

随机推荐

  • 如何预加载 .net 程序集

    在我的工作中 我们正在使用 net Framework 4开发不同的应用程序 所有应用程序都使用我们开发的通用程序集 例如data dll中的数据层 这些应用程序驻留在网络驱动器上并直接从那里启动 大多数大型应用程序第一次启动 冷启动 需要
  • 在python中将数字表示为二的幂之和的最快方法是什么

    例如 gt gt gt two powers 42 gt gt gt 2 8 32 我目前的幼稚实现 取自here https stackoverflow com a 27936818 1177288 看起来像那样 def two powe
  • 如何优雅地停止单节点 kubernetes 集群

    我已经根据 官方教程 1 设置了单节点kubernetes 除了官方文档之外 我还设置了单节点集群 kubectl taint nodes all node role kubernetes io master 残疾人驱逐限制 cat lt
  • Windows 窗体,从父窗体获取属性

    我遇到了一点问题 我在父表单中有一个数据表 我打开一个对话框表单 获取数据表属性并创建一个复选框列表 这将用于导出这些列 但是当我运行应用程序时 parentform 属性为空 我尝试在父窗体和对话框窗体中设置它 我假设如果调用 ShowD
  • 我在哪里弄乱了输出格式?

    因此 当我尝试运行代码时收到一条错误消息 但我无法弄清楚问题到底是什么 它说这是一个 ValueError 但我不知道到底是哪一个 也许只是迟到了 但我却不知所措 这是我的代码 def sort count dict avg scores
  • 为Android应用程序设置图标

    如何为我的 Android 应用程序设置图标 如果您希望您的应用程序在多种设备上可用 您应该将应用程序图标放在不同的位置res drawable 提供的文件夹 在每个文件夹中 您应该包含一个 48dp 大小的图标 drawable ldpi
  • go helm 图表模板中的循环[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在尝试在 kubernetes helm 图表中循环计数 如下所示 reaction mongo url big mongodb for m
  • TypeScript 将camelCase 键转换为snake_case

    想象一下 我们有一些具有驼峰命名法属性的对象类型 type Foo propertyBob string propertyJane number 有没有办法创建一个将camelCase转换为snake case的泛型 例如 type foo
  • 发布操作:“提交助手应用程序时出错”,没有显示错误

    我正在尝试发布我的第一个 Google Assistant 操作 但在尝试提交应用程序时 控制台告诉我 提交助理应用程序时出错 但没有任何详细信息 是否有任何日志或其他内容可以为我提供有关在提交之前需要修复的更多详细信息 我迷路了 谢谢 许
  • Pytorch RuntimeError:CUDA 内存不足且有大量可用内存

    在训练模型时 我遇到了以下问题 RuntimeError CUDA out of memory Tried to allocate 304 00 MiB GPU 0 8 00 GiB total capacity 142 76 MiB al
  • 使用 NetBeans 6.8 进行 XSLT 自动完成

    我记得当时NetBeans 6中支持XSLT 现在我使用NetBeans 6 8 但仍然找不到这样的插件 你能帮助我吗 工具 gt 插件 gt 设置添加http updates netbeans org netbeans updates 6
  • 优化TreeView方法

    我有一个非常大的方法可以插入子元素TreeView 基本上我做了两个不同的查询 并在 I N 上设置了很小的更改 第一个 foreach 插入父级的第一个子级 第二个 foreach 插入之前创建的子级的子级 Foreach查询只是改变条件
  • Android 兼容包不包含 Activity.getFragmentManager()

    我开始尝试使用 3 月 3 日刚刚发布的 Android 兼容包向我的 Android 应用程序添加片段 该应用程序基于 2 1 我将该库包含到我的项目中 并开始将代码从基于 Activity 的类移动到基于 Fragment 的类 但我注
  • 如何在复杂的单元格中找到元素?

    我有一个复杂的元胞数组 例如 A 1 2 3 4 5 6 7 8 9 10 如何找到A中的元素 例如 我想检查 9 是否在 A 中 如果您的元胞数组可以有任意数量的嵌套级别 则只需递归所有级别即可检查值 这是一个可以执行此操作的函数 fun
  • iPhone:如何使用 Xcode 向 Web 服务发送 HTTP 请求

    如何使用 Objective C 向 Web 服务发送 HTTP 请求 我需要从 MySQL 数据库中获取一些数据 因此我需要发送请求以便获取数据 编辑 因为这是一个热门问题 而且时间在不断流逝 与此同时 Apple 引入了 NSJSONS
  • 使用第三方库和 Carthage 进行单元测试

    使用 Carthage 进行依赖管理的正确方法是什么 而且还能够用它为其引入的类型编写测试 例如 这是假设的 如果我引入 AlamoFire 并假设它有一个响应协议和不同的协议具体类型符合响应协议 在我自己的图书馆里 如果我要做的话 tes
  • 沿给定轴打乱 NumPy 数组

    给定以下 NumPy 数组 gt a array 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 洗牌单行很简单 gt shuffle a 0 gt a array 4 2 1 3 5 1 2 3 4 5 1 2 3 4 5 是
  • 如何从 Angular 中的 NgFor 循环中删除重复记录

    我正在尝试从 ngfor 循环中删除重复记录 并仅保留该记录点击次数最多的记录 目标是显示用户的点击 URL 但目前 当为同一 URL 创建新记录时 它会显示在列表中 见下图 点击操作按预期进行 但一段时间后列表将变得难以辨认 我正在尝试展
  • R:从 Quanteda DFM、稀疏文档特征矩阵、对象中删除正则表达式?

    Quanteda 包提供了稀疏文档特征矩阵 DFM 其方法包含删除功能 https rdrr io cran quanteda man removeFeatures html 我努力了dfm x removeFeatures b a z 1
  • 从内核空间到用户空间的事件通知

    当内核空间发生事件时如何通知用户空间应用程序 当数据到达某个 GPIO 时 硬件会生成中断 该数据被复制到内核缓冲区 此时 我希望驱动程序通知应用程序它可以调用read函数将数据从内核缓冲区复制到用户空间缓冲区 我想用epoll方法 但是e