我很好奇,如果从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: %dn", time2-time1);
}
在这两个测量值之间,我看到的缝隙最多为2微秒(在TSC频率上分开后)。这个差距可以是由于上下文开关吗?
no,这不会触发上下文开关。
加载Linux模块时,它会动态链接到内核,与动态库(LIBC等)相似,当启动动态链接的程序时,内存中如何链接到内存中。因此,对foo()
的呼叫实际上只是跳跃指令该功能的地址,该功能已在模块加载上解决。
但是,如今的Linux内核是 preemptive ,这意味着即使该过程当前在内核空间中也可以抢占执行,因此上下文切换到另一个过程是可能的,但不应确定性地重现。
时间差可能是由于普通代码执行而导致的,即呼叫rdtsc()
和smp_processor_id()
。