首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux中断机制:硬件处理,初始中断处理

来源: CSDN | phenix_lord的专栏 硬件处理 最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。...针对X86中断控制器硬件和linux对这些硬件的初始,在《interrupt in linux》中有很详细的描述。...Local APIC中还有一个关于中断优先级的寄存器TPR(task priority register)寄存器:用于确定打断线程执行需要的中断优先级级别,只有优先级高于设置值的中断才会被CPU执行 (...,其它两种机制的初始(包括相关中断路由信息的初始)的在《interrupt in linux》中有很详细的描述。...触发,edge触发等、simple等)初始的irq_desc:: handle_irq,执行不同的通用处理接口,比如handle_simple_irq; 4、 这些通用处理接口会调用中断初始的时候注册的外部中断处理函数

8K31

Linux中断处理

中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断处理过程。...注册中断处理入口 在内核中,可以通过 setup_irq() 函数来注册一个中断处理入口。...处理中断请求 当一个中断发生时,中断控制层会发送信号给CPU,CPU收到信号会中断当前的执行,转而执行中断处理过程。...中断处理 - 下半部(软中断) 由于中断处理一般在关闭中断的情况下执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。

6.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 中断处理浅析

    最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....第二阶段 中断串行 进入do_IRQ函数, 第一步进行中断的串行化处理, 将多个CPU同时产生的某一中断进行串行....而tasklet则是在多个CPU间被串行执行的, 其处理函数不必考虑可重入的事情....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...工作队列有着自己的处理线程, 这些work被推迟到这些线程中去处理. 处理过程只可能发生在这些工作线程中, 所以这里可以睡眠.

    7.4K80

    linux内核缺页中断处理

    缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...9.调度引发缺页中断的进程,操作系统返回调用他的汇编例程 10.该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,就好像缺页中断没有发生过。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...), "=r" (x) : "m"(__m(addr)), "i"(errret), "0"(err)) //"m"(__m(addr)), "i"(4), "0"(4)) 经过以上分析,对linux

    10.8K22

    Linux中断虚拟(一)

    作者简介 王柏生 资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富的实践经验。...著有畅销书《深度探索Linux操作系统》(2013年出版)。 谢广军 计算机专业博士,毕业于南开大学计算机系。资深技术专家,多年的IT行业工作经验。...多年来一直从事操作系统、虚拟技术、分布式系统、大数据、云计算等相关领域的研发工作,实践经验丰富。 本文内容节选自《深度探索Linux虚拟技术》,已获得机械工业出版社华章公司授权。...2)如果虚拟CPU处于睡眠状态,则唤醒虚拟CPU,即使虚拟CPU对应的线程进入物理CPU的就绪任务队列,随时可以准备得到运行机会。...2)在多处理器情况下,仅仅是唤醒可能在睡眠的虚拟CPU线程还不够,如果虚拟CPU是在另外一颗物理CPU上运行于Guest模式,此时还需要向其发送IPI中断,使目的CPU从Guest模式退出到Host模式

    6.4K30

    Linux中断虚拟(二)

    作者简介 王柏生 资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富的实践经验。...多年来一直从事操作系统、虚拟技术、分布式系统、大数据、云计算等相关领域的研发工作,实践经验丰富。 本文内容节选自《深度探索Linux虚拟技术》,已获得机械工业出版社华章公司授权。...,如上面黑体标识的,我们可以清楚的看到中断向量和中断管脚的关系,叠加了一个irq_base,这个irq_base就是通过初始8259A时通过ICW设置的,完成从IRn到中断向量的转换。...(2)VCPU这个线程也许正在睡眠,比如Guest VCPU运行hlt指令时,就会切换回Host模式,线程挂起。 对于第1种情况,是多处理器系统下的一个典型情况,目标CPU的正在运行Guest。...对于多处理器系统,然后再向目标CPU发送一个“重新调度”的IPI中断,那么被唤醒的VCPU线程很快就会被调度,执行切入Guest的过程,从而完成中断注入。

    6K10

    记一个实时Linux中断线程问题

    原来这是一个被线程化了的中断服务程序,负责处理i2c中断的。这个项目i2c总线上挂载了多个设备,压力是比较大的。...中断线程回顾 让我们来回顾下中断线程的知识。 在Linux上,中断的优先级比进程高,一旦中断过来普通进程实时进程通通都要让路,让CPU先运行对应的中断处理程序,这就会对实时性造成很大的影响。...中断线程之后,中断来了虽然还是会打断实时进程,但所执行的操作只是唤醒中断线程,原本的中断服务程序被放到了一个内核线程中,延迟执行。...1.这个中断服务程序非常简单,没必要线程。强行线程对实时性的改善不大,反而会带来不必要的开销。 2.这个中断服务程序非常关键,其中采集的数据的实时性也非常重要,不应该被延迟执行。...中断线程的机制虽好,也要分情况来使用,不然反而会造成系统的巨大负担。 代码改动是在request_irq时,传入IRQF_NO_THREAD标志,即可避免这个中断线程

    2.2K10

    线程中断

    线程中断 线程中断线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号 如果目标线程没有接收线程中断的信号并结束线程...* 线程中断失败, 因为目标线程收到中断信号并没有做出处理 */ public class T01_ThreadInterrupt_Failed { static int i = 10;...package com.starry.codeview.threads.P05_ThreadInterrupt; /** * 线程中断成功, 目标线程收到中断信号做出了处理 */ public...package com.starry.codeview.threads.P05_ThreadInterrupt; /** * 线程中断失败,Sleep遇到线程中断catch到异常会清除掉中断标记,...但是catch异常块中做出了中断处理动作,所以中断成功!!!

    1.4K20

    Linux 内核如何处理中断

    中断服务程序(ISR)是一个小的程序,用来处理具体的数据,其具体的处理方式依赖于造成中断请求(IRQ)的原因。之前正在运行的进程在中断服务程序(ISR)运行结束前都会被中断。...在过去,中断请求由单独的芯片处理中断控制器芯片 PIC),I/O 设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断请求(IRQ),并且可以直接与 CPU 通信。...当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍。...中断描述表(interrupt descriptor table)(IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。...其中一些在 Linux 内核源树中的Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"

    2.4K40

    Linux 网络中断下半部处理

    在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...由于在处理硬件中断服务时会关闭硬件中断,所以在处理硬件中断服务的过程中,如果发生了其他的硬件中断,也不能得到有效的处理,从而导致硬件中断丢失的情况。...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...NET_RX_DROP; } netif_rx 函数的参数就是要上送给网络协议栈的数据包,netif_rx 函数主要完成以下几个工作: 获取当前 CPU 的待处理的数据包队列,在 Linux 内核初始化时...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。

    2.3K50

    探索JAVA并发 - 如何处理线程中断

    中断是一种协作机制,通过这种机制可以要求指定线程在可以暂停的地方停止当前任务,但这个要求可以无视,我们也经常这么做(虽然不好),那应该这么对待其它线程发来的中断要求呢?...在上一篇如何优雅地取消线程任务中提到了通过中断可以取消线程正在进行的任务,现在针对中断这件事情再来简单聊聊。...: // 获取锁时如果线程中断 or 等待锁时线程中断 lock.lockInterruptibly(); try { while...return true; } finally { lock.unlock(); } } } 传递中断 如果捕获到一个中断异常不知道怎么处理它...,因为这件事只有一个人来处理就够了,所以抛出异常后会清除中断状态,比如Thread,sleep()。

    67820

    Linux 中断子系统(三):中断处理知识点大全

    Linux 中断相关节点 /proc/interrupts cat 这个节点,会打印系统中所有的中断信息,如果是多核CPU,每个核都会打印出来。...所以 Linux 下: 1、高优先级中断无法抢占正在执行的低优先级中断。 2、同处于 pending 状态的中断,优先响应高优先级中断进行处理。...这样是可以理解的,如果万一中断大量爆发,中断如果允许嵌套的话,栈会越来越大,会爆掉,所以为了防止这种情况发生,Linux中断不允许嵌套,单CPU中,在一个中断处理完之前,不会相应另外一个中断,哪怕优先级比它高...在中断处理过程中,主要是 GIC 和 CPU 的交互,即便 GIC 支持高优先级中断抢占正在执行的低优先级中断,发信号给 CPU core,但是 CPU core 可以不处理,因为 Linux 中当 CPU...对于这类中断linux kernel有一套复杂的机制来处理,你可以通过command line参数(noirqdebug)来控制开关该功能。

    5.4K20

    线程中断

    线程发现自己有中断事件时,会根据中断事件的类型去对应相应的中断处理程序来处理中断事件。 下面我们看几种类型的中断事件,对应的中断处理程序是如何处理的。...而我们的中断处理程序首先会将当前所有寄存器中的数据经由主存保存到磁盘,接着停止 CPU 的运行,直至停机。 下次开机时,中断处理程序会从磁盘加载中断前的寄存器数据,恢复现场。...那么,我们的主线程在调用 interrupt 方法中断一个线程,当发现它的状态为 WAITING 时,将唤醒它并更改指令寄存器的值以指向异常代码块,期待你自己来处理这个中断。...这也是为什么 wait、sleep、join 这些方法必须处理一个受检查的异常 InterruptException 的原因,因为这些方法会阻塞线程,而如果在阻塞期间收到中断,你也应当提供中断处理逻辑...这个状态的线程和 RUNNABLE 状态的线程一样,对于中断请求不做额外响应,仅仅设置一下中断标志位,具体什么时候处理中断需要程序自己去循环检测判断。

    1.8K30

    线程中断

    中断是对线程的一个指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但是线程终止是很常见的。这是本节课要强调的用法。...线程通过在要被中断线程对象上调用interrupt来发送中断。为了让中断机制正常工作,被中断线程必须支持自己的中断。 Supporting Interruption 线程如何支持自己的中断?...return; } } 在这个简单的示例中,代码只是测试中断并在收到中断后退出线程。...抛出InterruptedException可能更有意义: if (Thread.interrupted()) { throw new InterruptedException(); } 这允许中断处理代码集中在...当线程通过调用静态方法thread .interrupted来检查中断时,中断状态将被清除。一个线程使用非静态的isInterrupted方法来查询另一个线程中断状态,它不会改变中断状态标志。

    1.2K20

    Java线程中断

    Thread.interrupt 的作用其实也不是中断线程,而是 通知线程应该中断了。 具体到底中断还是继续运行,应该由被通知的线程自己处理。...② 如果线程处于正常活动状态,那么会将该线程中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。...也就是说,一个线程如果有被中断的需求,那么就可以这样做: ① 在正常运行任务时,经常检查本线程中断标志位,如果被设置了中断标志就自行停止线程。...② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)...如果一个线程被设置中断标志后,选择结束线程那么自然不存在下次的问题,而如果一个线程被设置中断标识后,进行了一些处理后选择继续进行任务,而且这个任务也是需要被中断的,那么当然需要清除标志位了。

    1.2K20

    一文完全读懂 | Linux中断处理

    处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。...中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断处理过程。...中断处理 - 下半部(软中断) 由于中断处理一般在关闭中断的情况下执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...Linux在系统初始化时注册了两种softirq处理函数,分别为 TASKLET_SOFTIRQ 和 HI_SOFTIRQ: void __init softirq_init() { ...

    2.9K20

    Java多线程三:线程中断

    线程运行,肯定就会有线程中断,在Java语言中,线程中断是一种协作机制,通过对线程设置中断标记,告知对应的线程,根据中断标记来决定是否需要中断当前线程。...线程中断涉及的几个方法 interrupt() 设置线程中断标志,所在线程调用该方法之后,正常情况下会设置一个线程中断标志位 interrupt = true....但是我们可以根据线程中断标志,来判断当前线程是否可以继续运行。 对线程稍微改造一下,让他在线程中断为true的时候退出线程运行。...JDK源码中的解释:测试当前线程是否被中断。该方法清除线程中断状态。...总结 线程中断对于我们学习多线程还是有很大的帮助,线程中断本质上不会强制将线程停止,如果需要强制将线程终止,可以调用Thread 中的stop()方法,但是不建议这么用,该方法已经过时,学习了线程中断

    48030

    Linux内核21-Linux内核的中断处理过程

    Linux中断要执行的操作分为三类: 关键中断 比如响应PIC控制器发送的中断,重新编程设置PIC或者设备控制器,更新设备和处理器访问的数据结构等。...但是不幸的是,有时候硬件在分配中断时会发生错误(比如,基于奔腾4的SMP主板就有这样的问题)。因此,Linux2.6内核使用一个特定的内核线程叫kirqd进行纠正IRQ的自动分配(如果有必要的话)。...kirqd内核线程周期性地执行do_irq_balance()函数,追踪最近一段时间内,每个CPU上接收到的中断次数。...设置了IRQ_INPROGRESS 多核系统中,此时可能另外一个CPU可能正在处理先前发生的相同中断Linux对此的处理方式就是延后处理。...这样的处理方式使内核架构更为简单,因为设备驱动程序的中断服务程序是不需要可重入的(它们的执行一般都是序列的)。

    2.4K20

    线程中断标志位

    当一个线程调用该方法时,会设置该线程中断标识位,线程执行的过程中会去检查这个标志位从而抛出异常。...目的 中断线程是为了可以响应中断的请求,让捕获到这个异常之后去做对应的事情。比如某个线程需要将其他线程挂起就可以设置这个标志位,其他线程去捕获异常做处理。...如何响应异常 1、在检测到异常之后再catch语句中再次设置标志位,因为抛出异常前会重置中断标志位,所以为了其他线程能够检测到当前线程是由于中断而做的处理就需要周期catch语句中再次设置标志位。...这样其他线程检测的时候就会发现这个线程响应了中断 2.通过throw抛出异常,调用者在调用的时候进行处理。...终止线程 可采用条件变量Condition来做处理,比如多个线程之间需要互相协作,这时候通过一个条件变量去控制何时哪个线程去做什么事情,当调用await的线程必须获取到锁,接着该方法会阻塞并且释放锁,接着添加到队列中

    63420
    领券