一般是定时器中断和I/O设备中断。 异常通常分为2类:一类是编程错误,另外一类就是需要内核处理的异常情况。编程错误,比如程序异常终止,处理这种异常,内核只需要给当前进程发送一个信号即可。...3 中断和异常 Intel官方文档将中断和异常分类为: 中断: 可屏蔽中断 所有I/O设备发出的IRQ都能产生可屏蔽中断。屏蔽掉的中断,中断控制器忽略其存在。...可以使用int或int3指令触发,也可以使用into-溢出中断指令和bound-地址限制异常中断指令检查相应的条件,如果条件为假,也会产生异常。...可编程错误一般被当作陷阱-trap处理,通常被称为软件中断。这类异常一般有两种作用:系统调用和告知调试器某个事件。 中断或异常使用一张中断向量表进行管理,编号为0-255。...非可屏蔽中断和异常编号是固定的;而可屏蔽中断是不固定的,可以通过对中断控制器进行编程进行修改。 4 中断请求线-IRQ 硬件设备和可编程中断控制器之间使用中断请求线(IRQ)进行连接。
中断机制的诞生 2. 中断的概念和作用 3. 中断的分类 4. 外中断的处理过程 知识回顾与重要考点 知识总览 1. 中断机制的诞生 2. 中断的概念和作用 3. 中断的分类 4....外中断的处理过程 知识回顾与重要考点
中断的类型 内中断(异常) 与当前执行的指令有关, 中断信号来源于CPU内部 陷阱、 陷入(trap ) 由陷入指令引发的, 是应用程序故意引起的 故障 ( fault ) 由错误条件引起的 , 可能被内核程序修改...外中断 与当前执行的指令无关, 中断信号来源于CPU外部 中断机制的基本原理 不同的中断信号 ,需要用不同的中断处理程序来处理, 当cpu检测到中断信号后, 会根据中断信号的类型去查询”中断向量表“ ,...什么是系统调用 操作系统作为用户 和 计算机硬件之间的接口, 需要向上提供一些 简单易用的服务接口。 主要包括 命令接口和程序接口, 其中程序接口 由一组系统调用组成。...系统调用 和 库函数的区别 例子 ,为什么系统调用是必须的 ? 需要通过系统调用来达到对共享资源的一种调度的作用。 什么功能要用系统调用实现 ?...这样可以保证系统的稳定性和安全性。 防止用户进行非法操作。 系统调用的过程 重听, 相对来说是重点1.3_3_系统调用 6.10
中断和异常 本质 发生中断就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(如进程切换,分配I/O设备等)需要使用特权指令,所以需要CPU由用户态切换到核心态。...有了中断,才能实现多道程序并发执行 概念 中断发生时,CPU立即进入核心态 中断发生后,当前进程暂停运行,并由操作系统内核对中断进行处理 对于不同的中断信号,会进行不同的处理 用户态切换到核心态是通过中断实现的...,并且中断是唯一的实现方式 核心态到用户态的切换只需要执行一个特权指令,将程序状态字(PSW)的标志位设置为“用户态”即可 中断的分类 内中断 也称为异常,例外,陷入 信号来源:CPU内部,与当前执行的指令有关...内中断还细分为 自愿中断:指令中断,如系统调用时的访管指令(陷入指令,trap指令) 强迫中断:硬件故障(如缺页中断),软件中断(如除0) 内中断另一种分类方式: 陷阱,陷入(trap):有意而为之的异常...也称为中断(狭义上的中断) 信号来源:CPU内部,与当前执行的指令无关 外中断还可以分为 外设请求:如I/O操作完成发出的中断信号 人工干预:如用户强行停止一个进程 外中断处理过程 CPU在用户态下逐条执行指令
异步中断是由其他硬件设备依照CPU时钟信号随机产生的。中断是由间隔定时器和I/O设备产生的,例如,用户的一次按键会引起一个中断。...异常 在Intel微处理器手册中,把同步和异步中断分别称为异常(exception)和中断(interrupt)。我们也采用这种分类,当然有时我们也用术语“中断信号”指这两种类型。...3.中断和异常 Intel文档把中断和异常分为以下几类: (1)中断: 可屏蔽中断(maskable interrupt) 非屏蔽中断(nonmaskable interrupt) (2)异常: 处理器探测异常...编程异常通常也叫做软中断(software interrupt),这样的异常由两种常用的用途:执行系统调用及给调试程序通报一个特定的事件。 每个中断和异常是由0~255之间的一个数来标识。...非屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。 参考资料: 《深入理解LINUX内核》
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...所有256 种中断可分为两大类:异常和中断。异常又分为故障(Fault)、陷阱(Trap)和夭折(Abort),它们的共同特点是既不使用中断控制器,又不能被屏蔽。...非屏蔽中断的向量和异常的向量是固定的,而屏蔽中断的向量可以通过对中断控制器的编程来改变。Linux 对256 个向量的分配如下。 • 从0~31 的向量对应于异常和非屏蔽中断。...2.中断门(Interrupt gate) 其类型码为110,中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。...4、中断和异常的处理 当CPU 执行了当前指令之后,CS 和EIP 这对寄存器中所包含的内容就是下一条将要执行指令的逻辑地址。
所以,内核态程序被激活的方式有: 系统调用(异常的一种) 异常 中断 内核线程 上面的任意一种方式,都可以让CPU执行内核态的代码。...和异常相反,尽管内核代表当前进程处理这些中断,但是,I/O设备引发的中断和当前进程没有直接数据引用的关系。事实上,给定一个中断,无法推断出是哪个进程在运行。...所以,中断的执行不会引起进程的切换,也就可以无限嵌套处理。 中断处理程序可以打断中断或异常处理程序执行,但是反过来,异常不能打断中断处理程序。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。
在上一篇文章中,我们已经了解了中断和异常的一些概念,对于中断和异常也有了大概的理解。那么,系统中硬件到底是如何处理中断和异常的呢?本文我们就以常见的X86架构为例,看看中断和异常的硬件工作原理。...然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...陷阱门 同中断门类似,只是不会修改IF标志。 4 中断和异常的硬件处理 现在,我们来探究一下CPU控制单元是如何处理中断和异常的。我们假设内核已经完成初始化,CPU工作在保护模式下。...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。...(处理完中断或异常后,还要恢复到旧任务执行) 根据造成异常的指令的逻辑地址,加载cs和eip寄存器(异常解决后,程序可以继续从这儿执行); 保存eflags、cs和eip到堆栈中; 如果异常携带异常错误码
内核知识第十一讲,门,以及中断和中断异常. 一丶TSS和TR寄存器....二丶中断和中断异常. 首先,什么是中断? 在我们的8086的年代里面. 调用API的是否是 int 21来进行调用的. 这就是一个中断.中断是什么? 其实中断就是一个电信号....就产生一个异常.而在CPU接受到了,就会去查表.这样就可以处理int 3的指令了. 1.中断和异常. 中断我们说过了,是电信号. 而表则是CPU和操作系统的通信机制. 那么说下异常把. ...其实异常也是中断. 只不过,我们的软件调试的时候.当我们的程序用内联汇编写的int 3的时候,就会产生断点功能. 其实软件产生的中断,就叫做异常. ...在80386里面.有两个银脚,是专门接受中断信号的. 而且80386最多接受256种中断或者异常.
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...(4)软中断指令 int是软中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n -- 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。...(5)硬中断和软中断的区别 软中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。...二、开关 (1)硬中断的开关 简单禁止和激活当前处理器上的本地中断: local_irq_disable(); local_irq_enable(); 保存本地中断系统状态下的禁止和激活: unsigned
R14_svc,R14_irq,R14_fiq,R14_abt和R14_und同样用于在发生中断和异常时,或者执行转移和链接指令时,备份R15的返回值。 ...所有Cortex-A系列处理器都允许这样做,这是Linux内核选择的默认地址。实现安全扩展的内核还可以使用CP15向量基地址寄存器为安全状态和非安全状态分别设置向量基地址。 ...这避免了分支指令和任何相关的延迟,从而加快了FIQ响应时间。相对于其他模式,FIQ模式下可用的备份寄存器数量比较多,从而避免要将寄存器的值保存到栈上,提高了执行速度。 Linux通常不使用FIQ。...某些运行Linux的系统仍可以使用FIQ,但是由于Linux内核从不禁用FIQ,因此它们比系统中的其他任何事物都具有优先权,因此需要格外小心。...例11-1中显示了说明Linux内核使用SVC的代码 SVC#0指令使ARM核采用SVC异常(一种访问内核功能的机制)。寄存器R0定义所需的系统调用(在本例中为sys_write)。
对应I/O APIC和local APIC的组合,其连接方式见下图 ? 针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...CPU对中断和异常的处理 相关概念 1、 vector(中断向量) vector是一个整数,在X86CPU上,使用vector对中断(interrupt,外部设备产生)和异常(exception,...CPU在程序执行中产生)统一编号,每个CPU核心内部,中断/异常和vector所以一一对应的;但是在各个不同的CPU核心上,相同的vector可以对应不同的中断(至少对于linux的设置,异常还是使用相同的...通过INT n指令生成的中断即使使用了和外部中断一样的vector,也是不可屏蔽的;同样CPU运行过程中同步产生的trap、fault、abort等异常也是不可屏蔽的。...异常的执行过程类似,只不过异常在执行前不会把IF位清零,只清零TF位。
Linux虚拟内存地址空间 为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。 虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。...,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。...操作系统中的缺页中断 malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。...当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。 缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。...,由硬件所产生的一种特殊的中断,因此,与一般的中断存在区别: 1、在指令执行期间产生和处理缺页中断信号 2、一条指令在执行期间,可能产生多次缺页中断 3、缺页中断返回是,执行产生中断的一条指令,而一般的中断返回是
系统调用和陷阱 系统调用,debug时断点等。 在进一步分析异常和中断之前,先来理解一个概念,什么是精确异常?...所以,对于TLB未命中异常处理程序(也就是TLB重填异常处理程序)来说,如果读取TLB表(像Linux内核,一般将映射表保存在kseg2段地址空间中)时,发生页表地址读取异常时,程序会再次返回到异常程序入口点...但是,嵌套异常也分为2种:一种就是上面TLB未命中异常嵌套TLB未命中异常,这种不需要人为干预EPC和SR状态寄存器;另外一种,就需要我们必须保存被中断程序的EPC寄存器和SR寄存器内容。...ARM和X86架构有专门的禁止中断的指令。 系统调用看上去负荷还是有点重,虽然执行时间不一定很长。但是,需要编程者在异常派发代码中,将这个系统调用和其它异常处理程序理清楚。...对于信号量的理解,我们之前已经写过文章,请参考《Linux内核33-信号量》。
中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...鉴于这个原因,Linux把中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...Linux在系统初始化时注册了两种softirq处理函数,分别为 TASKLET_SOFTIRQ 和 HI_SOFTIRQ: void __init softirq_init() { ......Linux定义了两种的tasklet队列,分别为 tasklet_vec 和 tasklet_hi_vec,定义如下: struct tasklet_head tasklet_vec[NR_CPUS];...前面我们也介绍过,Linux在初始化时会注册两种softirq,TASKLET_SOFTIRQ 和 HI_SOFTIRQ: void __init softirq_init() { ...
[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...IDT 中断描述符表本身的存储 IDT 中断描述符表的物理地址存储在IDTR寄存器中,这个寄存器存储了IDT的基地址和长度。...idt3.jpg 硬件中断的实现 硬件中断的IDT初始化和调用流程 这里我们不讲解具体的代码细节,只关注流程 。...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int
举例: intel x86 CPU有四种不同的执行级别0-3,linux只使用了其中的0级和3级分别来表示内核态和用户态。 image.png 二、如何区分用户态和内核态?...打个比方在ARM处理器的异常种类就有不少,有未定义指令异常,软中断异常,快中断异常等等。异常是由程序错误产生的,或者是内核必须处理的异常条件产生的。...那么在linux内核中的中断其实也是和单片机类似的,只不过linux内核的中断定义的比较丰富,但是基本思想还是一样的。linux内核处理中断有一种叫做中断信号的机制。...在intel的文档中,中断和异常通常分为几类:中断有可屏蔽的,不可屏蔽的。异常有处理器探测异常,这就包括故障的产生,陷阱,异常的中止,还有编程异常的状况。...每个中断和异常都是由0-255之间的一个数来标识。intel管这东西叫向量。 其实在ARM中就有那么一张表叫异常向量表,那就是我刚刚文章里说过的那几个。
,应该和版本无关 2....顺便说一下,benchyou和sysbench极为相似,也非常好用。 改用benchyou工具后,压测正常。看来的确不是MySQL版本的问题。...用 mysql_random_load 工具进行压测时,系统负载非常高,同时可观测到系统的中断也很高并且也很不均衡。...问题分析 初步认定是因为系统中断太高导致的写入性能差,并且也认定是因为多个CPU间中断不均衡导致的这个问题。 观察是都有哪些中断比较高,发现主要是 LOC 和 RES 这两个每秒的增长比较大。...在尝试修改相关中断号绑定的CPU后(参考:SMP affinity and proper interrupt handling in Linux[3]),问题还是没有得到缓解。
可以用Linux下的time指令,去查看一个程序运行实际花费的时间,里面有在用户态花费的时间(user time),也有在内核态发生的时间 (system time)。...在处理异常的过程当中,无论是异步的中断,还是同步的陷阱和故障,我们都是采用同一套处理流程,也就是上面所说的,“保存现场、异常代码查询、异常处理程序调用“。...推荐阅读 关于异常和中断,《深入理解计算机系统》的第8章“异常控制流”部分,有非常深入和充分的讲解,推荐你认真阅读一下。...再续中断分类 软中断和硬中断 硬中断 由硬件发出或产生的中断称为硬中断,按硬中断事件的来源和实现手段可将中断划分为外中断和内中断: 外中断 又称为中断或异步中断,是指来自处理器以外的中断信号,包括时钟中断...外中断又分为可屏蔽中断和不可屏蔽中断,各个中断具有不同的优先级,表示事件的紧急程度,在处理高一级中断时,往往会部分或全部屏蔽低等级中断。
这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 Linux2.6内核使用两种手段满足这项挑战:软中断和tasklet,还有工作队列。...2 软中断 Linux2.6内核中,软中断的数量比较少。对于多数目的,这些tasklet足够了。因为不需要考虑重入,所以简单易用。...Linux软中断处理程序总是从索引0开始执行。 2.1 软中断使用的数据结构 软中断的主要数据结构是softirq_vec数组,包含类型为softirq_action的32个元素。...如果在第3步切换到软IRQ堆栈,则恢复原来的堆栈指针到esp寄存器中,然后切换到之前使用的异常堆栈中。 执行local_irq_restore恢复中断标志。...这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止软中断。 清除正在执行的软中断对应掩码位。 执行local_irq_enable()使能中断。
领取专属 10元无门槛券
手把手带您无忧上云