【问题标题】:what does calibrate_delay function on system bootcalibrate_delay 在系统启动时起什么作用
【发布时间】:2020-05-20 22:50:07
【问题描述】:

来自http://www.embeddedlinux.org.cn/essentiallinuxdevicedrivers/final/ch02lev1sec1.html

它说

在启动过程中,内核计算处理器的次数 可以在一瞬间执行一个内部延迟循环,这是时间 系统计时器的两个连续滴答之间的间隔。

从《Understanding Linux Kernel》一书中说

内核执行 calibrate_delay() 函数,它决定如何 许多“循环”适合一个刻度

我对 jiffie 和 loops_per_jiffie 感到困惑。我们已经可以从 CONFIG_HZ 中知道分辨率。例如,如果 CONFIG_HZ 为 250,则意味着一个 jiffie 增量将花费 1/250 = 4 ms

谁能解释一下这个 calibrate_delay() 它实际计算的是什么?

【问题讨论】:

  • will cost 1/250 = 4 ms - 是的,但是 CPU 在这 4 毫秒内会执行多少条指令? 1000条指令? 100000条指令?您必须知道,要在 ndelay 之类的函数中实现测量。
  • 那么,loops_per_jiffie 是每个 jiffie 的指令数?
  • 我认为每个 jiffie 有数百万条指令。
  • 所以,假设我想要 1 微秒延迟,我如何使用这个 loops_per_jiffie 值

标签: linux time linux-kernel linux-device-driver timing


【解决方案1】:

calibrate_delay() 函数以粗略的方式测量 CPU 每秒可以执行多少条指令。该函数在wiki about BogoMIPS 中也有说明,该函数的结果是著名的 BogoMIPS 的数量。该函数的来源是in init/calibrate.c

查看pr_cont(...)源中的电话我猜:

1 loops_per_jiffy / (500000/HZ) = 1 BigoMOPS

也就是说:

1 loops_per_jiffy = 500000 / HZ BigoMOPS

所以loops_per_jiffy 看起来就像一瞬间就有 5000 亿条指令。

说我想要 1 微秒的延迟,我该如何使用这个 loops_per_jiffie 值

阅读源代码。它适用于各种架构,例如。 udelay() in x86/lib/delay.c 函数或 udelay() for mips。它看起来在等待number_of_useconds_to_wait * loops_per_jiffy / 1000000 * 4 * HZ [+ 1] 循环(或类似的东西)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2021-05-29
    相关资源
    最近更新 更多