2012-10-03 77 views
1

我想了解处理器产生内核代码的机会并执行维护和调节工作时的中断机制。我所知道的是定时器中断为操作系统提供了这个功能。scheduler_tick - 从Linux在哪里调用?

1)我想知道什么是相关的中断号,以及在Linux中调用的第一个OS例程。如果我知道这个文件和函数的名字会很好。

在Linux的情况下,scheduler_tick是为调度新任务而调用的内核函数,但未知的是谁调用了scheduler_tick及其父项?

2)是否还有其他中断以及在Linux中调用scheduler_tick?他们有哪些,如果有的话?

/* 
    This function gets called by the timer code, with HZ frequency. 
    We call it with interrupts disabled. 
*/ 

void scheduler_tick(void) 
{ 
     int cpu = smp_processor_id(); 
     struct rq *rq = cpu_rq(cpu); 
     struct task_struct *curr = rq->curr; 
....... 
+0

也许来自定时器中断?我不确定。 :) – Raj

+1

是的,它是从计时器中断 - 但是,是唯一的来源?我看到它被多个函数调用,但不知道根是否只有定时器中断。 –

回答

6

这很简单,当你有机会获得交叉引用(X-REF)源代码浏览器来回答。

点击这里:http://lxr.linux.no/#linux+v3.6.3/kernel/sched/core.c#L3214获得一个Linux Kernel在线x-ref项目。 (这一个不会x-ref汇编代码。)

此链接转到scheduler_tick函数定义。点击函数名称,然后在右侧的新面板中选择“函数原型或声明”行后面的“使用...”链接。过了一段时间,其中提到该功能的所有代码都会被列出:

include/linux/sched.h, line 309 << declaration 
kernel/sched/core.c, line 3214 << definition 
kernel/timer.c, line 1373  << calling 

所以,timer.c中:1373 http://lxr.linux.no/#linux+v3.6.3/kernel/timer.c#L1373update_process_times功能的一部分:

1355 /* 
1356 * Called from the timer interrupt handler to charge one tick to the current 
1357 * process. user_tick is 1 if the tick is user time, 0 for system. 
1358 */ 
1359 void update_process_times(int user_tick) 

此功能从定时器中断处理程序只可赎回;它应该在每次打勾时被调用。

重复交叉引用搜索update_process_times拿到名单的过程:

References: 
arch/alpha/kernel/smp.c, line 520 
arch/arm/kernel/time.c, line 108 
arch/cris/arch-v10/kernel/time.c, line 171 
arch/cris/arch-v32/kernel/time.c, line 206 
arch/h8300/kernel/time.c, line 40 
arch/ia64/kernel/time.c, line 184 
arch/m68k/kernel/time.c, line 38 
arch/parisc/kernel/time.c, line 163 
include/linux/sched.h, line 308 
kernel/time/tick-sched.c, line 683 
kernel/time/tick-sched.c, line 841 

相关的中断号

中断号是(有时他们在启动时即使分配依赖于平台)。你没有说你是什么平台,感兴趣的

2)是否有任何其他的中断,以及其称之为scheduler_tick在Linux呢?他们有哪些,如果有的话?

有几个定时器的实现,包括hrtimers(高分辨率定时器,这可能不同于通常的系统定时器)。每个实现可能使用不同的中断。