Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1212019
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-08-29 11:21:00

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状态后,通常是通过中断唤醒的,最可能的就是时钟中断了。

阅读(24712) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~