内核中断及定时器实现剖析
定时器是Linux提供的一种定时服务的机制。它在某个特定的时间唤起某个进程,来做一些工作。Linux初始化时,init_IRQ()函数设定8253的定时周期为10ms(一个tick值)。同样,在初始化时red hat linux 下载,time_init()用setup_irq()设置时间中断向量irq0,中断服务程序为timer_interrupt。
在2.4版内核及较早的版本当中linux 内核 定时器,定时器的中断处理采用底半机制,底半处理函数的注册在start_kernel()函数中调用sechd_init()linux 内核 定时器,在这个函数中又调用init_bh(TIMER_BH,timer_bh)注册了定时器的底半处理函数。之后系统才调用time_init()来注册定时器的中断向量和中断处理函数。
在中断处理函数timer_interrupt()中,主要是调用do_timer()函数完成工作。do_timer()函数的主要功能就是调用mark_bh()形成软中断,此后处理器会在合适的时侯调用定时器底半处理函数timer_bh()。在timer_bh()中如何安装linux,实现了更新定时器的功能。2.4.23版的do_timer()函数代码如下(经过详尽):
voiddo_timer(structpt_regs*regs)
(*(unsignedlong*)&jiffies)++;
update_process_times(user_mode(regs));
mark_bh(TIMER_BH);
而在内核2.6版本之后,定时器中断处理采用了软中断机制而不是底半机制。时钟中断处理函数依然为timer_interrup()->do_timer_interrupt()->do_timer_interrupt_hoo