CPU共256个中断类型型号:
0~31:对应于异常和非屏蔽中断,不使用中断控制器;
32~47:分配给可屏蔽中断,由I/O设备引起的中断,这其中就包含可由两个8259A级联响应的15个;
48~255:用来标识软中断;
cpu的数学模型是图灵机,图灵机是一个线性运行指令的机器,它的执行序列是完全确定的,中断机制是使得cpu具有异步处理能力的机制,就是先暂停他的序列 来执行一些其他指令。具体来说就是,从硬件实现上,其他硬件可以给cpu发电信号,cpu收到这个信号就暂停当前的指令,去执行中断函数。cpu上不是有许多针吗,其中一个就是用来收中断信号的。再具体来说,内核启动的时候会配置一个中断向量表,一个硬件关联一个整数,也就是数组下标,比如,键盘关联5,键盘给cpu发中断,cpu就会收到5号中断,就会去执行函数指针数组中的第五个函数。
在单cpu单核时代,为什么能实现多线程在微观上切换,宏观上并行呢,cpu是一条单行线,我的进程正在执行,它是怎么切换到其他进程执行的呢?这是因为主板或者cpu内部有一个硬件叫timer定时器,关联32号中断,它每秒发送一百次中断,cpu就去执行32号中断函数,然后选择一个进程去执行。
硬中断:
1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。
2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。CPU需要判断中断源,保存现场状态,以便能够处理完后继续执行中断的任务!
3. 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。
4. 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。
软中断:(int指令)CPU在执行到INT指令时,通过中断描述符表找到中断号对应的中断服务子程序的地址
1. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。
2. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。
3. 软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。
4. 软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。
中断向量--》IDT--》门描述符--》段选择子--》GDT/LDT--》段描述符--》段基地址
中断向量:是指CPU拿到向量号(从外部、int指令中或者前32[0~1F]个默认CPU内部向量号)
IDT:中断向量表!CPU用向量号读取IDT中对应序号的条目,读取出来的是一个门描述符。
0~31:异常和非屏蔽中断
32~47:为可屏蔽中断(硬件中断)
48~255:用来表示软中断,其中Linux只用一个(即128或0x80向量)作为系统调用。
前面所述的中断号与中断向量之间的关系是:中断号+32 = 中断向量。
PC上可屏蔽中断 8259A
PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:
中断源 中断类型号 中断功能
IRQ0 08H 时钟
IRQ1 09H 键盘
IRQ2 0AH 保留
IRQ3 OBH 串行口2
IRQ4 0CH 串行口1
IRQ5 0DH 硬盘
IRQ6 0EH 软盘
IRQ7 0FH 并行打印机
8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。对于PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级联,对外可以提供16个中断源:
中断源 中断类型号 中断功能
IRQ8 070H 实时时钟
IRQ9 071H 用户中断
IRQ10 072H 保留
IRQ11 O73H 保留
IRQ12 074H 保留
IRQ13 075H 协处理器
IRQ14 076H 硬盘
IRQ15 077H 保留
早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。
中断是多程序并发执行的前提条件。
(1) 以两个进程并发运行为例,进程1在用户态运行了一段时间后,CPU会接收到计时部件(操作系统内核的时钟管理部件)发出的中断信号,表示进程1已经用完了一个时间片,CPU会切换到核心态,把CPU的使用权限交还给操作系统,操作系统内核就会对刚才的中断进行处理,操作系统知道进程1的时间片用完,就需要切换进程,在完成切换进程的一系列工作后,操作系统又会将CPU的使用权交还给用户进程。
(2) 接着进程2拿到CPU执行权就会在用户态下执行,进程2执行一段时间后,进程2发出系统调用(内中断信号),请求输出,主动要求操作系统介入工作,CPU会立即切换到核心态,把CPU的使用权限交还给操作系统,操作系统内核接管进程2系统调用请求,调用IO设备开始输出工作,然后操作系统交还CPU执行权,IO设备也会并行执行,进程2需要等待IO操作完成,所以进程1拿到CPU执行权开始运行。当执行一段时间后,IO操作完成,IO设备向CPU发送一个中断信号,此时CPU由用户态再次转换为核心态,对刚才的中断信号处理,由于IO操作完成,所以操作系统知道进程2可以恢复运行了,以完成后续工作,所以操作系统再次交还CPU执行权,让进程2再次运行。
从上面过程可以看出:
(1) 当中断发生时,CPU立即进入核心态。
(2) 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进程处理。
(3) 对于不同的中断信号,会进行不同的处理。
中断的本质:发生中断就意味着需要操作系统介入,开展管理工作。
当发生了中断,就意味着需要操作系统的介入,开展管理工作。由于操作系统的管理工作(如进程切换、分配IO设备)需要使用特权指令,因此CPU要从用户态转换为核心态。中断就可以使CPU从用户态转换为核心态,使操作系统获得计算机的控制权。因此,有了中断,才能实现多道程序并发执行。
用户态到核心态的转换就是通过中断机制实现的,并且中断是唯一途径。
核心态到用户态的切换时通过执行一个特权指令,将程序状态字(PSW)标志位设置为用户态。
中断可以分为:内中断和外中断。
内中断:内中断的信号来源于CPU内部、与当前执行的指令有关。如整数除0。
外中断:外中断的信号来源于CPU外部、与当前执行的指令无关。如用户强制结束一个进程、IO设备完成操作发生的中断信号。
(1) 执行完每个指令后,CPU都要检查当前是否有外部中断信号。
(2) 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器、各种通用寄存器)。
(3) 根据中断信号类型转入相应的中断处理程序。
(4) 恢复进程的CPU环境并退出中断,返回原进程继续往下执行。
(1) 中断是为了实现多道程序并发执行而引入的一种技术。
(2) 中断的本质就是发生中断时需要操作系统介入开展管理工作。
(3) 发生CPU会立即进入核心态,针对不同的中断信号,采取不同的处理方式。
(4) 中断是CPU从用户态进入核心态的唯一途径。
(5) 中断分为内中断和外中断。
(6) 进程中断时,操作系统会保存CPU的运行环境,如程序状态字(PSW)、程序计数器、各种通用寄存器,这是为了当进程再次运行时可以从中断的状态处继续运行。
cli:关闭中断,IF=0
sti:开启中断,IF=1
iret:中断返回后,会自动设置IF位为1,重新开启中断