基础2:中断处理

来源:互联网 发布:数据分析师认证考试 编辑:程序博客网 时间:2024/05/22 15:11

响应中断是操作系统最重要的任务之一,所以要写操作系统,就要知道如何设置中断处理程序,以及中断处理程序的编写。

x86CPU在实模式下,中断是通过中断向量表来转发的,这个中断向量表是固定在物理地址0 - 3FF处。大致来说,就是x86CPU可以处理256个中断,每个中断的中断处理程序用四个字节表示,因此总共占用1K个字节。具体的细节就不再这里写了。这里主要是讲怎么进行中断处理。

第一步:

设置硬件,也就是设置8259中断控制器。在目前这一步,先不用设置,直接采用DOS的设置。

第二步:

设置中断处理程序。也就是用自己编写的程序来替换原来的中断处理程序。为此,要编写一个设置用的程序,这个程序使用汇编语言。

;dword_tIvt_set(int id,dword_thandle)_Ivt_set:movbx, sppushdimovcx,[bx + 4];movdi,[bx + 6];movax,4movdx,[bx + 2];muldx;movbx,axpushespush0popesmovax,es:[bx    ]movdx,es:[bx + 2];climoves:[bx],cxmoves:[bx+2],distipopespopdiret


这个程序比较简单,关键就是在于更换了ES寄存器

第三步:

编写具体的中断处理程序。

这里用时钟中断作为例子,编写中断处理程序要注意保存寄存器,在完成中断处理后,在用保存的值恢复寄存器。中断处理程序一般都是用汇编语言编写

_Irq_clock:pushaxpushbxpushcxpushdxpushsipushdipushespushdspopesmoval,020h out020h,alcalldo_irq_clockpopespopdipopsipopdxpopcxpopbxpopaxiret

 

这里说明一下do_irq_clock,这是一个变量,里面保存有具体中断处理程序地址,这么做是为了方便的替换具体的处理程序。在需要替换中断处理程序时,用下面的程序

_Irq_clock_set:    movbx,sp;    movax,do_irq_clock;    movdx,[bx + 2];    movdo_irq_clock,dx    ret


 

到这里,中断处理的几步就完成了。测试一下,

测试代码如下

volatile static uint32_t    ticks = 0;void        Clk_msg(void){    char    msg[40];    sprintf(msg,"lenix ticks: %8ld",ticks);    Con_write_string(50,0,msg);}void        Clk_do_clock(void){    ticks++;        Clk_msg();    }void        Clk_initial(void){    word_t  tcs;    dword_t handle;    ticks = 0;        Irq_clock_set(Clk_do_clock);        asm{        mov ax,cs        mov tcs,ax    }        handle = ((dword_t)tcs) * 0x10000 | (word_t)Irq_clock;        Ivt_set(0x8,handle);    }void main(void){    Clk_initial();        for(;;);    }

 

这一段测试的主要在于程序执行后,进入死循环。由于时钟中断已经替换,因此在出现时钟中断时,就会在屏幕的右上角显示一个tick值,这个值记录了发生中断的次数。

运行截图: