这段代码在Linux内核中如何运行?

4
在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()函数在特定的处理器上禁用了中断,但它并没有停止其他处理器上的中断。因此,当其他处理器上发生任何中断时,该处理器将退出空闲状态。 - Rahul
你的意思是其他处理器向该处理器发出的中断(例如IPI)吗? - jaeyong
你能分享一下cpu_do_dle()代码的链接吗?只有在看过之后我才能说。但我确定它不是IPI,那是一个非常具体的概念。 - Rahul
我已经编辑了这个问题。 - jaeyong
1个回答

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接