热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

内核到用户空间的低延迟通信-Kerneltouserspacecommunicationwithlowlatency

Ihavemykernelmodulethatreceivesinterrupt(top-half)fromtheexternalGPIOpinchange.我的
  • I have my kernel module that receives interrupt (top-half) from the external GPIO pin change.
  • 我的内核模块接收来自外部GPIO pin更改的中断(上半部分)。
  • After receiving the interrupt, kernel module should wake up or somehow invoke the function/thread in the user-space that will start processing. Time is very limited.
  • 在接收到中断之后,内核模块应该唤醒,或者以某种方式调用用户空间中将要开始处理的函数/线程。时间是非常有限的。
  • No data needs to be sent, just the signal.
  • 不需要发送数据,只需要发送信号。
  • CPU is multicore, user-space app will have affinity to one core.
  • CPU是多核的,用户空间应用会与一个核心有亲和力。

There are so many ways to do kernel-userspace communication. Which one has the lowest latency? (i.e. the time between ISR and waking up the function).

有很多方法可以进行内核-用户空间通信。哪个延迟最小?(即ISR和唤醒函数之间的时间)。

(Side note: Yes, I can benchmark them, the reason I'm asking the question is because I may not know about every possible solution)

(附带说明:是的,我可以对它们进行基准测试,我问这个问题的原因是我可能不知道所有可能的解决方案)

2 个解决方案

#1


3  

The interrupt handler could write directly into a mapped memory range provided by the process, while the process is busy-waiting for that memory location to change. This can even be performed in the top-half and should provide you with the lowest latency possible. Make sure, that the memory location provided is locked into physical memory, since it cannot be paged in during the isr.

中断处理程序可以直接写入进程提供的映射内存范围,而进程则忙于等待该内存位置的更改。这甚至可以在上半部分执行,并且应该为您提供尽可能低的延迟。确保所提供的内存位置被锁定在物理内存中,因为在isr中不能对其进行分页。

Similar approaches can be found with packet sockets and PACKET_MMAP, where communication between kernel and userspace takes place through a shared memory space (see the Kernel Documentation).

包套接字和PACKET_MMAP也有类似的方法,内核和用户空间之间通过共享内存空间进行通信(请参阅内核文档)。

If you do not care about resource management through the OS (because you only have a single application waiting for external input), you could also choose to directly access the hardware from userspace (with iopl/inb/outb and friends).

如果您不关心通过OS进行资源管理(因为您只有一个应用程序等待外部输入),您还可以选择直接从userspace(使用iopl/inb/outb和friends)访问硬件。

#2


0  

A standard way for the process to wait for the kernel to wake it is to use the poll() system call and for your device driver's interrupt handler to wake any threads waiting for it.

进程等待内核唤醒的标准方法是使用poll()系统调用和设备驱动程序的中断处理程序唤醒等待它的任何线程。

The longest latency operation listed in your 4 bullets is waking the application thread, so if you need even shorter latency you need the thread to be awake but waiting for the event.

在您的4个项目中列出的最长延迟操作是唤醒应用程序线程,因此如果您需要更短的延迟,您需要线程处于清醒状态,但需要等待事件。

The lowest latency mechanism I have used is to have the interrupt write a word in the application process and to have a thread reading that word and proceeding when the value is changed. In effect, a spin lock between user space and kernel space. Use this mechanism when you can dedicate a CPU core to the spin lock or when you expect the waiting time to be very short.

我使用的最低延迟机制是让中断在应用程序进程中编写一个单词,并让线程读取该单词并在值更改时继续执行。实际上,用户空间和内核空间之间的自旋锁。当您可以将CPU核心用于自旋锁时,或者当您预期等待时间非常短时,请使用此机制。

You can use an ioctl() to pass in a user space pointer to the driver so it knows which word to update.

您可以使用ioctl()将用户空间指针传递给驱动程序,以便它知道要更新哪个单词。


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
熊熊oO7sloveV
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有