|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
+ D1 j7 S$ c0 X6 H, b4 h' O7 H0 P0 c
CPUFreq子系统的初始化
9 Q" A9 I$ [; x; H B
% I. y2 Y% U' p$ C; @9 W5 x先看看具体的代码:
0 O a; N! y# X* q5 Z
9 n7 n$ z5 O3 O& G% Z1 o- static int __init cpufreq_core_init(void)
- {
- int cpu;
& N( K2 r" m# C) b/ H- if (cpufreq_disabled())
- return -ENODEV;
- + Y) b$ o5 Q2 d8 ?7 Q9 q
- for_each_possible_cpu(cpu) {
- per_cpu(cpufreq_policy_cpu, cpu) = -1;
- init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
- }
& B5 A: R S4 T' I- cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
- BUG_ON(!cpufreq_global_kobject);
- register_syscore_ops(&cpufreq_syscore_ops);
/ [( ^; k' _/ _1 e# w/ c- return 0;
- }
- core_initcall(cpufreq_core_init);* \4 G1 o) Y7 Z, I
& |# |0 o+ x8 ]
5 }+ }9 C) T& ~. H3 R! U$ W
" w8 X7 i1 ~/ n可见,在系统的启动阶段,经由initcall机制,cpufreq_core_init被调用,由它来完成核心部分的初始化工作,其中:/ ` z- ]) k6 ~% G, x6 X9 \
cpufreq_policy_cpu 是一个per_cpu变量,在smp的系统下,每个cpu可以有自己独立的调频policy,也可以所有的cpu都是用一种policy,这时候就有可能出现其中一个cpu管理着某个policy,而其它cpu因为也使用同一个policy,这些cpu的policy的就交由那个管理cpu代管,这个per_cpu变量就是用来记录各个cpu的policy实际上是由那个cpu进行管理的。初始化时都被初始化为-1了,代表现在还没有开始进行policy的管理。
+ n3 [# `* f( V2 O! | ~. [( n! |9 E$ A8 b% h
接下来的kobject_create_and_add函数在/sys/devices/system/cpu这个节点下建立了一个cpufreq节点,该节点的下面以后会用来放置当前governor的一些配置参数。参数cpu_subsys是内核的一个全局变量,是由更早期的初始化时初始化的,代码在drivers/base/cpu.c中:
' P* A8 O2 y2 A* g7 Z0 W& n/ d, Z0 |$ M$ A+ W5 X# a
; r& }0 S8 A; \6 B
$ K7 X1 z8 B+ ^1 ^ U& a1 b: d
* @0 ^5 s+ @. ~1 @; Y$ M
- P _9 G3 \( n* ^& w) v
V2 ?. L, I* u3 j% b
2 o3 Y. a! g6 ^, L9 z |
|