内容:----------1. CPUFreq 核心原理和接口2. CPUFreq 通知者
1. 概述========================CPUFreq core代码位置在 drivers/cpufreq/cpufreq.c中。这份cpufreq代码给CPUFreq的驱动框架cpufreq_driver(真正的频率改变代码,硬件相关)提供了一个与硬件无关的标准的接口,notifiers也是如此,遵照这套硬件无关的标准接口。诸如策略的改变(例如ACPI高级电源管理的温度感应模块)或所有的频率改变、甚至强制限速(就像在arm上的LCD驱动),都会通知给设备驱动或者其他内核模块。另外,频率的改变会使得内核所谓的常量"loops_per_jiffy"更新。
cpufreq_get_cpu和cpufreq_put_cpu两个方法将确保cpufreq处理器驱动被正确的注册给内核,并且直到cpufreq_put_cpu被调用,否则不会被卸载,cpufreq_get_cpu和cpufreq_put_cpu两个方法的调用带有引用计数。
2. CPUFreq notifiers (CPU频率通知者)========================CPUFreq notifiers 遵照了标准的内核通知接口,标准通知接口 详情查看linux/include/linux/notifier.h
我们有两中不同的CPUFreq notifiers, 包括 策略通知器(policynotifiers)和变化通知器(transition notifiers)。
2.1 CPUFreq policy notifiers (CPU频率策略通知器)--------------------------------------------------------
当一个新的策略(Policy)将要被设置的时候, CPUFreq policynotifiers会被通知,一个策略的改变将调用CPUFreq policy notifier回调链上的回调3次,分别用以下事件参数:
1.)当CPUFREQ_ADJUST(CPU频率校准过程)时,所有被通知者可以根据需要改变Policy的限制,例如关系到CPU热量温度的问题或是某些硬件相关的限制,会按照需要去改变。
2.)当CPUFREQ_INCOMPATIBLE(CPU频率冲突)时,为了防止硬件故障,而必须改变Policy限制。
3.)当CPUFREQ_NOTIFY(CPU频率通知)时,这个新的策略会通知给所有被通知者。如果在这个阶段,两个硬件驱动未能对新策略达成一致,那么冲突的硬件将被关闭,用户会收到对应的通知。
上述的宏所定义的过程,作为notifier的第二个参数给入。
第三个参数是一个 void*指针,指向一个结构体:cpufreq_policy,cpufreq_policy由5个成员组成:
cpufreq_policy{cpu,min,max,policy,max_cpu_freq}
min,max:新策略的CPU最低,最高频率(kHz)policy: 新策略cpu:有效CPU数max_cpu_freq:cpu的最大支持频率(只是提供信息)
2.2 CPUFreq transition notifiers (CPU频率改变通知器)-------------------------------------------------------------
当CPUFreq驱动调整当前CPU核的频率,并且此调整会带来任何对外界的影响的时候,会通知两次被通知者。
第二个参数声明过程类型:CPUFREQ_PRECHANGE 调整前CPUFREQ_POSTCHANGE 调整后
第三个参数是结构体:cpufreq_freqs 包括成员:{cpu: 有效CPU数old: 旧频率new:新频率}
当系统处于暂停状态(suspended)而调整CPU频率,如果cpufreq core(drivers/cpufreq/cpufreq.c) 检测到频率改变,会通知被通知者,第二个参数被设置为:CPUFREQ_RESUMECHANGE
![Linux内核的CPU频率 linux内核cpu个数](http://img.aihuau.com/images/02111102/02041224t01c3631f25870d42bd.jpg)