【Linux kernel/cpufreq】framework ----big Little driver

news2025/7/12 15:00:12

Linux kernel支持ARM big·Lttile框架的解决方案

一般ARM SOC包含能效和性能两个cluster,共8个 core,可以把这8个core统统开放给kernel,让kernel的调度器(scheduler)根据系统的实际情况,决定哪些任务应该在哪些core上执行。但这存在一个问题:

当前linux kernel的scheduler,都是针对SMP系统设计的,而SMP系统中所有CPU core的性能和功耗都是相同的

ARM big·Little driver的软件框架

linux kernel使用如下的软件框架实现ARM big·Little切换功能:
在这里插入图片描述
arm big little cpufreq driver,位于drivers/cpufreq/目录中,负责和cpufreq framework对接,以CPU调频的形式,实现ARM big·Little的切换。

arm bL switcher,是一个arch-dependent的driver,提供实际的切换操作。

arm big little cpufreq driver

arm big little cpufreq driver位于drivers/cpufreq目录下,由三个文件组成:

arm_big_little.c
arm_big_little.h
arm_big_little_dt.c

1)支持两个cluster。

2)当bL switching处于disable状态时,该driver就是一个普通的cpufreq driver,并为每个cluster提供一个frequency table(保存在freq_table[0]、freq_table[1]中)。

此时所有的big、Little core对系统都可见,每个core都可以基于cpufreq framework调整频率。

3)当bL switching处于enable状态时,该driver变成一个特殊的cpufreq driver,在调整频率的时候,可以根据情况,切换core的cluster。

此时只有4个虚拟的core对系统可见,系统不关心这些core属于哪个cluster、是big core还是Little core;

确切的说,每一个虚拟的core,代表了属于两个cluster的CPU对,可以想象为big+Little组合,只是同一时刻,只有一个core处于enable状态(big or Little);

该driver会搜集2个cluster的frequency table,并合并成一个(保存在freq_table[2]中)。合并后,找出这些frequency中big core最小的那个(clk_big_min)以及Little core最大的那个(clk_little_max);

基于cpufreq framework进行频率调整时,如果所要求的频率小于clk_big_min,则将该虚拟core所对应的Little core使能,如果所要求得频率大于clk_little_max,则将该虚拟core所对应的big core使能。

4)基于上面的描述,ARM big·Little driver会把big·Little架构下的8个CPU core,以“big+Little”的形式组合成4对,同一时刻,每对组合的core只有一个处于运行状态,这就是Linux kernel ARM big·Little架构的核心思路。

arm bL switcher driver

arm bL switcher driver是一个arch-dependent的driver,以ARM平台为例,其source code包括:

arch/arm/common/bL_switcher.c
arch/arm/common/bL_switcher_dummy_if.c

该driver的功能如下:

1)提供bL switcher功能的enable和disable控制

2)通过sysfs,允许用户空间软件控制bL switcher的使能与否

接口文件位于:

/sys/kernel/bL_switcher/active

读取可以获取当前的使能情况,写1 enable,写0 disable。

3)为每个虚拟的CPU core(big+Little组合),创建一个线程,实现最终的cluster切换。该部分是平台相关的,后面将会以ARM平台为例介绍具体的过程。

代码分析

本章以ARM平台为例,结合kernel source code,从初始化以及cluster切换两个角度,介绍ARM big·Little driver的核心功能。

初始化

和ARM big·Little driver有关的初始化过程主要分为三个部分:

1)CPU core的枚举和初始化,具体可参考“Linux CPU core的电源管理(5)_cpu control及cpu hotplug”中有关possible CPU、present CPU的描述。

2)arm big little cpufreq driver的初始化,为每个cluster创建一个frequency table,并主持相应的cpufreq driver。

3)arm bL switcher driver,初始化bL switcher,并使能bL switcher。

下面我们重点介绍步骤2和步骤3。

arm big little cpufreq driver的初始化

以包含两个cluster,每个cluster有4个CPU core的系统为例,start_kernel之后,系统的possible CPU包含所有的8个core。

然后arm big little cpufreq driver出场了,其init接口位于“drivers/cpufreq/arm_big_little_dt.c”中
kernel将arm big little cpufreq driver注册成了一个简单的platform driver,因此driver的入口就是其probe函数:generic_bL_probe。

1)generic_bL_probe

generic_bL_probe接口很简单,以dt_bL_ops为参数,调用bL_cpufreq_register接口,注册cpufreq driver。dt_bL_ops是一个struct cpufreq_arm_bL_ops类型的变量,提供两个回调函数,分别用于获取cluster切换之间的延迟,以及初始化opp table,后面用到的时候再介绍。

2)bL_cpufreq_register

bL_cpufreq_register位于“drivers/cpufreq/arm_big_little.c”中,主要负责如下事情:

a)执行一些初始化动作。

b)调用cpufreq_register_driver接口,注册名称为bL_cpufreq_driver的cpufreq driver。

c)调用arm bL switcher driver提供的bL_switcher_register_notifier接口,向该driver注册一个notify,当bL switcher enable或者disable的时候,该driver会通知arm big little cpufreq driver,以完成相应的动作。

3)bL_cpufreq_driver

bL_cpufreq_driver代表了具体的cpufreq driver,提供了.init()、.verify()、.target_index()等回调函数

cpufreq driver以及相关的回调函数说明如下:

.init()是cpufreq driver的入口函数,当该driver被注册到kernel中后,cpufreq core就会调用该回调函数,一般在init函数中初始化CPU core有关的frequency table,并依据该table填充相应的cpufreq policy变量。

.verify()可用于校验某个频率是否有效。

.target_index()可将CPU core设置为某一个频率,在本文的场景中,可以在修改频率是进行cluster切换,后面会详细介绍。

4)bL_cpufreq_init

bL_cpufreq_driver被注册后,cpufreq core就会调用bL_cpufreq_init接口,完成后续的初始化任务,该接口比较重要,是arm big little cpufreq driver的精髓

该接口根据当前bL switcher的使能情况(由cpu_to_cluster的返回值判断,如果等于MAX_CLUSTERS,bL switcher处于enable状态,否则,为disable状态),有两种截然不同行为。

bL switcher disable时(由于arm big little cpufreq driver先于arm bL switcher driver初始化,它初始化时,bL switcher处于disable状态):

调用get_cluster_clk_and_freq_table接口,为当前CPU所在的cluster创建frequency table,结果保存在freq_table[cluster]中
将和当前cpu以及同属于一个cluster的所有其它CPU都保存在policy->cpus中,并将它们的physical_cluster设置为当前CPU的cluster
以上逻辑的背后思路是:如果bL switcher没有enable,arm big little cpufreq driver就是一个普通的cpufreq driver,此时每个cluster的所有CPU,共享同一个frequency table、cpufreq policy,也就是说,一个cluster下的所有CPU core,共享同一个调频策略
bL switcher enable时(会复杂一些):

调用get_cluster_clk_and_freq_table接口,搜集两个cluster下CPU的frequency信息,并以升序的形式合并到一个frequency table中(freq_table[MAX_CLUSTERS]),找出这些frequency中big core最小的那个(clk_big_min)以及Little core最大的那(clk_little_max)
将当前CPU的physical_cluster变量设置为当前A15_cluster,默认初始化时为big core模式
以上逻辑背后的思路是:如果bL switcher enable,则所有的CPU core共用一个合并后的frequency table,并由一个调频策略统一调度,具体方法后面再详细介绍
bL_cpufreq_init的核心实现是get_cluster_clk_and_freq_table接口,该接口会根据bL switcher的使能情况,初始化不同的frequency table,并在bL switcher enable的时候,将不同cluster的frequency合并到一起。具体代码就不再详细分析,这里强调一下里面的一个小技巧:

为了让bL switcher逻辑顺利执行,有必要尽量准确的区分big core和Little core的频率,get_cluster_clk_and_freq_table使用了一个简单的方法:

对Little core来说,统一把frequency除以2,使用的时候再乘回来,这就基本上可以保证Little core的frequency位于合并后的频率表的前面位置,big core位于后面位置。

arm bL switcher driver的初始化

arm bL switcher driver的初始化接口是bL_switcher_init,由于它使用late_init宏声明,因此会在靠后的时机初始化,该接口主要完成两个事情:

1)如果no_bL_switcher参数不为1(默认为0),则调用bL_switcher_enable接口,使能bL switcher。

2)调用bL_switcher_sysfs_init接口,初始化bL switcher模块提供的sysfs API。

因此,arm bL switcher driver的初始化,就转移到bL_switcher_enable上面了。

enable/disable

bL switcher的使能与否,是由arm bL switcher driver控制的,以enable为例,enable的时机有两个:

1)arm bL switcher driver初始化的时候,调用bL_switcher_enable。

2)通过sysfs(/sys/kernel/bL_switcher/active)使能

bL_switcher_enable

bL_switcher_enable主要工作如下:

调用bL_activation_notify,向arm big little cpufreq driver发送BL_NOTIFY_PRE_ENABLE通知,cpufreq driver收到该通知后,会调用cpufreq_unregister_driver,将bL_cpufreq_driver注销(具体可参考drivers/cpufreq/arm_big_little.c中的bL_cpufreq_switcher_notifier接口)。

调用bL_switcher_halve_cpus接口,将系统所有possible的CPU core配对,并关闭不需要的core。该接口是本文的精髓,后面会稍微详细的介绍。

为每个处于online状态的CPU core(此处已经是虚拟的core了,该core是一个big/Little对,同一时刻只有一个core开启),初始化用于cluster switch的线程。

将bL_switcher_active置1,此时bL switcher正式enable了,向arm big little cpufreq driver发送BL_NOTIFY_POST_ENABLE通知,cpufreq driver会重新注册bL_cpufreq_driver。

bL_switcher_halve_cpus

bL_switcher_halve_cpus是ARM big·Little driver灵魂式的存在,它负责把系统8个big+Little core转化成4个虚拟的CPU core
bL_switcher_halve_cpus会将不同cluster的core组成一对,最终的结果保存在bL_switcher_cpu_pairing数组中,配对之后,把core 4~7 disable掉,就保证系统当前只有4个虚拟的CPU core了。

bL_cpufreq_switcher_notifier

bL_switcher_enable前后,会通知arm big little cpufreq driver,该driver会把bL_cpufreq_driver注销之后再重新注册,整个过程又回到了“arm big little cpufreq driver的初始化”过程。

cluster切换

最后,我们来看一下big core和Little core到底是怎么切换的。切换是由arm big little cpufreq driver的bL_cpufreq_set_target发起的,切换的主要动作包括:

1)在bL switcher处于enable状态时,对调度器而言,只有4个core可见,而且这4个core的logical map是不变的,例如都是0、1、2、3。每一个core在物理上和2个属于不同cluster的core对应,同一时刻只有一个物理core运行

2)这4个core所处的“状态”(哪个物理core处于运行状态,big or Little),记录在“physical_cluster”中。

3)当经由cpufreq framework进行频率调整的时候,根据当前的“状态”,以及要调整的目的频率,计算是否需要切换cluster(也即disable当前正在运行的物理core,enable另外一个物理core)。

4)最终,以当前“状态”(actual_cluster)、新“状态”(new_cluster)等为参数,调用bL_cpufreq_set_rate接口,设置频率。

bL_cpufreq_set_rate接口经过一番处理后,得到真实的频率值,调用clock framework提供的接口(clk_set_rate)修改频率。之后,如果old_cluster和new_cluster不同,则调用arm bL switcher driver提供的bL_switch_request接口,进行cluster切换。该接口会启动一个线程,完成切换动作。该线程的处理函数是bL_switcher_thread,它会以目的cluster为参数,调用bL_switch_to接口,完成最终的切换操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 值传递、引用传递、指针传递

一、简介 参数传递的三种方式&#xff1a;值传递、引用传递、指针传递 二、举例如下 #if 1 值传递 引用传递 指针传递的区别void value_input(int a){cout << "值传递------函数" <<&a <<endl;a 100;}void Pointer_input(int * n){cou…

云上办公兴起,华为云桌面Workspace更靠谱

云上办公兴起&#xff0c;华为云桌面Workspace更靠谱 为了办公的便利性&#xff0c;也趁着华为云推行“实惠更实用&#xff0c;11都如愿”的主题活动&#xff0c;许多企业果断入手了华为云桌面Workspace服务&#xff0c;当亲自试用后&#xff0c;才逐渐感受使用华为云桌面Work…

FPGA+ARM异核架构,基于米尔MYC-JX8MMA7核心板的全自动血细胞分析仪

全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一&#xff0c;用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备&#xff0c;功能齐全&#xff0c;操作简单&#xff0c;依托相关计算机系统在数据处理和数据分析等方面具有…

脚气、灰指甲治疗实验方案

脚气 &#xff08;已临床实验&#xff09; 脚气&#xff0c;又叫足廯、香港脚。 糜烂性脚气 症状&#xff1a;80%都是这种类型。常见于多汗人群。角质层被汗水浸软&#xff0c;发白了以后&#xff0c;走动不断摩擦表皮脱落&#xff0c;露出鲜红色糜烂面&#xff0c;瘙痒剧烈&…

什么是分布式软件系统

:什么是分布式软件系统&#xff1f;分布式软件系统是什么意思&#xff1f; 分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分…

[附源码]java毕业设计疫情状况下生活物资集体团购系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[毕业设计]大数据电影数据分析可视化

目录 前言 课题背景和意义 实现技术思路 网页分析 索引页 详情页 反爬破解 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,…

Unity UI 框架相关的一些思考

开源地址&#xff1a; GitHub - NRatel/NRFramework.UI: 基于 Unity UGUI 的 UI 开发框架基于 Unity UGUI 的 UI 开发框架. Contribute to NRatel/NRFramework.UI development by creating an account on GitHub.https://github.com/NRatel/NRFramework.UI 简介&#xff1a;…

EMR-StarRocks 与 Flink 在汇量实时写入场景的最佳实践

作者&#xff1a; 刘腾飞 汇量后端开发工程师 阿里云开源OLAP研发团队 EMR-StarRocks介绍 阿里云EMR在年初推出了StarRocks服务&#xff0c;StarRocks是新一代极速全场景MPP&#xff08;Massively Parallel Processing&#xff09;数据仓库&#xff0c;致力于构建极速和统一分…

帝国cms后台登录系统限制次数,60分钟过后重新登录解决办法

帝国cms后台登录系统一不小心登录频繁就提示: 系统限制的登录次数不得超过5次,请等60分钟过后,方可重新登录 主要原因就是频繁的输错用户名或者密码导致登录受限 解帝国cms后台登录系统限制次数方法一:等待60分钟,然后再尝试登录 解帝国cms后台登录系统限制次数方法二:修改…

Hive之DQL操作

Hive系列第六章 &#xff08;实际是第七篇&#xff0c;就不改目录序号了&#xff0c;大家知道就行&#xff0c;后续的篇章类推即可&#xff09; 第六章 DQL查询数据 DDL&#xff1a; Data Definition Language 数据定义语言 DML&#xff1a; Data Manipulation Language …

【科学文献计量】GC.networkCoInvestigator()和GC.networkCoInvestigator()中的参数解释

@TOC 1 数据 使用官网提供的基金数据导入到python环境中 2 GC.networkCoInvestigator()中的参数解释 GC.networkCoInvestigator()中的参数解释: targetTagsL: [list]数据类型。默认为None,可以指定为Grant中研究者的标签构成的列表,很多基金中作者没有已知的标签,需要自…

最新版本EasyRecovery15个人免费版电脑数据恢复工具

最新版本EasyRecovery15是一款是款恢复率高、速度快的数据恢复软件&#xff0c;Ontrack EasyRecovery (易恢复) 跨平台支持 Windows 以及 Mac 系统&#xff0c;能能够顺利找回因各种原因丢失的文件&#xff0c;比如文件误删除、误格式化、分区丢失等&#xff0c;且EasyRecovery…

一种获得离散型周期数据的变化周期的算法

400个数据像这样&#xff1a; 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 109 152 155 155 237 24 27 27 …

【Android 开发】 面试官刨根问底?教你如何避免翻车沟通表达能力

很久以前&#xff0c;凭借四大组件、Java基础等知识&#xff0c;便可开开心心的开发&#xff0c;轻松的上岗&#xff1b; 而随着Android的不断发展完善&#xff0c;各种组件库越来越成熟&#xff0c;学习资料越来越多&#xff0c;我们却慢慢的看不到了方向&#xff1b;信息爆炸…

Servlet(Cookie和Session)

目录 &#x1f432; 1. Cookie 的工作流程 &#x1f432; 2. Servlet中操作 Cookie 和 Session 的api &#x1f432; 3. 案例1: 模拟登录 &#x1f432; 4. 上传文件 &#x1f432; 5. 案例2: 上传文件 &#x1f432; 1. Cookie 的工作流程 Cookie 是浏览器在本地持久化保…

[附源码]SSM计算机毕业设计朋辈帮扶系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[毕业设计]opencv机器学习双目测距精度测量系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

Flutter高仿微信-第43篇-群聊列表

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.c…

泰克Tektronix 信号发生器AFG31022 ,2频道,25MHz

AFG31022 泰克函数发生器 AFG31022 是 Tektronix 的 25 MHz 函数发生器。 产品特征&#xff1a; 2个频道 25 MHz 正弦波 输出幅度范围&#xff1a;1 mVP-P 至 10 VP-P&#xff0c;50 Ω 负载 14 位垂直分辨率 内置波形包括正弦波、方波、斜波、脉冲、噪声和其他常用波形…