Linux内核空闲循环

时间:2012-12-06 17:49:59

标签: linux kernel arm cpu python-idle

在linux内核空闲循环中,对于很多架构(SH,ARM,X86等... afaik)有以下几行:

if(cpuidle_idle_call())
    pm_idle();

我怀疑:

至少对于ARM,默认的pm_idle函数由WFI(等待中断)指令组成,但令人困惑的部分是,中断被禁用然后在WFI指令执行后被启用,CPU如何从WFI恢复在线状态当中断被禁用时?

我尝试在不同版本的linux中搜索我的答案,但相关代码自2.6.32(我提到的最后一个版本)以来没有变化,所以我更有可能错过了一些东西。

2 个答案:

答案 0 :(得分:3)

即使禁用了中断,WFI也会唤醒,但在中断再次启用之前,ARM内核不会收到中断。

答案 1 :(得分:2)

cpuidle_idle_call()返回“错误”有几个原因。

  1. 没有为CPU安装cpuidle驱动程序。
  2. cpuidle已停用
  3. 无法初始化驱动程序
  4. 失踪的司机是最有可能发生的事情。但在这种情况下,内核仍然需要以某种方式刻录循环。因此它调用pm_idle,默认情况下,它会映射到default_idle。内核检查cpu是否注册了arm_pm_idle,可以认为它是一个轻量级的cpuidle驱动程序。如果全部失败,它将回退到cpu_idle,这将被实现,并且大部分时间都会耗尽写入缓冲区并进入WFI模式。

    整个事情中有很多冗余,但是这允许开发人员编写简单的空闲驱动程序,并在必要时将它们变成完整的cpuidle驱动程序。

    事实是不同的SoC提供不同的功能。例如,在kirkwood上,空闲驱动程序将DDR设置为自刷新模式,然后切换到wfi模式以保护某些功率。从理论上讲,它也可以扩展为将CPU切换到更慢的时钟。

    换个问题。禁用中断只会阻止cpu触发中断处理程序,它仍然需要注册发生中断,否则可能会丢失数据。因此处理程序被禁用,但传入的中断仍然会触发WFI的唤醒功能。

相关问题