本文部分内容参考
Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客,
https://www.cnblogs.com/hellokitty2/p/15600099.html
特此致谢!
Thermal,中文意思是热的、保暖的。在Linux内核中,Thermal特指一套关于温控机制的驱动框架。也就是说,Linux Thermal框架是Linux系统下温度控制相关的一套架构,主要用来解决随着设备性能不断增强而引起的日益严重的发热问题,控制系统运行过程中各个器件所产生的热量,使设备温度维持在一个安全、舒适的范围,防止SoC 等硬件芯片也会因过热而造成系统不稳定甚至缩减芯片寿命。
Thermal框架是在软件层面上对自然界散热系统的抽象。以日常生活中的温控设备——空调为例,试想一下空调的工作机制及整个温控过程:
(0)假设场景是夏天,某人刚回到家,当前室内温度是35度,用户赶紧打开空调并设定目标温度为25度;
(1)对房间降温首先要知道房间里当前温度是多少,这个工作需要温度传感器来完成。温度传感器探知室内温度;
(2)温度传感器将当前温度传给空调内部的MCU(姑且认为空调的控制系统是由一颗内嵌的MCU来完成的);
(3)MCU得知当前温差是10度,比较大,因此加大功率,让房间迅速降温(我们知道空调内部的降温设备是雪种);
(4)一段时间后,室温降至28度(此时温度传感器重复步骤(1)和(2))。此时MCU开始减小功率,降温速度开始趋缓,直至稳定在 25 度。
当然,空调实际的工作方式不一定和上面描述的一模一样,但是基本原理是这样。我们试图通过空调的例子抽取温控系统的必要组件,然后过渡到Linux内核中的Thermal 框架:
(1)既然要控制房间温度,当然要能知道房间当前的温度,这个必要组件就是温度传感器。
(2)降温或者升温,需要实际的设备来支撑,这个必要组件就是雪种。
(3)温差大,加大功率以便迅速降温;温差小,降低功率省电。这个必要组件就是温控策略,或者叫温控算法。
(4)整个温控系统需要有一个类似大脑的设备来统筹管理,这个必要组件就是MCU。
类比到Thermal框架(主要考虑CPU/GPU的温控),其必要组件和上面空调的例子十分相似:
(1)Thermal sensor driver:SoC内部CPU和GPU的旁边通常会有用于获取它们温度的传感器,比如 tsadc(Temperature Sensor ADC)。
(2)Thermal cooling device:降温设备,比如风扇。这里有点特殊的是,CPU和GPU不仅是发热设备(即需要实施温控策略的设备),也可以是降温设备。当我们降低CPU/GPU的运行频率的时候,它们就在充当降温设备(降低产热量即是在降温)。
(3)Thermal governer:温控策略,Linux内核中的温控策略要比上面的空调控制精细得多,而且也提供了多种策略。
(4)Thermal core:组织并管理上面三个组件,并通过sysfs和用户空间交互。
归纳一下:核心为thermal_core;可以获取温度的设备抽象为thermal_zone_device,如Temp Sensor、NTC(板上的热敏电阻)等;控制温度的设备抽象为thermal_cooling_device,如风扇、CPU、DDR、GPU等;温控策略抽象为thermal_governor,如step_wise、bang_bang等。
铺垫了这么多内容,到了正式引出主角——Thrermal框架的时候了。
一、框架结构
Thermal框架由core、governor、zone、cooling device以及sensor driver组成。
Thermal整体框架结构如下图所示:
各个模块之间关系如下:
thermal_cooling_device对应系统实施冷却措施的驱动,是温控的执行者。cooling device维护一个cooling等级,即state。一般state越高即系统的冷却需求越高。cooling device根据不同等级的冷却需求进行冷却行为。
cooling device只根据state进行冷却操作,是实施者;结构struct cpufreq_cooling_device和struct devfreq_cooling_device作为对thermal_cooling_device的扩展,分别主要在cpufreq_cooling.c和devfreq_cooling.c中使用;而state的计算由thermal governor完成;thermal_instance结构体描述trip point与cooling device的绑定关系,即当trip point触发后由哪个cooling device去实施冷却措施。每个trip point必须与一个cooling device绑定,才有实际意义。
一个Thermal Zone可以有多个Cooling设备;同时还提供一个核心函数thermal_zone_device_update作为 Thermal 中断处理函数和轮询函数,轮询时间会根据不同Trip Delay调节。
模块之间的代码流程图如下:
基于系统层次的框架结构如下图所示:
- thermal core
thermal主要的程序,驱动初始化程序,维系thermal zone、governor、cooling device三者的关系,并通过 sysfs 和用户空间交互。
- thermal govnernor
温度控制算法(温控策略)。解决温控发生时(即throttle),cooling device如何选择cooling state的问题。
Linux内核中提供了多种温控策略,如下:
- step_wise
- power_allocator
- user_space
- fair_share
- bang_bang
可见,Linux内核的温控策略是比较精细的。
- thermal cooling device
系统温控的执行者,实施冷却措施的驱动(cpufreq_cooling、cpuidle_cooling、 devfreq_cooling等)。通俗地讲,就是降温设备,如风扇。cooling device根据governor计算出来的state,实施冷却操作,一般情况下,state越高表示系统的冷却需求越高。cooling device需要与trip point进行绑定,当 trip point 触发后,由相应的cooling device 去实施冷却措施。
这里有一点需要特别说明:CPU和GPU(当然,也包括其它类似设备)不仅是发热设备(即需要实施温控策略的设备),也可以是降温设备,当我们降低CPU/GPU的运行频率的时候,它们就在充当降温设备。降低产热量即是在降温。
- thermal zone device
创建thermal zone结点和连接thermal sensor,在/sys/class/thermal/目录下的thermal_zone*,通过dtsi文件进行配置生成。thermal sensor是温度传感器(即热敏电阻NTC),主要是给thermal提供温度感知。
二、代码结构
Thermal框架整体代码结构如下图所示:
可以看到,还是挺复杂的。通过上图中复杂的层次就可以推断,代码量及其中包含的知识点是非常多的。不过没有关系,后续文章会将整体拆分为一个个子部分,分别对每个子部分进行讲解和分析。