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

Linux 中断处理浅析

最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....关于调度 上面的流程, 还隐含了一个问题, 整个处理过程是持续占有CPU的(除了开中断情况下可能被新的中断打断以外). 并且, 中断处理的这几个阶段, 程序不能够让出CPU!...中断处理的这几个阶段不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux), 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.

7.3K80
您找到你想要的搜索结果了吗?
是的
没有找到

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.6K21

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

来源: CSDN | phenix_lord的专栏 硬件处理 最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。...3、 对X86系统,CPU利用从中断控制器获取到的vector为索引,查询IDT (interrupt descriptor table)得到该中断处理接口(对linux,是在entry_64.s定义的函数...在linux可以通过/proc/interrupts查看当前系统中所有中断的统计信息,在/proc/irq/xxx(中断号)下面,可以看到该中断的详细信息。...针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...3、其它外设的中断,对这些中断,在初始化过程仅设置了对应的IDT,和ISA中断一样,其中断处理接口都来自interrupt数组。

7.7K30

Linux 内核如何处理中断

当系统需要实时性时(例如在工业应用),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍。...当请求的地址在进程的地址空间中,并且满足访问权限时,如果页不在内存(RAM),将会产生一个中断请求(IRQ),并开始启用缺页异常处理程序把所需的页加载到内存。如果操作成功执行,程序将继续运行。...这是最严重的中断,终止将会调用系统的终止异常处理程序来结束造成异常的进程。 动手实践 中断请求按照高级可编程中断控制器(APIC)的优先级高低排序(0是最高优先级)。...中断描述表(interrupt descriptor table)(IDT)记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 定义了从 0 到 256 的 IRQ 向量。...其中一些在 Linux 内核源树Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"

2.3K40

Linux 网络中断下半部处理

在 上一篇文章 ,我们介绍了网卡接收和发过数据在 Linux 内核处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...由于在处理硬件中断服务时会关闭硬件中断,所以在处理硬件中断服务的过程,如果发生了其他的硬件中断,也不能得到有效的处理,从而导致硬件中断丢失的情况。...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...数据包上送 在上一篇文章,我们介绍过 ei_interrupt 中断处理服务首先会创建一个 sk_buff 数据包对象保存从网卡接收到的数据,然后调用 netif_rx 函数将数据包上送给网络协议栈处理...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。

2.2K50

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

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

4.7K20

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

中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断处理过程。...链表中断处理函数。...如果在处理中断的过程又发生了相同的中断(irq_desc_t 结构的 status 字段被设置了 IRQ_INPROGRESS 标志),那么就继续对中断进行处理。...一般中断 上半部 只会做一些最基础的操作(比如从网卡复制数据到缓存),然后对要执行的中断 下半部 进行标识,标识完调用 do_softirq() 函数进行处理。...softirq机制 中断下半部 由 softirq(软中断) 机制来实现的,在Linux内核,有一个名为 softirq_vec 的数组,如下: static struct softirq_action

2K20

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

Linux中断要执行的操作分为三类: 关键中断 比如响应PIC控制器发送的中断,重新编程设置PIC或者设备控制器,更新设备和处理器访问的数据结构等。...中断向量表 在表4-2,我们列出了IRQ的分配,中断号对应32-238。另外,Linux使用中断号128实现系统调用。...多核系统的IRQ分配 我们知道SMP的全称是对称多处理系统,这意味,Linux内核不应该对一个CPU有任何偏向。于是,内核在CPU之间采用循环法(round-robin)分配IRQ。...设置了IRQ_INPROGRESS 多核系统,此时可能另外一个CPU可能正在处理先前发生的相同中断Linux对此的处理方式就是延后处理。...比如我们以Linux4.4.203内核对于中断处理为例,与上面的处理过程进行比较,理解其主要变化。 调用do_IRQ函数。其入口位于entry_32.S文件,是C语言实现的。

2.2K20

Linux驱动实践:中断处理的【工作队列】 workqueue 是什么鬼?

大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断处理的下半部分机制-工作队列】。...在刚开始介绍中断处理的时候,曾经贴出下面这张图: 图中描述了中断处理的下半部分都有哪些机制,以及如何根据实际的业务场景、限制条件来进行选择。...工作队列是什么 工作队列是Linux操作系统,进行中断下半部分处理的重要方式! 从名称上可以猜到:一个工作队列就好像业务层常用的消息队列一样,里面存放着很多的工作项等待着被处理。...工作队列的所有工作项,是通过链表串在一起的,并且等待着操作系统的某个线程挨个取出来处理。...驱动程序 之前的几篇文章,在驱动程序测试中断处理的操作流程都是一样的,因此这里就不在操作流程上进行赘述了。 这里直接给出驱动程序的全貌代码,然后查看 dmesg 的输出信息。

1.7K40

Linux中断 - IDT

[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...传统系统调用相关 IDT 的设置 Linux系统启动过程内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...nr从ia32_sys_call_table中断向量表索引到具体的中断处理函数然后调用之,其结果最终合存入%eax寄存器。...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

6.5K10

Linux内核18-中断和异常的嵌套处理

比如,I/O设备引发一个中断,相应的内核态程序,首先,应该是保存内核态堆栈的CPU寄存器的内容;然后,执行中断处理程序;最后,再恢复这些寄存器的内容。...所以,在后面的描述,我们使用内核控制路径这个术语代替一段可执行的内核态代码这种表述。...恢复执行嵌套内核控制路径的所有数据都存储在内核态堆栈,而该堆栈又和当前进程紧紧绑定在一起。通俗的说,中断处理程序相当于当前进程的资源,切换进程之前该中断资源必须释放掉。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统,几个中断或异常处理程序可能会并发执行。

2K20

中断机制和中断描述符表、中断和异常的处理

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程的一些概念性问题...Intel x86 处理器发布了大约20 种异常,Linux 内核必须为每种异常提供一个专门的异常处理程序,它们通常把一个UNIX 信号发送到引起异常的进程。...表的每个表项占4 个字节,由两个字节的段基址和两个字节的偏移量组成,这样构成的地址便是相应中断处理程序的入口地址。...Linux 内核在系统的初始化阶段要进行大量的初始化工作,其与中断相关的工作有:初始化可编程控制器8259A;将中断向量IDT 表的起始地址装入IDTR 寄存器,并初始化表的每一项。...而当中断发生在内核态时,即CPU 在内核运行时,则不会更换堆栈。 CS : EIP 的值就是IDT 表第i 项门描述符的段选择符和偏移量的值,此时,CPU 就跳转到了中断或异常处理程序。

3.5K10

DragonOS的中断处理设计

在这里简单记录一下目前DragonOS中断处理的设计吧。...* @param irq_num 中断向量号   * @param arg 传递给中断安装接口的参数   * @param handler 中断处理函数   * @param paramater 中断处理函数的参数...可作为中断下半部使用,任务处理实时性低于硬中断。 软中断模块设计与硬中断的设计类似。其包括了一个软中断向量表及一些函数模型。...2.1软中断向量表表项定义 表项类型定义为softirq_t 成员 类型 参数 返回值 描述 action 函数 void*data void 软中断处理函数 data void* – – 传递给软中断处理函数的数据...unregister_softirq  * @param irq_num 软中断号 2.4软中断处理程序do_softirq 在该函数,先检测软中断是否正在被处理,如果空闲,则发起处理并置位标志位。

60620

Linux Device Drivers》第十章 中断处理——note

并口就会产生一个中断 引脚9是并口数据字节的最高位 安装中断处理例程 中断信号线是很珍贵且有限的资源 内核维护了一个中断信号线的注冊表。...该注冊表类似于I/Oport的注冊表 模块在使用中断前要先请求一个中断通道,然后在使用后释放该通道 int request_irq(unsigned int irq,...224,能够从头文件include/asm-386/irq.h得到解释 自己主动检測IRQ号 内核帮助下的探測 unsigned long probe_irq_on...可是有两处不同 请求中断时,必须指定flags參数的SA_SHIRQ位 dev_id參数必须是唯一的,不论什么指向模块地址空间的指针都能够使用,但dev_id不能设置成NULL 请求一个共享中断时,...执行处理例程 当内核收到中断时,全部已注冊的处理例程都将被调用 一个共享中断处理例程必须可以将要处理中断和其它设备产生的中断区分开来 /proc接口和共享的中断 在系统上安装共享的中断处理例程不会对

56620

Linux内核17-硬件如何处理中断和异常

在上一篇文章,我们已经了解了中断和异常的一些概念,对于中断和异常也有了大概的理解。那么,系统硬件到底是如何处理中断和异常的呢?本文我们就以常见的X86架构为例,看看中断和异常的硬件工作原理。...与8259A中断控制器不同,管脚编号不再具有优先级:重定向表的每一项都可以被独立设置中断向量和优先级,目的处理器以及处理器如何处理中断。...然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...如果发生中断,控制单元就会做如下处理: 确定中断或异常的编号N; 读取IDT表的第N项;(在后面的描述,假设包含的是中断门或陷阱门) 获取GDT的基地址,遍历GDT找到IDT表第N项的段选择器标识的段描述符...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。

2K10

ARM中断处理过程

以s3c2440  ARM9核为例: 一:s3c2440 ARM处理器特性:   1、S3C2440支持60个中断源,含子中断源;   2、ARM9采用五级流水线方式;    3、支持外部中断和内部中断...INTMOD:当INTMOD某位被设置为1时,它对应的中断被设为FIQ,CPU将进入快速中断模式。             PRIORITY:用于设置IRQ中断的优先级。...INTPND:中断优先级仲裁器选出优先级最高中断后,这个中断在INTPND寄存器的相应位被置1,随后,CPU进入中断模式处理它。同一时间内,此寄存器只有一位被置1。            ...三、中断处理流程  1、中断控制器汇集各类外设发出的中断信号,然后通知CPU。     2、CPU保存当前程序的运行环境,然后调用中断服务程序(ISR),来处理中断。     ...3、在ISR通过读取外设的相关的寄存器来识别中断的类型,并进行相应的处理。     4、清除中断:通过读写相关中断控制寄存器和外设相关寄存器来实现。

1.6K70
领券