关注了就能看到更多这么棒的文章哦~

User-space interrupts

By Jonathan Corbet
September 30, 2021
LPC
DeepL assisted translation
https://lwn.net/Articles/871113/

"interrupt(中断)" 这个术语会让人联想到源自硬件的、由内核所处理的那个中断信号,甚至连软中断(software interrupt)也是属于内核的一个概念。但是,似乎有一个场景中会需要让用户空间的进程互相之间直接来发送 interrupt。在 2021 年的 Linux Plumbers 大会上,Sohil Mehta 主持了一场关于 Linux 如何支持这个功能的内核峰会。

Mehta 说,用户空间中断(user-spaceinterrupt,或简称 "user interrupt (用户中断)")这个功能的核心就是要以快速的方式来进行 event signaling (事件通知)。它可以绕过内核,直接向用户空间来传递 signal,从而实现更低的 latency。他说,我们现有的进程间通信机制都有一些局限。同步机制(synchronous mechanism)通常需要用一个专门的线程来做事,会有很高的延迟,而且通常效率很低。异步机制(比如说信号)的延迟甚至更高。所以往往我们唯一的选择就是轮询(polling),这种做法浪费了 CPU 时间。如果能有一个快速、高效的替代方案就更好了。

用户空间中断就是一个很好的选择,它将首先出现在英特尔的 "Sapphire Rapids" CPU 中。支持这一功能的 RFC patch 已于 9 月中旬发布了。这些 patch 支持 user-to-user 的信号发送,不需要经过内核,直接使用新的 SENDUIPI 指令就可以让一个进程直接向另一个进程发送中断了。未来的版本中还会包括 kernel-to-user 的信号发送,并最终支持让设备直接发送中断给到用户空间进程。

Mehta 提供了一些 benchmark 结果(可以在幻灯片中看到),数据显示用户空间中断比使用 eventfd()快 9 倍,比使用管道(pipe)或信号(signal)快 16 倍。如果接收进程在内核中被阻塞了的话,这个优势就会降低,因为在这种情况下无可避免地需要进行上下文切换。即使如此,用户空间中断对接收方来说也要快 10%,而对发送方来说则要快得更多,因为发送方根本不需要进入内核了。Florian Weimer 问道,用户空间中断与 futexes 相比如何,但看起来这方面还没有进行过测试。

这个功能的使用场景当然也会包括快速进程间通信(fast interprocess communication)。那些 user-mode CPU scheduler 调度器可以从中受益,用户空间的 I/O stack(例如 networking stack)也可以受益。要想充分利用这一特性,就需要对 libevent 和 liburing 等库进行修改。Mehta 说目前还没有真正在使用这个功能的应用,他很想听听大家的反馈看有哪些其他可能受益的应用。Ted Ts'o 建议在虚拟化环境中用来进行 host-to-guest 的唤醒;看起来这个用例正在进行调查,但目前还没有实际测试结果。

用户空间的进程出于各种原因不能随意向他人发送中断,这里需要进行一些设置。在接收方,相关的工作都始于一个调用:

uintr_register_handler(handler, flags);

其中 handler() 是用来处理用户空间中断的函数,flags 必须设为 0。handler 函数的定义需要特别注意,它的原型是这样的:

void __attribute__ ((interrupt))handler(struct __uintr_frame *frame, unsigned long long vector);

接下来需要创建至少一个跟这个 handler 关联起来的文件描述符:

int uintr_create_fd(u64 vector, unsigned int flags);

这里,vector 是 0 到 63 之间的一个数字。每个 vector 都可以创建一个文件描述符。然后,该进程将该文件描述符交给发送方。如果发送方是同一进程中的另一个线程,那么这个传递就很简单,否则的话就需要使用 Unix 里的 socket 来传输这个文件描述符了。然后,发送方要通过以下方式来进行配置:

int uintr_register_sender(int fd, unsigned int flags);

其中 fd 是接收者传递过来的文件描述符,flags 和之前一样需要是 0。返回值是一个 handle,可以与 GCC 11 支持的 _senduipi() intrinsic 一起使用来实际进行中断发送到接收者。

中断的实际递交时机要取决于接收方当时正在做什么。如果该进程正在用户空间中运行,那么 handler 函数将会被立即调用,并取得相应的 vector 编号。一旦 handler 处理程序返回了,那么就会在之前被中断的位置继续执行。如果接收者此时被阻塞在内核的系统调用中,那么该中断将会在返回到用户空间时被触发,也就是说并不会打断当前正在进行的系统调用。在 patch set 中有一个 uintr_wait() 系统调用,它的作用是一直阻塞到收到一个用户空间中断,然后就立即返回,但此函数目前的行为还是一个示意性质的,需要等大家决定了这种情况下的理想行为之后再进行修改。

Prakesh Sangappa 询问大家是否真的有必要与所有相关的发送者来传递文件描述符。在一个可能有大量发送者的系统中,这个动作可能会耗费不少资源。Mehta 回答说这里有几个优化方案正在研究中。Ts'o 询问用户空间中断是否可以广播给多个接收者,回答是不支持广播。

Arnd Bergmann 想知道是否考虑过在老式 CPU 上模拟这一功能。答案似乎是肯定的,内核将捕获相关指令,并采取一种透明的方式来模拟实现它们的行为。Mehta 要求得到关于这个仿真机制的反馈,尤其是这个机制是否应该在其他架构上也实现。Bergmann 不赞成这个想法,他说,如果为这些架构也实现了用户空间中断的话,它们肯定与仿真出来的版本不兼容。他说,对其他架构的仿真应该只有在这些架构自己定义了它们自己的指令之后才能进行。

Greg Kroah-Hartman 询问 Clang 编译器是否支持 _senduipi() intrinsic。这个支持目前正在进行中,但尚未完成。Kroah-Hartman 还询问了从该功能中受益的工作场景的更多细节,Mehta 回答说他也还没有什么具体的东西可以提供。

时间已经不多了,结束这次会议之前,Mehta 问了一个问题,当接收者在系统调用中被阻止时应该发生什么。如前所述,目前的 patch set 在完成中断传递之前会一直等待系统调用返回。我们是否应该改变行为,使之更接近于信号,也就是立即会完成中断传递,而系统调用则被打断并返回 EINTR?没有人对这个问题发表意见,会议就此结束了。

这个讲座的视频可以在 YouTube 上找到。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

LWN:用户空间的中断!相关推荐

  1. 用户空间与内核空间,进程上下文与中断上下文[总结]

    用户空间与内核空间,进程上下文与中断上下文[总结] 最近有研究到zabbix监控,就得清楚cpu各个指标的含义, 1,简单回顾下cpu及计算机组成: 计算机五大部件: 运算器 控制器 存储器 输入/输 ...

  2. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】

    转自:http://blog.csdn.net/lizuobin2/article/details/51791863 本文转载自:http://www.cnblogs.com/Anker/p/3269 ...

  3. 嵌入式之linux用户空间与内核空间,进程上下文与中断上下文

    文章目录 前言 用户空间与内核空间 内核态与用户态 进程上下文和中断上下文 上下文 原子 进程上下文 中断上下文 进程上下文VS中断上下文 原子上下文 前言 之前在学习嵌入式linux系统的时候,一直 ...

  4. LWN:DVB与头文件和用户空间的regression!

    关注了就能看到更多这么棒的文章哦- DVB, header files, and user-space regressions By Jake Edge August 25, 2021 DeepL a ...

  5. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  6. linux 物理内存用完了_Linux用户空间与内核空间(理解高端内存)

    Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图. Linux内核地址空间划分 通常32位L ...

  7. 浅入浅出 Android 安全:第三章 Android 本地用户空间层安全

    第三章 Android 本地用户空间层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 本地用户空间层在 Android ...

  8. Linux预备知识(二):进程空间地划分-用户空间/内核空间

    查看机器上栈大小命令 ulimit -a 或者 ulimit -s 大小不固定,可以用 ulimit -s 进行调整,默认一般为 8M ** 栈区(stack sagment)**:由操作系统自动分配 ...

  9. linux 内核空间与用户空间 简介

    本文以 32 位系统为例介绍内核空间(kernel space)和用户空间(user space). 内核空间和用户空间 对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4 ...

最新文章

  1. EQ设置的基础知识(音乐爱好者必知)
  2. 《Haskell函数式编程入门》—— 第1章,第1.5节第一个Haskell程序HelloWorld!
  3. 1.Easy Touch 3.1
  4. Portable项目类型之前多个目标类型共享代码的方式
  5. 分子机制研究的五个层次,你的研究在哪个层次--转载
  6. 案例 自动办公_国浩分享 | 非诉讼律师办公神器盘点
  7. Python 机器学习——线性代数和矩阵运算:从matlab迁移到python
  8. 10.RabbitMQ实战 --- 监控
  9. 【黑苹果】宏基Acer Predator Helios 300+ i7-7700HQ+Opencore +MacOS10.14.6 efi文件下载!
  10. (7) PyQt 设计并实现【工厂扫码装箱系统】- Python代码实现BarTender自动化打印条码标签
  11. c++中所有权是什么意思_产品所有权如何在现实世界中发挥作用
  12. drhf赫夫生医的产品质量怎么样?
  13. 一个官网很详细的富文本编辑器
  14. 网易2018校招数据分析师笔试答案作答
  15. 系统信息:uname,sysinfo,gethostname,sysconf
  16. KUKA KRC4 控制器截图
  17. 2011年3月《震痛•震恫•震动》
  18. 一台服务器可以安装多个mysql数据库_在一台Linux服务器上安装多个MySQL实例(一)--使用mysqld_multi方式...
  19. 中文文本处理总结(读取文本、文本预处理、分词、去除停用词)
  20. 服务端指南 数据存储篇 | MySQL(03) 如何设计索引

热门文章

  1. Vue 表格循环滚动,鼠标移入暂停,移出继续滚动
  2. consul+docker实现服务注册
  3. 华硕ASUS,无线网络功能差解决方案
  4. ESP32+PlatformIO库开发--TFT_eSPI库例程解析(学习笔记1)
  5. 10倍效率提升的低代码IDE
  6. 航测软件和建模软件介绍
  7. org.apache.http.conn.HttpHostConnectException: Connection to refused
  8. ios、安卓微信中如何清除聊天记录外的缓存
  9. 中国石油大学《马克思主义基本原理概论#》第二阶段在线作业
  10. 三种方法完美绕过安全狗2015最新版