CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报。

对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高。

这里重点关注ARM+Linux组合下中断管理,从底层硬件GIC+CPU,到Linux内核通用部分处理,再到GIC驱动以及中断注册,最后是中断下半部软终端、tasklet、workqueue,包括线程化部分。

所以按照从硬件到软件,软件从底层到上层的框架去介绍。

0. 目录

《Linux中断管理》

《Linux中断管理 (1)Linux中断管理机制》

《Linux中断管理 (2)软中断和tasklet》

《Linux中断管理 (3)workqueue工作队列》

1. 思考问答

  • 发生硬件中断后,ARM处理器做了哪些事情?

SoC内部中断控制器会感知到中断信号,中断控制器里的仲裁单元(Distributor)会在众多CUP核心中选择一个,并把该中断分发给CPU核心。

GIC控制器和CPU核心之间通过一个nIRQ信号来通知CPU。

CPU核心感知到中断发生之后,硬件会自动做如下一些事情:

  • 保存中断发生时CPSR寄存器的内容到SPSR_irq寄存器中
  • 修改CPSR寄存器,让CPU进入处理器模式中的IRQ模式,即CPSR寄存器中的M域设置为IRQ Mode
  • 硬件自动关闭中断IRQ或FIQ,即CPSR中的IRQ位或FIQ位置1
  • 保存返回地址到LR_irq寄存器中
  • 硬件自动跳转到中断向量表的IRQ向量中
  • 硬件中断号和Linux内核的IRQ中断号是如何映射的?

硬件中断号的映射是在系统启动过程中接卸DTS,然后经由irq_domain_alloc_irqs()完成映射到Linux中断号。

中断发生后,根据硬件中断号经由irq_find_mapping()找到Linux软中断号。

  • 一个硬件中断发生后,Linux内核如何响应并处理该中断?

一个硬件发生后,LInux软件的起点是中断向量表vector_irq。

vector_irq根据中断发生时状态决定是进入用户空间__irq_svc还是内核空间__irq_svc。

两者主要工作都交给irq_handler处理,irq_handler调用中断控制器处理函数gic_handle_irq()。

gic_handle_irq()根据读取到的硬件中断号转换成Linux中断号,然后进行特定中断处理。

从中断返回时,还需要实现如下两个操作:

  • 从SPSR_irq寄存器中恢复数据到CPSR中
  • 从LR_irq中回复内容到PC中,从而返回到中断点的下一个指令处执行。
  • 为什么说中断上下文不能执行睡眠操作?

所谓的睡眠,就是调用schedule()让出CPU,调度器选择另外一个进程继续执行,这个过程涉及进程栈空间的切换。

如果中断上下文中调用schedule(),此时获取的struct thread_info数据结构是发生中断是该进程栈信息,而不是中断上下文调用schedule()时任何信息。

这就导致再也无法返回中断上下文中调用schedule()的地方。

另一个原因是,中断上下文处于关中断中,需要发送一个EOI通知GIC中断处理结束,GIC和CPU Interface才会进入下一次中断处理。如果中途schedule(),那么整个系统的中断都会被屏蔽掉。

  • 软中断的回调函数执行过程中是否允许响应本地中断?

软中断回调函数执行处于开中断环境下,所以允许响应本地中断。

具体参考__do_softirq(),在执行h->action()前打开本地中断,完成后关闭中断。

  • 同一类型的软中断是否允许多个CPU并行执行?

同一类型的软中断可以在多个CUP并发执行,因为软中断处理函数是可重入的,自身对数据进行了保护。

  • 软中断上下文包括哪几种情况?

中断上下文包括硬中断上下文和软中断上下文,当然也包括NMI上下文。

软中断上下文包括三部分:

一是在下半部执行的软中断处理包括tasklet,调用过程是irq_exit()->invoke_softirq();

二是ksoftirqd内核线程执行的软中断,比如强制中断线程化force_threads,或者软中断执行时间太长仅为唤醒ksoftirqd内核线程;

三是进程上下文中调用local_bh_enable()时也会去执行软中断处理,调用过程是local_bh_enable()->do_softirq()。

一属于传统意义的中断上下文,二、三运行在进程上下文中,但三者统称为软中断上下文。

  • 软中断上下文和进程上下文哪个优先级高?为什么?

软中断上下文优先级高于进程上下文,因此软中断包括tasklet总是抢占进程的运行。参见irq_exit()退出中断时优先执行softirq。

比如当进程A在运行时发生中断,在中断返回时如果不处于中断上下文且有pending的softirq时,优先执行软中断包括tasklet。

然后采取检查是否有高优先级任务需要签章中断点的进程。

这样导致的危害是:如果执行软中断或者tasklet事件过长,那么高优先级任务就长时间得不到运行,严重影响系统的实时性。

这也是RT补丁强制将softirq处理函数线程化的原因。

  • 是否允许同一个tasklet在多个CPU上并行执行?

不允许同一个tasklet同时在多个CPU并发执行,taskelt必须固定在一个CPU上串行执行。

因为tasket被挂入到per-cpu的taskelt_vec中,并且设置TASKLET_STATE_SCHED标志位,那么只能由该CPU来执行。

直到执行完毕并清除了TASKLET_STATE_SCHED后,其它CPU才有机会执行。

  • workqueue试运行在中断上下文,还是进程上下文?其回调函数允许睡眠吗?
  • 旧版本(Linux 2.6.25)的workqueue机制在实际过程中遇到了哪些问题和挑战?
  • CMWQ机制如何动态管理工作线程池的线程呢?
  • 如果有多个work挂入一个工作线程中执行,当某个work的回调函数执行了阻塞操作,那么剩下的work该怎么办?

Linux中断管理的更多相关文章

  1. Linux中断管理 (1)Linux中断管理机制

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  2. Linux中断管理 (2)软中断和tasklet

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  3. Linux中断管理 (3)workqueue工作队列

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  4. Linux中断管理 (3)workqueue工作队列【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8659988.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...

  5. Linux中断管理 (1)Linux中断管理机制【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8659981.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...

  6. Linux进程管理 (篇外)内核线程简要介绍

    关键词:kthread.irq.ksoftirqd.kworker.workqueues 在使用ps查看线程的时候,会有不少[...]名称的线程,这些有别于其它线程,都是内核线程. 其中多数内核线程从 ...

  7. Linux进程管理 (篇外)内核线程简要介绍【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8336998.html 关键词:kthread.irq.ksoftirqd.kworker.workqueues 在使用p ...

  8. 【CentOS】Linux日常管理

    /////////////////////////目录///////////////////////////////////////// 一.日常监控指标相关 1.监控系统状态命令 2.查看系统进程 ...

  9. Linux进程管理子系统分析【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...

随机推荐

  1. 探索Windows命令行系列(1):导航目录

    探索Windows命令行系列(1):导航目录 探索Windows命令行系列(2):命令行工具入门 探索Windows命令行系列(3):命令行脚本基础 探索Windows命令行系列(4):通过命令操作文 ...

  2. 在.NET Core中使用简单的插件化机制

    前言 插件化,其实也并不是什么新东西了,像nopCommerce等开源项目都有类似的机制,而且功能比较完善和齐全. 相信大家都对接过不少支付方式,支付宝.微信以及各大银行或第三方的支付公司. 我们可以 ...

  3. Spring Boot(十)Logback和Log4j2集成与日志发展史

    一.简介 Java知名的日志有很多,比如:JUL.Log4j.JCL.SLF4J.Logback.Log4j2,那么这些日志框架之间有着怎样的关系?诞生的原因又是解决什么问题?下面一起来看. 1.1 ...

  4. .class文件查看

    十六进制查看(不仅class文件可以看,其他文件格式也可以) hexdump -C XXX.class #注意C是大写(小写c则输出十进制) 反汇编查看 javap -c XXX.class java ...

  5. Flask 系列之 优化项目结构

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 完善环境配置,添加 异常请求 处理 实现 400.404 ...

  6. sql 中 联表on 和where

    left join  on 中对表添加的过滤条件 只对右表起作用   左表会完整的呈现出来  要想过滤左表  on 之后用where 进行过滤  不过这样实际上是对量表之后的结果集进行过滤. rint ...

  7. vue动画及其原理

    1,vue动画的实现原理,主要是通过在不同时期给需要动画的dom元素加上css动画样式 我们以显示和隐藏动画为例 a, 需要动画的dom元素 b,点击时vue控制往vue中加的样式 2,  我们以两张 ...

  8. audio currentTime 时间戳转换(es6语法)

    function format(interval){ if (!value) return '' let interval = Math.floor(value) let minute = (Math ...

  9. 字符串hash入门

    简单介绍一下字符串hash 相信大家对于hash都不陌生 翻译过来就是搞砸,乱搞的意思嘛 hash算法广泛应用于计算机的各类领域,像什么md5,文件效验,磁力链接 等等都会用到hash算法 在信息学奥 ...

  10. java环境配置记录

    1.启动Eclipse时报错:Failed to load the JNIshared library 这种问题是因为Java与Eclipse两个软件的位数不一样,一个是32位,一个是64位,存在冲突 ...