我应该设置什么配置值才能使 HZ 值 (jiffies) 物理上正确?

我应该设置什么配置值才能使 HZ 值 (jiffies) 物理上正确?

当构建linux内核镜像时,我们设置了值HZ。 linux内核有默认HZ值。它是内核运行的软件时钟频率,1/HZ (=jiffies)是调度程序间隔的单位。当然,这HZ应该来自真正的硬件定时器生成中断。所以我的问题是:我们可以HZ在构建内核映像时进行设置,但是我应该更改什么 CONFIG 值(特别是对于 arm64 情况)以应用生成此计时器中断的真实时钟频率?我认为应该有一个 CONFIG 值,因为某些 FPGA 板可以以较低的时钟频率运行,并且它取决于硬件设计。如果此配置值不正确,则 250MHz 将不是真正的 250MHz。我应该更改什么 CONFIG 值?

答案1

事情恰恰相反:中断率由系统根据 CONFIG_HZ 值进行编程。


HZ 是频率系统定时器硬件被编程为中断内核。

在臂弓上,ARM全局定时器用于该目的。它将根据比较器给出的结果触发中断。它的时钟由外设时钟但是,感谢定时器框架,那么就不需要(甚至没有附加值)它与任何 HZ 值同步。

答案2

你应该改变HZ,但如果你不想要 100Hz、250Hz、300Hz 或 1kHz,你就必须修补kernel/Kconfig.hz允许其他值。对于当前的内核配置,HZ是从HZ_100HZ_250HZ_300或派生的HZ_1000,手动指定任何其他值将导致您的构建要求选择这四个值之一。

答案3

是的,正如其他人回答的那样,定时器被编程为根据内核配置中的 HZ 值生成所需的中断(或更高分辨率)。但我的问题是如何传递计数器的实际时钟频率。例如,如果时钟频率为 25MHz,并且内核设置为 HZ_250,则时钟将被编程为每 100,000 个时钟触发一次(因为 25MHz/250Hz = 100,000)。但如果时钟频率为 20Mhz,则应将其编程为每 80,000 个时钟触发(到期并产生中断)。
我查看了内核源代码,发现如果设备树提供实际时钟频率(板与板或芯片与芯片不同),则内核使用 dtb(设备树 blob)(具有兼容性字符串的设备节点)给出的值“arm,armv8-timer”似乎是计数器)。否则,内核读取系统寄存器 cntfreq_el0 寄存器,我看到 u-boot 程序设置了 u-boot 程序设计者给出的值(在配置头文件中,因为它完全依赖于板)。 start_kernel() 中的 time_init() 函数似乎就是这样做的。在time_init()之前,有tick_init()和init_timers()函数用于注册定时器软中断。 (稍后计时器的实际设置?)我不太确定,但这似乎回答了我原来的问题。

相关内容