CPU概述

cpu topology

1.1. cpu拓扑

cluster(socket)->core->Threads(目前为止arm没有提出多线程的概念)
cpu拓扑图

1.2 多核技术

基于制程,扩充性等考虑,芯片厂商会把多个core封装在一个chip上,称为socket。socket的概念在X86架构上使用尤其多,可以理解为插槽;
假设一个插槽上有两个core,那么我在主板上插2个插槽,就是4核系统,插上4个插槽就是8核;arm的话则是另外一个概念cluster,簇
在X86架构的PC上,唯一目的的话是提高CPU的处理性能(不在乎功耗),但在移动市场中(大多是arm),性能提高后,对应着就更多的power消耗;对于设备电源管理以及散热提出了更高的要求。与此同时电池并没有随着CPU的拓扑的进化而进化,于是HMP技术就被提出来了;

1.3HMP(Heterogeneous Multi-Processing)

big-little:

  • 在一个chip中封装两类ARM Core,以kirin 960为例:一类为高性能Core,4核ARM A73,最高主频为2.4G,一类为低性能Core,4核ARM A53,最高主频为1.8G
    cpu拓扑图

DynamIQ:

  • 在单一cluster内可有8个核心,且可由不同架构,时钟的核心组成,提升了运作效率与配置的弹性,如高通的845 4核ARM A75,最高为2.8,4核 ARM A55,最高为1.8G

DynamIQ较big-little好处:

  1. 单cluster可有8核心
  2. cluster可搭配不同架构的CPU
  3. 各cpu可有独立的运作时钟
  4. CPU各自开关休眠互不影响
  5. 依照效能需求弹性运用各核心

以龙舟比喻ARM的DynamIQ与先前的big.LITTLE技术,我们把龙舟当成cluster,船员当成core,那么big.LITTLE龙舟上只能有4个船员,而且每个船员身材需要一样(核心架构),划船的时候若多位船员一起划船时,每个人的出力均等(频率一致),不能有人慢划或者快划;
当使用DynamIQ时,每艘船(cluster)上可以有8位高低胖瘦不等(架构)的船员(core),换船频率可以不等,且船员可以依照指令睡觉(关闭),休息(休眠),或划船(运作);

cpu内核代码框架

  1. 系统启动时,CPU core的初始化,信息获取
  2. 系统启动时,CPU core的启动(enable)
  3. 系统运行过程中,根据当前负荷,动态enable/disable 某些CPU core,以便在性能与功耗间平衡
  4. cpu core的hotplug支持,所谓的hotplug,是可以在系统运行的过程中,动态的增加或者减少CPU core(可以是物理上,也可以是逻辑上)
  5. 系统运行过程中CPU idle管理
  6. 系统运行过程中,根据当前负荷,动态的调整CPU core的电压和频率,以便在性能和功耗之间平衡

cpu拓扑图
arch-depedent部分位于”arch\arm64\kernel”负责平台相关的控制操作,包括

1
2
3
4
cpu 信息的获取(cpuinfo)
cpu拓扑结构的获取(cpu topology)
底层的CPU操作(init,disable等)的实现,cpu ops
SMP相关的初始化(smp)

arch-independent负责实现平台无关的抽象,包括

1
2
3
4
cpu control模块,屏蔽底层平台相关实现细节,提供控制CPU(enable,disable等)的统一API,供系统启动,进程调度等模块调用
cpu subsystem driver像用户空间提供CPU hotplug有关的功能;
cpuidle,处理CPU idle有关的逻辑
cpufreq 处理CPU frequency调整有关的逻辑

cpu的状态表示

  1. possible CPU: 就是在DTS中指定了的,物理存在的CPU core
1
2
3
start_kernel->boot_cpu_init->smp_process_id用于获取cpu id
->set_cpu_xxx,用于将指定的CPU设置为(或清除)指定状态
->setup_arch->smp_init_cpus->sunxi_smp_init_cpus->set_cpu_possible(i, true)
  1. present cpu: 被kernel标识的,具备执行代码条件,后续可以在需要的时候(如hotplug的时候),启动该CPU
1
2
3
4
start_kernel->rest_init->kernel_init->kernel_init_freeable
->smp_prepare_cpus
if (cpu_prepare(cpu)) /**/
set_cpu_present(cpu,true);
  1. online CPU: 某个CPU是present的,不一定是boot,所谓CPU boot,就是让CPU执行(取指译码/执行)代码
  2. active CPU 只是为了方便调度器操作

参考资料

一图看懂ARM DynamIQ运作原理
Linux CPU core的电源管理(1)概述