基础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值,这个值记录了发生中断的次数。
运行截图:
- 基础2:中断处理
- 中断处理基础(二) 处理过程
- 中断处理基础(一) 物理结构
- 嵌入式基础之中断处理用法
- ARM基础学习-异常中断处理
- ARM基础学习-SWI异常中断处理
- STM32的中断处理2
- Linux中断处理体系结构2
- 中断和中断处理
- 中断处理--串口中断
- 中断及中断处理
- 中断和中断处理
- 中断和中断处理
- 中断处理
- 中断处理
- 中断处理
- 中断处理
- 中断处理
- php global 使用方法
- web.config文件中配置access
- Juqery 异步请求(转载)
- Struts中两种取值方法
- 航班管家获得1500万美元B轮融资
- 基础2:中断处理
- 使flash至于其它div的最底层
- wxPython_ 事件驱动
- 设计模式 --- singleton
- 这里不再更新
- 二、八、十、十六进制的转换
- oracle学习记录之十七
- 对ArrayList中某一元素进行排序
- 电脑控制手机的另一选择——android vnc server