我很好奇如果从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频率之后)。这种差距可能是由于上下文切换造成的吗?
答案 0 :(得分:1)
不,这不会触发上下文切换。
加载linux模块时,它会动态地链接到内核中,类似于在启动动态链接程序时动态库(libc等)在内存中的链接方式。因此,对foo()
的调用实际上只是对该函数地址的 jump 指令,该指令在模块加载时得到解决。
然而,现在的linux内核是抢占式,这意味着,即使当前进程在内核空间中,也可以抢占进程的执行,因此上下文切换到另一个进程是可能,但不应该确定性地重现。
时差可能是由于正常的代码执行,即对rdtsc()
和smp_processor_id()
的调用。