中断是什么,为什么要有中断
并发是指单位时间内的累积工作量。
并行是指真正同时进行的工作量。
一个CPU在一个时间只能执行一个进程,任何瞬间任务只在一个核心上运行。
而CPU外的设备是独立于CPU的,它与CPU同步运行,CPU抽出一点时间来处理中断,外部设备就可以同CPU并行工作了,整个计算机系统可以大幅度提升效率。
操作系统是中断驱动的
操作系统是个死循环,一直在重复工作,工作期间接受别的指令中断进行操作,然后继续重复运行。操作系统周而复始的运行,其目的就是等待某些事情的发生,而这个事件是以中断的形式通知操作系统的。
中断分类
外部中断
外部中断是指来自CPU外部的中断,而外部的中断源必须是某个硬件,所以外部中断又称为硬件中断。(就是来自外设的任务)
为了让CPU获得每个外部设备的中断信号,CPU提供统一的接口作为中断信号的公共路线,来自外设的中断信号都共享公共路线连接到CPU。
CPU为大家提供了两条信号线。外部硬件的中断是通过两根信号线通知CPU的,这两根信号线就是INTR和NMI。
在单核CPU上运行的程序都是串行的,所有任务,包括中断处理程序都是一个接一个在CPU上运行的,所有任务都共享同一个CPU,CPU在各个任务间不断切换才实现了并发。
CPU通过两根中断线区分事情的紧急程度。只要从INTR引脚收到的中断都是不影响系统运行的,可以随时处理,甚至CPU可以不处理(可屏蔽中断)。而只要从NMI引脚收到的中断表示系统中发生了致命的错误(不可屏蔽中断)。
首先为每一种中断分配一个中断向量号,中断向量号就是一个整数,它就是中断向量表或中断描述表中的索引下标,用来索引中断项。中断发起时,相应的中断向量号通过NMI或INTR引脚被传入CPU,中断向量号是中断向量表或中断描述符表里中断项的下标,CPU根据此中断项的下标,CPU根据此中断向量号在中断向量表或中断描述符中检索对应的中断处理程序并去执行。
内部中断
内部中断可以分为软中断和异常。
以下是可以发起中断的指令:
除了第一种“int8位立即数”之外,其他的几种又可以称为异常。因为它们既具备软中断的“主动”行为,又具备异常的“错误”结果。
异常是另一种内部中断,是指令执行期间CPU内部产生的错误引起的。由于是运行时错误,所以它不受标志寄存器eflags中的IF位影响,无法向用户隐瞒。
中断描述表
中断描述表是保护模式下用于存储中断处理程序入口的表,当CPU接收一个中断时,需要用中断向量在此表中检索对应的描述符,在该描述符中找到中断处理程序的起始地址。
除了调用门外,其他三个门都可以存在于中断描述符表中。门就是记录了一段程序的起始地址,也就是通往这段程序的入口。
一个中断源就会产生一个中断向量,每个中断向量都对应中断描述符表中的一个门描述符,任何中断源都通过中断向量对应到中断描述符表中的门描述符,通过该门描述符就找到了对应的中断处理程序。
IDT的位置不固定,CPU通过中断描述符表寄存器(IDTR)找到它。该寄存器分为两部分:第0-15位是表界限,即IDT大小减1,第16-47位是IDT的基地址。中断描述符表地址加载到这个寄存器中,只有寄存器IDTR指向了IDT,当CPU接收到中断向量号时才能找到中断向量处理程序。
中断处理过程及保护
CPU内的处理过程:
处理器提供了专门用于控制IF位的指令,通过它,IF可以直接控制。指令cli使IF位为0,这称为关中断,指令sti使IF位为1,这称为开中断。IF位只能限制外部设备的中断,对那些影响系统正常运行的中断都无效。
进入中断时,NT位和TF位都为0。TF表示Trap Flag,陷阱标志位,用在调试环境中,禁止单步执行。NT表示Nest Task Flag,即任务嵌套标志位,也就是用来标记任务嵌套调用的情况。任务嵌套调用是指CPU将当前正执行的旧任务挂起,转去执行另外的新任务,待新任务执行完后,CPU再回到旧任务继续执行。当CPU执行iret指令(中断返回指令),它会检查NT位的值,如果NT位为1,这说明当前任务是被嵌套执行的,因此会从自己TSS中“上一个任务TSS的指针”字段中获取旧任务,然后去执行该任务。如果NT位值为0,表示当前是在中断处理环境下,于是就执行正常的中断退出程序。
中断发生时的压栈
中断错误码
指明中断发生在哪个段上。错误码本质上就是个描述符选择子,通过低3位属性来修饰此选择子指向是哪个表中的哪个描述符。当全0的错误码出现时,表示中断的发生与特定的段无关,或者引用了一个空描述符,引用描述符就是往段寄存器中加载选择子的时候,处理器发现选择子指向的描述符是空的。
可编程中断控制器8259A
8259A的作用是负责所有来自外设的中断,其中包括来自时钟的中断。
8259A介绍
8259A是中断代理,当有多个中断同时发生时,由它负责对所有中断仲裁,决定哪个中断优先被CPU受理。
Intel处理器共支持256个中断,但8259A只可以管理8个中断。为了多支持一些设备,可以将多个8259A组合(级联)。最多可级联9个,也就是最多支持64个中断。n片8259A通过级联可支持7n+1个中断源。
8259A工作流程:
8259A的编程
8259A内部有两组寄存器ICW和OCW。
ICW是初始化命令寄存器组,用来保存初始化命令字,共4个。
OCW是操作命令寄存器组,用来保存操作命令字,共3个。
ICW1初始化8259A的连接方式(单片还是多片级联)和中断信号的触发方式(边沿触发还是电平触发)。
ICW2用来设置起始中断向量号,只要指定IRQ0映射到的中断向量号,其他IRQ接口对应的中断向量号会顺着自动排下去。ICW2需要写入到主片的0x21端口和从片的0xA1端口。
ICW3仅在级联的方式下才需要,用来设置主片和从片用哪个IRQ接口互连。ICW2需要写入到主片的0x21端口和从片的0xA1端口。
ICW4用于设置8259A的工作模式,当ICW1中的IC4为1时才需要ICW4。ICW4需要写入到主片的0x21端口和从片的0xA1端口。
OCW1用来屏蔽连接在8259A上的外部设备的中断信号(是否 把来自外部设备的中断信号转发给CPU),实际上就是把OCW1写入了IMR寄存器。OCW1需要写入到主片的0x21端口和从片的0xA1端口。
OCW2用来设置中断结束方式和优先级模式。OCW2需要写入到主片的0x20端口和从片的0xA0端口。
OCW3用来设定特殊屏蔽方式及查询方式。OCW3需要写入到主片的0x20端口和从片的0xA0端口。
ICW1、OCW2、OCW3的写入端口是一致的,通过各控制字中的第4-3位标识位来确定某个控制字。
编写中断处理程序
中断处理程序
可编程计数器/定时器8253简介
时钟——给设备打拍子
为了让所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就称为定时或时钟。是一种使设备间相互配合而避免发生冲突的节拍。
内部时钟:指处理处理器内部元件,主要用于控制、同步内部工作过程的步调。内部时钟不可改(应该是最快的,纳秒级(ns))。内部时钟是由晶体振荡器产生的,简称晶振,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就基于外频。处理器将外频乘以某个倍数之后便是主频,处理器取指令、执行指令中所消耗的时钟周期,都是基于主频的。
外部时钟:指处理器与外部设备或外部设备之间通信采用的一种时序。一般为毫秒级或秒级。
外部时钟和内部时钟是两套独立运行的定时体系。对于处理器与外部设备之间的通信,要保证运行在不同时钟节拍下的设备能够同步通信。应以处理器的内部时钟为依据来设计外部设备的时钟,既要符合处理器内部运行时序的规定,又要满足外部设备工作时序的要求。通过定时计数器将晶振产生的信号频率分频,就能产生所需要的各种定时信号。
定时器的功能就是定时发信号。当到达了所计数的时间,计数器可以自动发一个输出信号,可以用该信号向处理器发出中断,这样处理器可以去执行相应的中断处理程序。或者用该信号直接启动某些外部设备。
定时器可分为不可编程定时器和可编程定时器,8253就是可编程定时器。
计数器和定时器是一样的。每一次时钟脉冲信号到来时就会修改计数值。
8253入门
8253内部有三个独立的计数器,既可以同时工作,又可以各干各的。
在计数器开始计数之前,计数初值保存在寄存器中,计数器开始执行时将初值载入,计数器的CLK每收到一次脉冲信号,计数值减1,同时将当前值保存在输出锁存器中。当计数值减到0时,表示定时工作结束,此时将通过OUT引脚发出信号,此信号可以用来向处理器发出中断请求,也可以直接启动某个设备工作。
8253控制字
控制字寄存器中保存的内容称为控制字,控制字用来设置所指定的计数器的工作方式、读写格式及数制(控制模式)。
8253工作方式
计数器开始计数条件:
GATE为高电平,即GATE=1,这是由硬件来控制的;
计数初值已写入计数器中的减法计数器,这事由软件out指令控制的。
软件启动:条件1已完成,只差条件2。工作方式0、2、3、4。
硬件启动:条件2已完成,只差条件1。工作方式1、5。
计数停止:
强制终止:将GATE置为0。工作方式2、3。(计数值重复计数,变为0后回到初值)
自动终止:定时一到期就停止。工作方式0、1、4、5 。
使用8253来提升时钟中断信号的频率,而时钟中断信号是由计数器0负责产生的。将高频的输入脉冲信号CLK转换为低频的输出信号OUT,此信号就是时钟中断信号。1.193180MHZ是计数器的工作频率,也就是说,一秒钟会有1193180次脉冲信号。
8253初始化步骤
1.往控制字寄存器端口0x43中写入控制字;
2.在所指定使用的计数器端口中写入计数初值。