并创建一个名为init的进程(pid=1),当init进程创建完后,cpu的idle进程处于cpu_idle_loop()无限循环中,当没有其他进程处于TASK_RUNNING状态时候,调度器才会执行cpu idle线程,让cpu进入idle模式.其函数调用关系简要概括如下:
"enter"函数会在进入该休眠态时被callback,enter()中的index,指明即将进入的休眠态的编号(定义在"/drivers/cpuidle/cpuidle.c")。 再来从横向的角度看一下。将一个CPU中和实现idle功能相关的部分抽离出来,就形成了"cpuidle_device",可理解为一种虚拟设备吧。 DEFINE_PER_CPU(struct cpuidle_device, cpuidle_...
cpu idle驱动用于管理实际的cpu idle状态,它主要包含一个该驱动支持的cpu idle状态数组,以及一些其它配置参数。以下为其定义: struct cpuidle_driver { const char *name; struct module *owner; unsigned int bctimer:1; (1) struct cpuidle_state states[CPUIDLE_STATE_MAX]; (2) int state_count; (3) ...
cpuidle core的代码主要包括:cpuidle.c、driver.c、governor.c、sysfs.c。 cpuidle core负责实现cpuidle framework的整体框架,主要功能包括: 根据cpuidle的应用场景,抽象出cpuidle device、cpuidle driver、cpuidle governor三个实体; 以函数调用的形式,向上层sched模块提供接口; 以sysfs的形式,向用户空间提供接口; ...
cpuidle_idle_call(); } /* [Note: Switchtoa different task. We willreturntothisloopwhenthe idle taskisagain selectedtorun.] */ schedule_preempt_disabled(); } 如果没有其他任务,就执行 idle。从累积时间来说,idle 函数可能是人类历史上执行时间最长的函数。 [2]...
int(*enter_dead) (struct cpuidle_device *dev,intindex); ... }; 对应的注册接口是 cpuidle_register_driver。 cpuidle_governor governor 结构主要提供不同的回调函数,最终由 menu_governor 填充,主要字段如下: structcpuidle_governor{ charname[CPUIDLE_NAME_LEN]; struct...
//进入该state的回调函数 int(*enter)(structcpuidle_device*dev, structcpuidle_driver*drv, intindex); //CPU长时间不需要工作时(称作offline),可调用该回调函数。 int(*enter_dead)(structcpuidle_device*dev,intindex); ... }; 对应的注册接口是 cpuidle_register_driver。 cpuidle...
idle();schedule();...} 内核初始化后,所有core都会进入该函数。`pm_idle`为电源管理idle函数不讨论。所以使用`default_idle`。define safe_halt() __asm__ __volatile__("sti; hlt": : :"memory")进入`default_idle`后,会执行hlt, 也就是硬件停机,处于该状态时cpu不能执行任何指令,...
int(*enter_dead)(struct cpuidle_device*dev,int index);...}; 对应的注册接口是 cpuidle_register_driver。 cpuidle_governor governor 结构主要提供不同的回调函数,最终由 menu_governor 填充,主要字段如下: struct cpuidle_governor{char name[CPUIDLE_NAME_LEN];struct list_head governor_list;//governor...