gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:06 25 4
gpt4 key购买 nike

我很好奇从 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 频率之后)。这种差距可能是由于上下文切换造成的吗?

最佳答案

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

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

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

时间差异可能是正常代码执行造成的,即调用 rdtsc()smp_processor_id()

关于c - Linux内核 - 从其他模块调用函数时的上下文切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42720899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com