Linux内核 - 从其他模块调用函数时的上下文切换?

时间:2017-03-10 14:36:09

标签: c linux module operating-system kernel

我很好奇如果从Linux内核中的另一个模块调用函数会触发上下文切换吗?

基本上,我正在做这样的事情。

说我有模块A:

uint64_t time;
int core;
int foo(){
   time = rdtsc();
   core = smp_processor_id();
   return time;
}
EXPORT_SYMBOL_GPL("foo");

模块B:

uint64_t time1, time2;
int bar(){
    time1 = rdtsc();
    time2 = foo();
    printk(KERN_INFO "Difference: %d\n", time2-time1);
}

在两次测量之间,我看到间隙高达2微秒(在划分TSC频率之后)。这种差距可能是由于上下文切换造成的吗?

1 个答案:

答案 0 :(得分:1)

不,这不会触发上下文切换。

加载linux模块时,它会动态地链接到内核中,类似于在启动动态链接程序时动态库(libc等)在内存中的链接方式。因此,对foo()的调用实际上只是对该函数地址的 jump 指令,该指令在模块加载时得到解决。

然而,现在的linux内核是抢占式,这意味着,即使当前进程在内核空间中,也可以抢占进程的执行,因此上下文切换到另一个进程是可能,但不应该确定性地重现。

时差可能是由于正常的代码执行,即对rdtsc()smp_processor_id()的调用。