漫画-Linux中断子系统综述

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=png

1、中断引发的面试教训

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png

2、什么是中断?

中断: (英语:Interrupt)指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。
即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
中断 在嵌入式软件中几乎不能离开它,你看到的几乎所有的芯片都有中断功能,不管是裸机程序STC89C51还是嵌入式Linux系统,还是其他的RTOS系统都有中断。每个外接设备申请一个唯一的中断号,让外设发生中断时,向CPU报告自己的中断号,CPU知道是哪个设备发生中断,然后执行相对应的操作。

640?wx_fmt=png

3、为什么要用中断?

640?wx_fmt=png

4、Linux中断子系统

640?wx_fmt=png

4.1、中断系统相关硬件描述

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

4.1.1、多个Interrupt controller和多个cpu之间的拓扑结构

640?wx_fmt=png
  • 第一种,就是有一个Root GIC(Generic Interrupt Controller)连接多个CPU,然后second GIC 接在 Root GIC上,Sencond GIC只负责上报中断信息给Root GIC,Root GIC负责接收Second GIC中断信息然后给CPU汇报中断信息。

    640?wx_fmt=png
  • 第二种就是Root GIC 负责给cpu0-cpu4汇报工作,Second GIC负责给cpu3-cpu7汇报工作。这样设计的弊端就是Second GIC上的中断信号不能传给Cpu0-Cpu3,这样的设计理论上不是很完美。

    640?wx_fmt=png

4.1.2、Interrupt controller把中断事件送给哪个CPU?

640?wx_fmt=png

在 SMP 体系结构中(cpu三大架构 numa smp mpp 之一),我们可以通过调用系统调用和一组相关的宏来设置 CPU 亲和力(CPU affinity),将一个或多个进程绑定到一个或多个处理器上运行。
中断在这方面也毫不示弱,也具有相同的特性。中断亲和力是指将一个或多个中断源绑定到特定的 CPU 上运行。中断亲和力最初由 Ingo Molnar 设计并实现。
在 /proc/irq 目录中,对于已经注册中断处理程序的硬件设备,都会在该目录下存在一个以该中断号命名的目录 IRQ# ,IRQ# 目录下有一个 smp_affinity 文件(SMP 体系结构才有该文件),它是一个 CPU 的位掩码,可以用来设置该中断的亲和力, 默认值为 0xffffffff,表明把中断发送到所有的 CPU 上去处理。如果中断控制器不支持 IRQ affinity,不能改变此默认值,同时也不能关闭所有的 CPU 位掩码,即不能设置成 0x0。


举个栗子
我们以网卡(eth1,中断号 44 )为例,在具有 8 个 CPU 的服务器上来设置网卡中断的亲和力(以下数据出自内核源码 Documentation\IRQ-affinity.txt):

[root@moon 44]# cat smp_affinity
ffffffff
[root@moon 44]# echo 0f > smp_affinity
[root@moon 44]# cat smp_affinity
0000000f
[root@moon 44]# ping -f h
PING hell (195.4.7.3): 56 data bytes
...
--- hell ping statistics ---
6029 packets transmitted, 6027 packets received, 0% packet loss
round-trip min/avg/max 
0.1/0.1/0.4 ms
[root@moon 44]# cat /proc/interrupts | grep 44:
 44:   0   1785   1785   1783   1783   1   1   0   IO-APIC-level   eth1
[root@moon 44]# echo f0 > smp_affinity
[root@moon 44]# ping -f h
PING hell (195.4.7.3): 56 data bytes
..
--- hell ping statistics ---
2779 packets transmitted, 2777 packets received, 0% packet loss
round-trip min/avg/max 
0.1/0.5/585.4 ms
[root@moon 44]# cat /proc/interrupts | grep 44:
 44:  1068  1785  1785  1784   1784   1069   1070   1069   IO-APIC-level  eth1
[root@moon 44]#

在上例中,我们首先只允许在 CPU0-3 上处理网卡中断,接着运行 ping 程序,不难发现在 CPU4-7 上并没有对网卡中断进行处理。然后只在 CPU4-7 上对网卡中断进行处理, CPU0-3 不对网卡中断进行任何处理,运行 ping 程序之后,再次查看 /proc/interrupts 文件时,不难发现 CPU4~7 上的中断次数明显增加,而 CPU0~3 上的中断次数没有太大的变化

640?wx_fmt=png

4.2、中断子系统相关的软件框架

640?wx_fmt=png

4.2.1、中断上半部分和下半部分

中断处理程序的这两个目标相互冲突:

  • 快点执行

  • 执行大量工作

由于这些竞争目标,中断的处理分为两部分或一半:

  • 上半部分。中断处理程序是上半部分。上半部分在收到中断后立即运行,仅执行对时间要求严格的工作,例如确认收到中断或重置硬件。

  • 下半部分。可以在以后执行的工作推迟到下半部分。下半部分将在更方便的时间运行,并启用所有中断。

4.2.2、中断分类

中断如果分为两大类,那就是同步中断和异步中断,如果根据中断原因来分,可以分为四种。具体如下图

640?wx_fmt=png

640?wx_fmt=png

4.2.3、中断上下文

执行中断处理程序时,内核处于中断上下文中
与进程上下文的区别:
进程上下文是内核在代表进程执行时所处的操作模式,例如执行系统调用或运行内核线程。
在进程上下文中,current宏(在内核中,可以通过current宏来获得当前执行进程的task_struct指针)指向关联的任务。
由于进程在进程上下文中耦合到内核,因此进程上下文可以休眠或以其他方式调用调度程序。

current宏在发生中断的时候,它指向中断的进程。
没有后备进程,中断上下文无法休眠,无法重新安排。因此,您无法从中断上下文中调用某些函数。如果函数休眠,则不能从中断处理程序中使用它:这限制了可以从中断处理程序调用的函数。中断上下文是时间关键的,因为中断处理程序会中断其他代码。
应该记住,中断处理程序已经中断了其他代码(可能甚至是另一行上的另一个中断处理程序)。由于异步性质,所有中断处理程序必须尽可能快速和简单。应尽可能地将工作从中断处理程序中推出,并在下半部分执行,后者在更方便的时间运行。

4.2.4、linux kernel的中断子系统

架构图如下所示:

640?wx_fmt=png

由上面的block图,我们可知linux kernel的中断子系统分成4个部分:
  • 硬件无关的代码,我们称之Linux kernel通用中断处理模块。无论是哪种CPU,哪种controller,其中断处理的过程都有一些相同的内容,这些相同的内容被抽象出来,和HW无关。此外,各个外设的驱动代码中,也希望能用一个统一的接口实现irq相关的管理(不和具体的中断硬件系统以及CPU体系结构相关)这些“通用”的代码组成了linux kernel interrupt subsystem的核心部分。

  • CPU architecture相关的中断处理。 和系统使用的具体的CPU architecture相关。

  • Interrupt controller驱动代码 。和系统使用的Interrupt controller相关。

  • 普通外设的驱动。这些驱动将使用Linux kernel通用中断处理模块的API来实现自己的驱动逻辑。

4.2.5、中断调试

  • 用示波器查看硬件是否真实产生了中断

  • cat /proc/interrupts  里面列举了系统申请的所有中断,查看自己注册的中断是否在里面

  • cat cat /proc/irq/[num]/  里面很多可以查看和调试的参数

4.2.6、Linux中断是否可以嵌套吗?

640?wx_fmt=png

640?wx_fmt=jpeg

它的commit log清晰地解释中断嵌套可能引入的一些risk,比如stack溢出等。也就是说,从这个commit开始,实际Linux已经不再支持中断的嵌套, 也没有快慢中断的概念了,IRQF_DISABLED标记也作废了。在IRQ HANDLER里面,无论一个中断设置还是不设置IRQF_DISABLED, 内核都不会开启CPU对中断的响应
具体查看链接:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e58aa3d2d0cc
640?wx_fmt=png

640?wx_fmt=png

5、参考

http://www.wowotech.net/irq_subsystem/interrupt_subsystem_architecture.html/comment-page-2
https://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html
https://notes.shichao.io/lkd/ch7/#interrupt-control


推荐阅读

pthread_mutex_lock&nbsp引发的血案

linux 内核宏container_of剖析

这才是你想要桶排序

堆和栈的区别(转过无数次的文章)

写给过得很辛苦很迷茫的你~一定要看啊


640?wx_fmt=png


当你看到这里的时候,说明你已经阅读完上面的内容

不管怎样,感谢您有心或者无意的关注和支持

公众号接入了AI功能,回复任意消息(比如笑话,天气

觉得不错,请帮忙转发,点好看,您的每一次支持,我都将铭记于心

想获取学习资料,请点击状态栏公众号福利按钮



640?wx_fmt=jpeg




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL强化(二) 在Oracle 中写代码

一 : 关于查询中的转换 -- 字符串转换 一 : decode 函数 转换 SELECT DECODE ( PROTYPE.PRO_TYPE_DATE, L, 长, m, 短, 默认值 )FROM PROTYPE -- 字符串转换 二 : case 转换 SELECT T1.PRO_TYPE_ID, T1.PRO_TYPE_NAME, CASE T1.PRO_TYPE_DATEWHEN S THEN 短WHEN L THEN 长EL…

vue 非es6 写法怎么按须加载_Vue源码必学指南:flow(语法检查)以及rollup(模板打包)...

点击上方蓝色字关注我们~一、前言虽然 Vue3 已经公开了代码,但是Vue3.0还处于开发阶段,直接上手使用Typescript是不合适的 , 对于前端的老手是不错的选择, 但是如果没有研究源码经验的开发者还是建议使用完善, 成熟的源码进行入手. 而 Vue 2.x 中使用的 flow 是一个…

漫画|创业到底有多难?

我有一群同事,我们一起经历了一个产品从无到有的过程,从开始的斗志满满到最后跟老板的不欢而散,其中的辛酸苦楚也许只能我们自己能体味,在这过程中,我们共同经历过的事情,有快乐的,悲伤的&#…

生成step文件_利用opencv给彦女王生成一副蒙太奇画像

大家好呀,前两天烈阳天道1上映了,不知道大家看没看呢,里面还有一小段彦穿越虫洞与猴哥相遇的画面,彦女王啊啊啊~~所以我去网上爬了二百来张我大学的风景画,然后找了以前存的彦女王的图片,生成了一幅蒙太奇画…

浪漫情人节|C语言画心型

1.前言新年第一天上班,先祝大家新年快乐,巧的是,今天刚好又是情人节,所以想了下用C实现画心形符号~过年的时候,跟我表哥去接新娘,实地看了下,如果一个汉字内心没有点浪漫的细胞,很难…

CS190.1x Scalable Machine Learning

这门课是CS100.1x的后续课,看课程名字就知道这门课主要讲机器学习。难度也会比上一门课大一点。如果你对这门课感兴趣,可以看看我这篇博客,如果对PySpark感兴趣,可以看我分析作业的博客。 Course Software Setup 这门课的环境配置…

./4.sh: No such file or directory

sh push到目标板后提示出错 #!/bin/bash echo "ladjfaosdjfoia"头bin/bash 我们要看,sh在哪里 130|rk3399_idpad:/data # which sh /system/bin/sh rk3399_idpad:/data # 所以上面的代码应该写成 #!/system/bin/sh echo "ladjfaosdjfoia"修…

Spring总结四:IOC和DI 注解方式

首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式更为简便。 IOC获取对象注…

和后台如何对接_业务系统如何对接第三方服务?

在产品工作中,我们时常要对接第三方服务。本文作者从过往的对接项目经历中,提炼的关于业务系统,如何对接第三方服务的方法论,希望能对你有所帮助。随着公司业务的发展,我们有时会遇到,需要在自身业务系统中…

adb 启动某个apk

有时候需要用apk来启动某个apk adb shell am start -n com.android.launcher3/com.android.launcher3.Launcher 具体查看~ /rk3399_7in1/packages/apps/Launcher3/AndroidManifest.xml

Makefile 文件中的:obj-$(CONFIG_TEST) += test.o,这一类的是什么意思?

1、obj-$ $(CONFIG_TEST) 是一个整体,$(bbb)表示引用变量 bbb 比如定义 CONFIG_TESTy $(CONFIG_TEST) 就是 y obj-$(CONFIG_TEST) 就是 obj-y 又比如定义 CONFIG_TESTm $(CONFIG_TEST) 就是 m obj-$(CONFIG_TEST) 就是 obj-m obj-y foo.o 该例子告诉Kbuild在这目…

Kconfig中的“depends on”和“select”

在Kconfig文件中: config Adepends on Bselect C它的含义是:CONFIG_A配置与否,取决于CONFIG_B是否配置。一旦CONFIG_A配置了,CONFIG_C也自动配置了。 参考资料:“select” vs “depends” in kernel Kconfig。 所以去…

数组的合并和升序排列_leetcode 33 搜索旋转排序数组

给你一个升序排列的整数数组 nums ,和一个整数 target 。假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在…

[LeetCode] [C++] 206 Reverse Linked List 反转单项链表

题目要求 Reverse a singly linked list.LeetCode 206在线测试 问题描述 给定一个单项链表,将其反转后返回链表头节点。 思路分析1 可以完整的遍历一遍链表,将链表的每个节点的值存在数组中,然后反向遍历数组重新生存一个新 链表。这样做需要…

qq面板(仿版,未完待续中。。。。)---2017-04-24

主要实现效果: 1、点击对话,显示对话;点击联系人,显示联系人 2、在联系人界面: 实现好友列表的展开与折叠;(图12) 实现鼠标移到好友列表上的背景颜色的变化;(…

苹果企业证书_苹果签名经常掉签原因大汇总

苹果签名就是数字签名,是基于非对称加密算法来实现的,对称加密就是通过非对称加密算法实现的,对称加密是通过同一份秘钥加密解密数据,非对称加密有两份秘钥,分别是公钥和私钥,用公钥进行加密的数据只能使用…

漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?

1. 锁的由来?学习linux的时候,肯定会遇到各种和锁相关的知识,有时候自己学好了一点,感觉半桶水的自己已经可以华山论剑了,又突然冒出一个新的知识点,我看到新知识点的时候,有时间也是一脸的懵逼…

不废话~就是抽奖~

不废话就是抽奖 在公众号回复-抽奖- 获取抽奖二维码参与抽奖

威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!

点击上方电工小青年,关注并星标专业的电工电气领域自媒体,不容错过欢迎转发朋友圈~PLC常见的输入设备有按钮、行程开关、接近开关、转换开关、拨码器、各种传感器等,输出设备有继电器、接触器、电磁阀等。正确地连接输入和输出电路&#xff0…

Android studio JNI jni实例

1.Jni的作用 1.Jni的作用 Java是一种比较高级的语言,Java调用c库,调用c库是必不可少的,所以Jni就应运而生了。看了这个文章的同学,应该能够自己写个APK装在自己的手机里面吧,以前刚开始做android的时候,写…