EDA365电子论坛网
标题:
Linux动态频率调节系统CPUFreq之CPUFreq子系统的初始化
[打印本页]
作者:
mytomorrow
时间:
2019-10-23 09:48
标题:
Linux动态频率调节系统CPUFreq之CPUFreq子系统的初始化
- @' O* F e0 H) K5 v6 j
CPUFreq子系统的初始化
) `4 n7 z" F9 q' h
. m0 h2 q5 o: R
先看看具体的代码:
; Z T' [, a- m
, R a. d9 r" z. P* g+ E7 q! q1 y. x6 I
static int __init cpufreq_core_init(void)
{
int cpu;
% ~6 h- X! A3 c4 U
if (cpufreq_disabled())
return -ENODEV;
C; f7 h) p- E% v' G
for_each_possible_cpu(cpu) {
per_cpu(cpufreq_policy_cpu, cpu) = -1;
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
}
3 F" U. ?/ w* S5 n0 K' `1 U
cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
BUG_ON(!cpufreq_global_kobject);
register_syscore_ops(&cpufreq_syscore_ops);
4 c4 g: v) m: Q) u8 F
return 0;
}
core_initcall(cpufreq_core_init);
: L% G! b2 ^3 i4 Z/ N# f5 y
! ^7 U4 E& m d; B1 `: U3 [% M
8 \1 C# s/ u; l
7 K4 \# @- ^9 k' x% j! |9 x
可见,在系统的启动阶段,经由initcall机制,cpufreq_core_init被调用,由它来完成核心部分的初始化工作,其中:
' A7 I' Z9 D4 h0 ?% y% A4 ]
cpufreq_policy_cpu 是一个per_cpu变量,在smp的系统下,每个cpu可以有自己独立的调频policy,也可以所有的cpu都是用一种policy,这时候就有可能出现其中一个cpu管理着某个policy,而其它cpu因为也使用同一个policy,这些cpu的policy的就交由那个管理cpu代管,这个per_cpu变量就是用来记录各个cpu的policy实际上是由那个cpu进行管理的。初始化时都被初始化为-1了,代表现在还没有开始进行policy的管理。
# l' s' b/ I: d. x. x5 Z
: s* {4 L' H7 y% x: K* d- S% m
接下来的kobject_create_and_add函数在/sys/devices/system/cpu这个节点下建立了一个cpufreq节点,该节点的下面以后会用来放置当前governor的一些配置参数。参数cpu_subsys是内核的一个全局变量,是由更早期的初始化时初始化的,代码在drivers/base/cpu.c中:
1 V; c( v5 U# h& A% o% i3 f
7 K; ]' R- H* n+ K. d4 g( Y
+ G$ v; @' Q8 L* N5 C' x
& _1 ?1 r3 U/ F+ G
, i; }9 e& Y. I6 B, A+ \$ I$ L
, j2 H6 M5 \, [2 h7 i O
% Z0 y3 k6 A2 z' n, |! a
& c/ p+ L% v' z
作者:
Demyar
时间:
2019-10-24 19:51
看看。
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2