【问题标题】:How can this code work out in Linux kernel?这段代码如何在 Linux 内核中运行?
【发布时间】:2014-04-08 13:07:23
【问题描述】:

在linux内核中,文件arch/arm/mach-exynos/cpuidle.c中有如下代码:

    local_irq_disable();

    cpu_do_idle();

    local_irq_enable();

cpu_do_idle 在哪里

    dsb         
    wfi
    mov     pc, lr

在cpu_do_idle 中,它执行代表等待中断的'wfi' 命令。 但是,我不明白的是它在禁用irq后进入cpu_do_idle。 这是怎么发生的?

【问题讨论】:

  • local_irq_disable() 禁用该特定处理器上的中断,但它不会停止其他处理器上的中断。因此,当其他处理器发生任何中断时,cpu 将退出空闲状态。
  • 你的意思是从其他处理器到这个处理器的中断(如IPI)?
  • 你能分享cpu_do_dle()代码的链接吗,之后我只能说。但我确信这不是 IPI,这是一个非常具体的概念。
  • 我已经编辑了问题

标签: linux-kernel interrupt


【解决方案1】:

WFI 等待硬件中断,不管 CPU 当前的中断处理状态如何。当 CPU 被唤醒时,它有机会重新启用中断并处理任何挂起的中断:

WFI 暂停执行,直到发生以下事件之一:

  • IRQ 中断,与 CPSR I 位无关

  • FIQ 中断,与 CPSR F 位无关

  • 不精确的数据中止,除非被 CPSR A 位屏蔽

  • 一个调试入口请求,无论是否启用调试。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/CIHEGBBF.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多