CPU中断

   CPU共256个中断类型型号:

   0~31:对应于异常和非屏蔽中断,不使用中断控制器;
   32~47:分配给可屏蔽中断,由I/O设备引起的中断,这其中就包含可由两个8259A级联响应的15个;
   48~255:用来标识软中断;

CPU中断_第1张图片

CPU中断的机制概论

   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中对应序号的条目,读取出来的是一个门描述符。

 

  • 中断号:这里所说的中断号是指外部中断即硬件中断的编号,系统为每个“中断请求线”分配了一个号,x86采用了两个8259A,一共有15个中断号,但是随着外设的增加,这些肯定不能满足需求,所以就有了多个外设共享一个中断号。中断号是用来表明是那个设备产生了中断,比如作为时钟中断的IRQ0。这样CPU就可以知道是那个设备产生了中断从而去处理它。
  • 中断向量:Inter x86共支持256个向量中断,为了很容易的识别每种中断源将它们从0到255进行编号,Inter将这个整数叫做中断向量,Linux对这256个中断向量的分配如下:

       0~31:异常和非屏蔽中断

      32~47:为可屏蔽中断(硬件中断)

      48~255:用来表示软中断,其中Linux只用一个(即128或0x80向量)作为系统调用。

      前面所述的中断号与中断向量之间的关系是:中断号+32 = 中断向量

PC上可屏蔽中断 8259A

CPU中断_第2张图片CPU中断_第3张图片

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) 以两个进程并发运行为例,进程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) 对于不同的中断信号,会进行不同的处理。

2 中断的本质

  中断的本质:发生中断就意味着需要操作系统介入,开展管理工作。
  当发生了中断,就意味着需要操作系统的介入,开展管理工作。由于操作系统的管理工作(如进程切换、分配IO设备)需要使用特权指令,因此CPU要从用户态转换为核心态。中断就可以使CPU从用户态转换为核心态,使操作系统获得计算机的控制权。因此,有了中断,才能实现多道程序并发执行。
  用户态到核心态的转换就是通过中断机制实现的,并且中断是唯一途径。
  核心态到用户态的切换时通过执行一个特权指令,将程序状态字(PSW)标志位设置为用户态。

3 中断的分类

  中断可以分为:内中断和外中断。
  内中断:内中断的信号来源于CPU内部、与当前执行的指令有关。如整数除0。
  外中断:外中断的信号来源于CPU外部、与当前执行的指令无关。如用户强制结束一个进程、IO设备完成操作发生的中断信号。

4 中断的处理过程

  (1) 执行完每个指令后,CPU都要检查当前是否有外部中断信号。
  (2) 如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器、各种通用寄存器)。
  (3) 根据中断信号类型转入相应的中断处理程序。
  (4) 恢复进程的CPU环境并退出中断,返回原进程继续往下执行。

CPU中断_第4张图片

 

5 小结

  (1) 中断是为了实现多道程序并发执行而引入的一种技术。
  (2) 中断的本质就是发生中断时需要操作系统介入开展管理工作。
  (3) 发生CPU会立即进入核心态,针对不同的中断信号,采取不同的处理方式。
  (4) 中断是CPU从用户态进入核心态的唯一途径。
  (5) 中断分为内中断和外中断。
  (6) 进程中断时,操作系统会保存CPU的运行环境,如程序状态字(PSW)、程序计数器、各种通用寄存器,这是为了当进程再次运行时可以从中断的状态处继续运行。

 

重要:

cli:关闭中断,IF=0

sti:开启中断,IF=1

iret:中断返回后,会自动设置IF位为1,重新开启中断

你可能感兴趣的:(打造简单OS)