linux0.11的中断是如何设置的,以及时钟中断的执..
时间:2007-04-10 来源:pywj777
1. linux0.11的中断是如何设置的,以及时钟中断的执行过程?
(1) 答:CPU指令的执行频率是由CPU的主频决定的,而系统的时钟周期(或系统时钟嘀嗒)是一个可编程时钟计数器决定的,系统将它设定为每隔一定时间(linux0.11设定为10ms)发出一个时钟中断请求信号,因此每经过一个时钟嘀嗒时间,系统就会调用一次时钟中断处理程序timer_interrupt。80x86CPU为了有助于处理异常和中断,每个需要被处理器进行特殊处理的处理器定义的异常和中断条件都被赋予了一个标识号,称为向量。处理器把赋予异常或中断的向量用作中断描述符表IDT中的一个索引号,来定位一个异常或中断的处理程序入口点位置。中断描述符表IDT的位置由寄存器IDTR确定,其值是在head.S中被确定的,并将所有的中断描述符项设定指向ignore_int中断处理程序,内核会在随后的初始化过程中替换安装那些真正实用的中断描述符项。时钟中断在sched_init()中被设置为timer_interrupt。
(2) timer_interrupt()时钟中断处理过程。当进入时钟中断处理过程时,它先保存进入时的现场环境,然后将ds、es设置内核数据段。cs已在进入中断时被中断门设为内核代码段了,这时它在内核态执行。它首先将全局变量jiffies加1,然后用当前特权级作为参数调用do_timer()函数,当调用返回时转去检测并处理信号,然后退出中断。
(3) do_timer()时钟中断处理程序。首先如果当前特权级CPL=0,则将内核代码运行时间stime增1,如果CPL>0,则将用户程序运行时间utime增1。其次,如果有定时器存在,则将链表第一个定时器减1,如果等于0,则调用相应的处理程序,并将该处理程序指针置位空,然后去掉该项定时器。最后,检查当前进程,如果执行时间片用完,并且不在内核态下,则进行任务切换。
(4) 上面谈到的定时器链表是由add_timer()函数添加的,最多可有64个定时器,仅供内核使用。链表是按定时值从小到大排序,在排序时减去前面需要的嘀嗒数,这样在处理定时器时只要查看链表头的第一项的定时是否到期即可。