您的位置:首页 > 编程语言

保护模式下8259A芯片编程及中断处理探究(下)【4】

2013-04-25 15:10 225 查看
这里我们需要了解这样一个问题。中断服务程序是由CPU直接调用的,随后,它使用iret指令返回,而不像一般的c/c++函数由ret返回。c/c++的编译器在处理c/c++语言的函数的时候,会在这个函数的开头与结尾加上很多栈操作,以支持程序调用,比如上边的代码就有可能被c/c++编译器处理成如下形式:(其中绿色为编译器自行加上的代码)

pusha

pushad

/* do something */

popad

iret

popa

ret

请注意这样一个实事,当程序运行到iret时就返回了,而随后的popa就不会被执行,因此这样就破坏了堆栈,于是,我们就只能通过汇编语言编写中断处理程序。

现在再来看看pyos中用汇编语言写的中断处理程序,首先它用pushad指令把寄存器中的内容压入堆栈,这常常称之为保护现场,因为之后程序需要返回被中断的程序中继续运行,因此这些寄存器中的内容也必须在中断处理程序结束时恢复。保护现场完了之后,它调用了一个c++语言程序pyos_interrupt_handle_for_default(),随后,它发送了EOI消息通知8259A中断处理完成(关于EOI消息,在“上篇”中有详细描述),然后,它弹出原先保存在堆栈中的寄存器的内容,这常常称为恢复现场,最后通过iret返回被中断的程序处继续执行。

晕!原来pyos_asm_interrupt_handle_for_default()只是一个汇编的壳,而真正的处理函数是pyos_interrupt_handle_for_default()!怪不得它会在名字中多个“asm”呢?:)。

下面,我们就来看看真正的中断处理程序做了什么:

extern "C" void pyos_interrupt_handle_for_default()

{

/* 处理中断 */

/* 读 0x60 端口,获得键盘扫描码 */

char ch = class_pyos_System::FromPort( 0x60 ) ;

/* 显示键盘扫描码 */

class_pyos_Video::PrintMessage( ch ) ;

}

这才是真正的中断处理程序,不过它的内容很简单,就是读键盘的0x60端口,获得键盘的扫描码,然后显示这个扫描码。是不是很简单?:)

3.5 class_pyos_Interrupt::Init()的最后工作

现在让我们重新回到中断类的初始化程序Init()中吧。Init()在完成了8259A及中断描述符表的初始化工作之后,它的工作就也近尾声了。随后,它调用了下面一个程序:

/* 许可键盘中断 */

class_pyos_System::ToPort( 0x21 , 0xfd ) ;

这是向8259A发送中断屏蔽字,十六进制fd所对应的二进制为1111 1101,在“上篇”中我们知道了1代表屏蔽,而0代表不屏蔽,因此fd就表示屏蔽了IRQ0、IRQ2~IRQ7,而唯IRQ1没有屏蔽。通过“上篇”我们知道IRQ1是代表的键盘中断,因此这一语句的意思就是屏蔽掉除键盘中断之外的所有中断,也即:只响应键盘中断。最后,程序用sti汇编指令打开了CPU的中断请求功能。

3.6 实验结果

想想我们前面所描述的代码,你现在应当知道了本实验最后所应达到的一个实验结果:pyos起动后,会响应键盘中断,而中断服务程序的功能是输出键盘的扫描码,也就是说如果你敲击键盘的话,你可以看见计算机的屏蔽上输出键盘的扫描码。下面我们就来看看我们的实验是否达到了程序所预期的效果。下面,我们在Virtual PC中启动我们自己的操作系统——pyos:)

我们可以看见,现在pyos已经启动了,现在让我们随便敲击一下键盘:

呵呵,屏幕上出现了方才敲键的扫描码。看来我们程序的目的的确是达到了,不过怎么有两个字符呢?再敲一次试试:)

呵呵,又出来两个字符,看来的确是按一个键发生了两次键盘中断,为什么会这样呢?这个问题留到下一篇再解决吧。:)

3.7 实验的改进

pyos是 一个实验系统,开发他的目的就是为了做实验,检验所学,因此,你完全可以用它来进行实验。比如,你可以少屏蔽两个中断,为每个中断指定不同的中断服务程 序,以观察多重中断是怎样工作的,中断屏蔽又是怎样起作用的。你还可以用“上篇”所介绍的方法,改变不同中断的优先级,看看中断优先级又是怎样工作的。本 实验中的“中断”二字还体现得不明显,但你马上就可以改改,比如在主程序中,不要让它空循环,把原来:

for( ;; ) ;

改成:

for( ;; ){

class_pyos_Video( ‘0’ ) ;

}
然后,你再敲击键盘,你就会体会到“中断”二字的含义。可以完成的实验很多,只要你愿意去做,也非常欢迎你能来信与笔者交流。:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: