Linux kernel 谁在Linux上调用delay_tsc()

Linux kernel 谁在Linux上调用delay_tsc(),linux-kernel,Linux Kernel,我使用OProfile来分析我的Linux机器。在分析过程中,我发现除了“native\u safe\u halt”函数外,“”是第二个消耗cpu周期的函数(大约10%)。似乎delay\u tsc()是一个繁忙的循环。但是谁调用它,它的函数是什么?没有人直接调用它,因为它是链接到的源代码中的一个局部函数。调用它的方法是使用已发布的\u delay()函数 调用\u delay()时,将使用delay\u fn函数指针(也是该文件的本地指针)从几个延迟函数中选择一个。默认情况下,选择的是dela

我使用OProfile来分析我的Linux机器。在分析过程中,我发现除了“
native\u safe\u halt
”函数外,“”是第二个消耗cpu周期的函数(大约10%)。似乎
delay\u tsc()
是一个繁忙的循环。但是谁调用它,它的函数是什么?

没有人直接调用它,因为它是链接到的源代码中的一个局部函数。调用它的方法是使用已发布的
\u delay()
函数

调用
\u delay()
时,将使用
delay\u fn
函数指针(也是该文件的本地指针)从几个延迟函数中选择一个。默认情况下,选择的是
delay\u loop()
,它使用x86指令尝试并标记时间

但是,如果调用了
use\u tsc\u delay()
(在启动时),它会将函数指针切换到
delay\u tsc()
,它使用时间戳计数器(CPU计数器)来标记时间

任何需要合理可靠、高分辨率延迟函数的内核代码都会调用它。您可以看到内核中引用
\uu delay
的所有代码(很多地方)

我认为,在分析方面,忽略在该函数中花费的时间可能是相当安全的,因为它的目的是延迟。换句话说,花很长时间执行的工作是没有用的——如果呼叫者不想延迟,他们就不会调用它

该清单中的一些例子:

  • 看门狗定时器使用它来调整内核的速度,从而通过延迟当前内核ID的倍数,使它们的输出不会相互混淆
  • ATI帧缓冲区驱动程序似乎将其用于硬件低级访问之间的延迟。事实上,在许多设备驱动程序中,它已经被大量用于此目的
  • 它在启动期间用于计算jiffies和实际硬件速度之间的关系