C- Linux内核 - 从其他模块调用函数时上下文开关



我很好奇,如果从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()

相关内容

  • 没有找到相关文章