中断在操作系统中的应用
XXX
(XX大学 XXXX学院,四川 成都 610065)
摘要:随着(微型)计算机的发展,中断系统不断增加新功能,中它不仅仅能解决快速主机和慢速外设的矛盾,还可以实现分时操作、实时处理、故障处理等操作,同时中断系统可以用来实现自动管理,例如虚拟内存的管理、自动保护等等,中断在操作系统中的应用技术的先进性已经成为衡量计算机的重要指标之一。针对中断在操作系统中的应用这个问题,本文对系统中断的理论出发,通过对中断实现的机制,系统调用与中断的关系和几个硬件中断的例子及其工作原理三方面的讨论,从而找到了中断在系统中的可能应用,为中断技术的发展趋向找到明确的方向。
关键词:中断;系统调用;操作系统; 中图分类号:TP36
The Relationship Of
System Calls And Interrupt
Wang Bin (Sichuan university,college of electronic information,
Chengdu,610065,China;)
Abstract: Along with the development of (micro) computer, interrupt system increased the new function, it not only can solve the contradictions of fast and slow host peripherals,
also can realize time sharing operation, real-time processing, fault processing operations, at the same time interrupt system can be used to realize automatic management, virtual memory management, automatic protection and so on, for example, interrupted the operating system, the application of advanced technology has become one of the important indicators of the computer. To interrupt in the operating system, the application of this problem, in this paper, the system of theory, through the interrupt implementation mechanism, the system call and interrupt the relationship and several examples of hardware interrupt and its working principle of the three aspects of discussion, interrupt is found in the system may be used, to interrupt the development of technology to find a clear direction.
Key Words: The Interrupt; The system calls; The operating system;
引言:CPU任意时刻只能执行一个操作,但有时却要同时面临运行程序、数据输入输出、意外紧急事件处理等多项任务,此时如果采取中断的办法,即CPU暂停
当前任务,转去处理完中断事件后再继续执行当前任务,就可以“并行”处理多项任务。中断技术是计算机的重要组成部分,中断技术可以实现CPU与外设的速
度匹配,实现实时控制,实现故障的及时发现,实现人机联系等应用。
1 中断的实现机制 1.1 中断的定义
在CPU执行程序的过程中,出现了某种紧急或异常的事件(中断请求),CPU需暂停正在执行的程序,转去处理该事件(执行中断服务程序),并在处理完毕后返回断点处继续执行被暂停的程序,这一过程称为中断。
中断源:指能够引起中断的原因或发出中断申请的来源。主要有以下几类:1)外部设备请求中断。一般的外部设备如键盘、磁盘驱动器、磁带机、打印机等在工作告一段落后发出中断请求,要求CPU为它服务。2)实时时钟请求中断。如定时/计数器,先有CPU发出指令,让时钟电路开始计时工作,待规定的时间到,时钟电路发出中断申请,CPU转入中断服务程序进行中断处理。3)故障请求中断。当出现电源掉电、存储出错或溢出故障时,发出中断请求,CPU转去执行故障处理程序,如启动备用电源、报警等。4)异常。由于CPU执行指令引起的中断。 1.3 中断的分类:
1).按中断的性质来划分,则 系统中的中断可分为:可屏蔽中
1.2 中断源及其分类
断和不可屏蔽中断。对不可屏蔽
中断,程序员不能控制它,系统肯定会立即响应的,而对于可屏蔽中断,汇编语言程序员可以通过指令CLI和STI来控制对它们的响应。
2).按中断源来划分,则系统中的中断又可分为:硬件中断和软件中断。对于硬件中断,程序员不能控制它,它们基本上是随机产生的,而对于软件中断,汇编语言程序员可通过指令INT和INTO来有目的安排它们的。 1.4 中断请求
中断请求是由中断源向CPU发出中断请求信号。软件中断源是在CPU内部由中断指令或程序出错直接引发中断;硬件中断源必须通过专门的电路将中断请求信号传送给CPU,CPU也有专门的引脚接收中断请求信号。例如,8086/8088 CPU用INTR引脚(可屏蔽中断请求)和NMI引脚
(非屏蔽中断请求)接收硬件中断请求信号。一般外设发出的都是可屏蔽中断请求 1.5 中断排队
通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现 1.6 中断响应
经中断排队后, CPU收到一个当前申请中断的中断源中优先级别最高的中断请求信号,如果
满足条件, 则中止执行现行程序, 入指令(IN)从接口中的数据端口响应中断申请。
中断响应的条件:① 有中断请求信号② 中断请求没有被屏蔽③ CPU允许响应中断请求④ CPU在现行指令执行结束时响应中断
响应步骤1).标志寄存器内容入栈2).IF清零3).保护断点,即当前CS、IP入栈4).寻找中断服务程序入口地址 1.7 中断处理
中断处理的过程实际就是CPU执行中断服务程序的过程。用户编写的用于CPU为中断源进行中断处理的程序称为中断服务程序。由于不同中断源在系统中的作用不同,所要完成的功能不同,因此,不同中断源的中断服务程序内容也各不相同。例如,对于图7.11所示的输入设备,其中断服务程序的主要任务是用输
向CPU输入数据。 1.8 中断返回
执行完中断服务程序,返回到原先被中断的程序,此过程称为中断返回。为了能正确返回到原来程序的断点处,在中断服务程序的最后应专门放置一条中断返回指令(如8086/8088的IRET指令)。中断返回指令的作用实际上是恢复断点,也就是保护断点的逆过程。
2 系统调用与中断的关系 2.1 系统调用的定义
所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。操作系统的主要功能是为应
用程序的运行创建良好的环境,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用的(system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序。 2.2 系统调用的过程 1) 执行用户程序(如:fork)2)根据glibc中的函数实现,取得系统调用号并执行int $0x80产生中断。3)进行地址空间的转换和堆栈的切换,执行SAVE_ALL。(进行内核模式)4)进行中断处理,根据系统调用表调用内核函数。5)执行内核函数。6)执行RESTORE_ALL并返回用户模式
2.3 系统调用与中断的区别 首先它们都是操作系统概念。中断调用是DOS操作系统中,系统调用的特殊形式而已。 系统调用,都是指操作系统的开发者,提供了许多系统的程序库,实现输入/输出等基本的功能,我们编写程序的时候就调用这些程序库,不必要自己到显示器上绘图和读取键盘端口。 在UNIX操作系统下,系统调用主要是C语言格式调用的一些函数库。比如printf和scanf函数,我们写程序的时候直接可以用,编译系统把它转变为对操作系统函数库调用的代码,目标文件可以运行。
在WINDOWS系统,系统调用主要是以一系列的DLL、EXE文件方式给出,比如USER32.DLL、NTDLL.DLL等,编写程序的时候
可以直接调用里面的GETDC等函数库。
在DOS系统下,操作系统不以函数库形式提供系统调用,而是把整个操作系统的所有代码都LOAD到内存里面,把相关系统调用功能安装到中断接口里面,我们写的程序需要调用的时候,调用相应的中断。比如打开文件等操作,就调用INT 21。 3 硬件中断的例子及其工作原
理分析
3.1 我们先来看一个例子,设计一个中断处理程序。要求中断请求信号以跳变方式由IR2引入(可为任一定时脉冲信号),当CPU响应IR2请求时,输出字符串“8259A INTERRUPT!”,中断10次,程序退出(设8259A的端口地址为20H和21H,中断类型号为40H)。 中断处理程序如下:
DATA SEGMENT MESS DB'8259A?
INTERRUPT!', 0AH, 0DH, '$' COUNT DB
10 ; 计数值为10
DATA ENDS STACK SEGMENT STACK STA DB 100H DUP(?) TOP EQU LENGTH STA ;数据块长度为100H的符号名 STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK MAIN:
CLI ;令IF=0关闭中断 MOV AX,DATA MOV DS,
AX ;初始化DS
MOV AX, STACK MOV SS,
AX ;初始化SS
MOV SP, TOP MOV AL,
13H ; 8259A初始化,ICW1的内容 OUT 20H,
AL ; 单片, 边沿触发 MOV AL,
40H ; 中断类型号40H OUT 21H,
AL ;写入ICW2的口地址A=1 MOV AL,
01H ; 非自动结束
OUT 21H, AL
MOV AX, SEG
INT-P ; 设置中断向量 MOV DS,
AX ; 中断服务子程序入口段基址送DS MOV DX, OFFSET INT-P ;中断服务子程序入口偏移地址送DX MOV AL,
42H ; IR2的中断类型号42H送AL MOV AH,
25H ; 25H功能调用 INT 21H IN AL,
21H ; 读IMR(中断屏蔽寄存器) AND AL,
0FBH ; 允许IR2请求中断
OUT 21H,
AL ; 写中断屏蔽字OCW1 WAIT1:
STI ; 开PUSH AX PUSH DX
STI ; 开中断 MOV DS, AX
中断(令IF=1开中断)CMP
COUNT,0 ; 10次中断是否结束 JNZ
WAIT1 结束, 等待 MOV AX,
4C00H ; 返回DOS INT 21H INT-P
PROC 断服务子程序 PUSH
DS ; 护现场
判断 ; 未结束, ; 中保MOV DX, OFFSET MESS MOV AH, 09H INT 21H DEC
COUNT ; 控制10次循环 -1 JNZ NEXT IN AL,
21H ; 读IMR OR AL,
04H ; 屏蔽IR2请求
OUT 21H, AL NEXT:
CLI ; 关中断
MOV AL,
20H ; 写OCW2, 送中断结束命令EOI OUT 20H, AL POP
DX ; 恢复现场
POP AX POP DS
IRET ; 中断返回 INT-P ENDP CODE ENDS END MAIN
3.2 中断应用的高级语言编程 高级语言C51通过增加一个中断服务函数,来编写中断服务程序。中断服务函数的格式为[ 3 ] :函数类型函数名( [参数] ) interrup tm [ using n ]关键字interrup t后面的m是中断号,取值范围为0~31,编译器从8m +
3处产生中断向量。关键字using后面的n用来选择单片机中第n ( 0~3)个工作寄存器组。编程应注意:中断函数不能进行参数传递;中断函数没有返回值;中断函数只能由中断信号控制调用,而不能被其它函数调用。[ 4 ]与汇编语言编程有些相似,高级语言C51编写中断程序仅包括两个组成部分:
(1)中断初始化设置。包括设置优先级、打开中断等。(2)编写中断服务函数。中断服务函数指定了中断号,编译器会相应地自动生成中断向量,因此不再需要像汇编语言那样在中断源中断区入口地址放置转移指令。以笔者设计制作的一种新型多功能电脑时钟为例:
#include char csec = 0; / /百分之一秒char CurTime [ 3 ] = {59, 59, 23}; / /秒、分、小时
char LED[6 ] = {0, 0, 0, 0, 0, 0}; / /6个数码管的显示值 char LEDTAB [ ] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF};
/ /共阳极数码管段码表(0~9、熄灭码) ⋯⋯
void main ( void)
{ TMOD = 0x01; TH0 = 0xD8; TL0 = 0xF0;
EA = 1; ET0 = 1; TR0 = 1; / /中断初始化设置 while (1) { ⋯⋯ } }
/ /编写中断服务函数(定时中断0)
void TimeCount ( void) interrup t 1 using 1
{ TH0 = 0xD8; TL0 = 0xF0; csec + + ;
if ( csec = = 100) { csec = 0; CurTime[ 0 ] + + ; if (CurTime[ 0 ] = = 60) { CurTime[ 0 ] = 0; CurTime [ 1 ] + + ;
if (CurTime [ 1 ] = = 60) { CurTime[ 1 ] = 0; CurTime [ 2 ] + + ;
if (CurTime [ 2 ] = = 24) CurTime[ 2 ] = 0; } } } }
经实际编程调试分析, KeilC51 编译器对上面C51程序编译后,与下面的汇编语言程序生成的目 标代码文件基本相同: ORG 0000H LJMPMA IN
ORG 000BH LJMP TimeCount
ORG xxxxH / / xxxxH值由编译器指定
MA IN: MOV TMOD, #01H MOV TH0, #0D8H MOV TL0, #0F0H SETB EA SETB ET0 SETB TR0 ⋯⋯
ORG xxxxH / / xxxxH值由编译器指定
TimeCount: PUSH ACC / /保护现场 PUSH PSW MOV TH0, #0D8H MOV TL0, #0F0H ⋯⋯
POP PSW / /恢复现场 POP ACC RETI
END 4 结束语
理解透彻计算机中中断的工作和实现机制,对掌握中断技术在计算机领域中的应用非常重要,采用高级语言或者汇编语言来开发包括中断服务程序在内的整个计算机程序各有各的优缺点,若两者混合编程,则能更好的发挥计算机的控制功能,而中断技术的应用则会在计算机这方面占据着更大的权重。