对于有超线程的CPU环境来说,HLT指令只会使逻辑CPU进入HALT状态,而且对应的物理CPU保持Active,除非对该物理CPU对应的所有的逻辑CPU都执行HLT指令。
HLT是特权指令,只能在Ring 0执行。
Linux idle相关流程(3.10内核代码)
start_kernel
rest_init
cpu_startup_entry
cpu_idle_loop
arch_cpu_idle
x86_idle
default_idle
safe_halt
raw_safe_halt
arch_safe_halt
native_safe_halt
native_safe_halt()代码:
点击(此处)折叠或打开
-
static inline void native_safe_halt(void)
-
{
-
asm volatile("sti; hlt": : :"memory");
- }
那CPU进入HALT状态后,如何Resume呢?谁来将其唤醒?
答案是:中断(包括NMI和SMI),debug exception,BINIT# signal,INIT# signal,或者RESET# signal。
Linux中,通常在执行HLT指令进入HALT状态之前,都会执行STI指令开中断,所以,对于Linux来说,进入HALT状态后,通常是通过中断唤醒的,最可能的就是时钟中断了。