中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...处理中断请求 当一个中断发生时,中断控制层会发送信号给CPU,CPU收到信号会中断当前的执行,转而执行中断处理过程。...action) // 如果上一次IRQ还没完成, 直接退出 goto out; for (;;) { spin_unlock(&desc->lock);...中断处理 - 下半部(软中断) 由于中断处理一般在关闭中断的情况下执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux把中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。
最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....将当前寄存器信息压入栈中; (以便中断退出时恢复) 显然, 这两步都是不可重入的(如果在保存寄存器值时被中断了, 那么另外的操作很可能就把寄存器给改写了, 现场将无法恢复), 所以前面说到的CPU进入中断服务程序时要自动禁止中断...但是这个新的中断处理过程并不会进入第四阶段,而是当它发现自己是嵌套的中断时,完成第三阶段之后就会退出了。也就是说,只有第一层中断处理过程会进入第四阶段,嵌套发生的中断处理过程只执行到第三阶段。...中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题.
缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...//fixup处处理,这样不会导致死循环中断,内核设计很安全。...//为这个地址,退出中断后不会在执行1: mov"itype" %2,%"rtype"1\n", "3: movl %3,%0\n" \ //将4复制给err,如果发生了缺页异常会返回
来源: CSDN | phenix_lord的专栏 硬件处理 最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。...3、 对X86系统,CPU利用从中断控制器获取到的vector为索引,查询IDT (interrupt descriptor table)得到该中断的处理接口(对linux,是在entry_64.s中定义的函数...针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...4、 执行中断描述符定义的中断处理入口(IDT中指定地址的代码); 5、 根据环境执行不同的中断退出方式,比如执行现场调度操作(retint_careful和retint_kernel),最终都会执行...level触发和edge触发在通用逻辑层最大的不同就是当其他CPU正在处理该中断的时候,系统的行为,对edge触发,会把该中断记录下来,当前处理结束后再次执行,而level直接退出。
中断服务程序(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"
在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...为了避免这种情况出现,Linux 内核把中断处理分为:中断上半部 和 中断下半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...NET_RX_DROP; } netif_rx 函数的参数就是要上送给网络协议栈的数据包,netif_rx 函数主要完成以下几个工作: 获取当前 CPU 的待处理的数据包队列,在 Linux 内核初始化时...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。...return; } net_rx_action 函数主要完成以下几个工作: 从待处理数据包队列中获取一个数据包,如果数据包为空,那么就退出网络中断下半部。
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)来控制开关该功能。
处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。...中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...action) // 如果上一次IRQ还没完成, 直接退出 goto out; for (;;) { spin_unlock(&desc->lock);...中断处理 - 下半部(软中断) 由于中断处理一般在关闭中断的情况下执行,所以中断处理不能太耗时,否则后续发生的中断就不能实时地被处理。...鉴于这个原因,Linux把中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。
Linux将中断要执行的操作分为三类: 关键中断 比如响应PIC控制器发送的中断,重新编程设置PIC或者设备控制器,更新设备和处理器访问的数据结构等。...中断向量表 在表4-2中,我们列出了IRQ的分配,中断号对应32-238。另外,Linux使用中断号128实现系统调用。...为了统一处理这些硬件,Linux内核使用了面向对象的编程思想,构建了一个PIC对象,包含PIC名称和7个PIC标准方法。...设置了IRQ_INPROGRESS 多核系统中,此时可能另外一个CPU可能正在处理先前发生的相同中断。Linux对此的处理方式就是延后处理。...比如我们以Linux4.4.203内核对于中断的处理为例,与上面的处理过程进行比较,理解其主要变化。 调用do_IRQ函数。其入口位于entry_32.S文件中,是C语言实现的。
系统初始化的时候,定义和初始化了中断向量表。并初始化8259的工作方式。...linux0.11分为中断、系统、陷阱门。系统在启动的时候设置idt。...for (i=17;i<48;i++) set_trap_gate(i,&reserved); set_trap_gate(45,&irq13); // 允许8259接收中断...在这里插入图片描述 还有一些是键盘,软盘等也设置中断。下面看一个异常处理程度。...具体的处理可以见内存管理分析那篇文件。
在末行模式下,若在用此命令退出Vi时,返回到shell;若当前编辑的文件没被修改过,输入命令 :wq Vi将先保存文件,输入命令 :w Vi保存当前编辑文件,输入命令 :x 该命令的功能同命令模式下的ZZ...命令功能相同,连按两次大写字母Z,编辑文件没有被保存,然后Vi并不退出, 在命令模式中,则Vi保存该文件后退出。...newfile 否则可选择另外的文件名来保存当前文件,若当前编辑的文件曾被修改过,但并不退出,若用户就是不想保存被修改后的文件而要强行退出Vi时, 在末行模式下,则Vi直接退出, 返回到shell,若newfile...是一个已存在的文件,然后退出Vi返回到shell, 在末行模式下,则Vi在显示窗口的最末行显示如下信息: No write since last change (use !...to overrides) 提示用户该文件被修改后没有保存,可以再给编辑文件起一个新的文件名,输入命令 :q 系统退出Vi返回到shell,继续等待用户命令。
[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux..._syscall_32, 这个函数中就会执行具体的中断处理,然后INTERRUPT_RETURN恢复栈,作好返回用户态的准备。...nr从ia32_sys_call_table中断向量表中索引到具体的中断处理函数然后调用之,其结果最终合存入%eax寄存器。...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int
讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。...图4-3 内核控制路径的一个嵌套异常的示例 允许内核控制路径嵌套的代价就是中断处理程序不能阻塞,也就是说,中断处理程序运行时不能发生进程切换。...所以,中断的执行不会引起进程的切换,也就可以无限嵌套处理。 中断处理程序可以打断中断或异常处理程序执行,但是反过来,异常不能打断中断处理程序。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。
在之前的ARMv8-A的异常文章中提到,ARMv8-A将中断也当做一种异常,中断分为IRQ和FIQ 假设当前在EL0运行一个64位的应用程序,触发了一个EL0的IRQ中断,则处理器会做如下的操作 将CPU...msr daifclr, #(8 | 4 | 1) .endm 跳转到irq_handler去处理中断 当中断处理完毕后,就会通过ret_to_user返回到用户空间 /* * Interrupt...isb(); err = handle_domain_irq(gic_data.domain, irqnr, regs); //处理中断...,会退出中断上下文 int generic_handle_irq(unsigned int irq) { struct irq_desc *desc = irq_to_desc(irq);...,调用generic_handle_irq_desc去处理中断,后面会涉及到irq domain的知识了。
list server '3.openwrt.pool.ntp.org' 如果想要编辑该文件 按i键或者a键进入插入模式,这个时候左下角显示–INSERT– 编辑完成之后 按Esc键退出到命令模式...然后进入保存或者不保存的退出操作: :w —- 保存,不退出 :w!...—- 强制保存,不退出 :wq —- 保存,退出(或者是:x) :wq! —- 强制保存,退出 :q —- 不保存,退出 :q! —- 不保存,强制退出 :e!
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...非屏蔽中断的向量和异常的向量是固定的,而屏蔽中断的向量可以通过对中断控制器的编程来改变。Linux 对256 个向量的分配如下。 • 从0~31 的向量对应于异常和非屏蔽中断。...Intel x86 处理器发布了大约20 种异常,Linux 内核必须为每种异常提供一个专门的异常处理程序,它们通常把一个UNIX 信号发送到引起异常的进程。...当控制权通过中断门进入中断处理程序时,处理器清IF 标志,即关中断,以避免嵌套中断的发生。...通过系统门来激活4 个Linux 异常处理程序,它们的向量是3、4、5 及128,也就是说,在用户态下,可以使用int 3、into、bound 及int 0x80 四条汇编指令。
在这里简单记录一下目前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 在该函数中,先检测软中断是否正在被处理,如果空闲,则发起处理并置位标志位。
一种是通过响应硬件中断。前者会浪费处理器的时间,而后者不会。...该注冊表类似于I/Oport的注冊表 模块在使用中断前要先请求一个中断通道,然后在使用后释放该通道 int request_irq(unsigned int irq,...224,能够从头文件include/asm-386/irq.h中得到解释 自己主动检測IRQ号 内核帮助下的探測 unsigned long probe_irq_on...它保存了处理器进入中断代码之前的处理器上下文快照 中断处理例程应该返回一个值。用来指明是否真正处理了一个中断。假设处理例程发现其设备的确须要处理,则应该返回IRQ_HANDLED。否则。...执行处理例程 当内核收到中断时,全部已注冊的处理例程都将被调用 一个共享中断处理例程必须可以将要处理的中断和其它设备产生的中断区分开来 /proc接口和共享的中断 在系统上安装共享的中断处理例程不会对
与8259A中断控制器不同,管脚编号不再具有优先级:重定向表中的每一项都可以被独立设置中断向量和优先级,目的处理器以及处理器如何处理该中断。...然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...陷阱门 同中断门类似,只是不会修改IF标志。 4 中断和异常的硬件处理 现在,我们来探究一下CPU控制单元是如何处理中断和异常的。我们假设内核已经完成初始化,CPU工作在保护模式下。...这个描述符指定了包含中断或异常处理程序的段的基地址。 确保中断合法性。...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。
1、自定义错误页面 1.1、概述 SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。...在 springBoot 中提供了一个叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。...exceptionReporters, SpringApplicationRunListeners listeners) { try { try { //处理退出码...ApplicationContext", var9); } ReflectionUtils.rethrowRuntimeException(exception); } //退出码处理方法...= null) { //如果处理器不为null,注册退出码 handler.registerExitCode(exitCode);
领取专属 10元无门槛券
手把手带您无忧上云