在Hello China V1.75版本的实现中,并未对计算机的系统定时芯片(8253芯片)做特殊初始化,而是直接采用了BIOS的初始化工作方式,即周期定时方式,定时周期为55ms。这样的实现方式比较简单,省略了硬件初始化代码(实际上即使重新初始化,也不会超过10行汇编代码),且至今尚未发现不妥的地方。可能有的读者会认为系统中断周期太长,对操作系统的性能和实时性产生影响。作者对这个问题进行过比较长时间的思考,发现并非如此。具体分析过程请参考8.5.4节。
时钟中断的硬件中断向量(即系统时钟芯片连接的中断控制器8259的引脚号)为0,即中断控制器的第一个中断输入引脚。但在切换到保护模式后,x86 CPU把从0开始的32个连续中断向量保留为系统异常使用,硬件中断向量号是从32开始的。因此在切换到保护模式后,时钟中断的中断向量是32。即CPU会从IDT的第32个表项中,找到中断处理程序的入口地址,然后调用该中断处理程序。在初始化IDT的时候,第32个中断描述符的中断处理程序被填写为np_int20,这是一个汇编函数的入口标号,下面是该汇编函数的源代码(为了描述方便,源代码做了简单修改,主要是删除了部分注释及参数安全检查代码):
这就是时钟中断处理程序的汇编语言处理部分。这几行汇编语言的功能比较简单明了,无非是保存通用寄存器,然后调用通用中断处理函数(gl_general_int_handler)。需要注意的是,在调用通用中断处理函数前,首先把中断向量(这里为0x20,即十进制的32)压入堆栈,告诉通用中断处理函数,当前的中断向量是32,即系统时钟中断。(www.xing528.com)
本章曾解释过,gl_general_int_handler实际上是定义的一个4字节全局变量,并不是真正的通用中断处理函数本身。这个全局变量存储了通用中断处理函数的函数地址,这是在操作系统初始化的时候,由操作系统初始化代码填写进去的。通用中断处理函数是用C语言实现的,其代码比较简单,无非是进一步调用了DispatchInterrupt函数。DispatchInterrupt函数根据中断向量,索引全局中断对象表(参考8.3.1节),找到系统时钟中断对象,然后调用中断处理函数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。