X86 HLT指令相关

25430阅读 0评论2014-08-29 humjb_1983
分类:LINUX

X86架构中,HLT指令用于使CPU进入HALT状态,在Linux的进程调度模块中,当某CPU处于idle状态时,可能会执行HLT命令使其进入HALT状态,目的显而易见,是为了节能。CPU的HALT状态,在APCI规范中,对应于CPU的C1状态,属于CPU睡眠状态中的最低级别,即最浅的睡眠。
对于有超线程的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()代码:

点击(此处)折叠或打开

  1. static inline void native_safe_halt(void)
  2. {
  3.     asm volatile("sti; hlt": : :"memory");
  4. }

那CPU进入HALT状态后,如何Resume呢?谁来将其唤醒?
答案是:中断(包括NMI和SMI),debug exception,BINIT# signal,INIT# signal,或者RESET# signal
Linux中,通常在执行HLT指令进入HALT状态之前,都会执行STI指令开中断,所以,对于Linux来说,进入HALT状态后,通常是通过中断唤醒的,最可能的就是时钟中断了。

上一篇:Crash工具实战-结构体解析(skb相关解析)
下一篇:kernel 3.10内核源码分析--Sysrq处理流程、键盘驱动、input子系统相关