【问题标题】:Linux kernel idle loopLinux内核空闲循环
【发布时间】:2012-12-06 17:49:58
【问题描述】:

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

if(cpuidle_idle_call())
    pm_idle();

我的疑问:

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

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

【问题讨论】:

    标签: linux kernel arm cpu python-idle


    【解决方案1】:

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

    【讨论】:

    • 啊,谢谢。但是对第一个有任何想法吗?仍然无法弄清楚为什么他们在那里有如此虚假的陈述。
    【解决方案2】:

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

    1. 没有为 CPU 安装 cpuidle 驱动程序。
    2. cpuidle 被禁用
    3. 驱动程序无法初始化

    最有可能发生的事情是缺少驱动程序。但是在这种情况下,内核仍然必须以某种方式燃烧循环。所以它调用了 pm_idle,它在 arm 上默认映射到 default_idle。内核在那里检查 cpu 是否注册了 arm_pm_idle,可以将其视为轻量级 cpuidle 驱动程序。如果一切都失败了,它将回退到 cpu_idle,这必须实现,并且大部分时间会耗尽写入缓冲区并进入 WFI 模式。

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

    问题在于不同的 SoC 提供不同的功能。例如,在 kirkwood 上,空闲驱动程序会将 DDR 设置为自刷新模式,然后再切换到 wfi 模式以保护一些电源。理论上它也可以扩展为将 cpu 切换到较慢的时钟。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 2016-05-25
      相关资源
      最近更新 更多