|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
; ^3 h9 C: j0 f4 [! t8 O# j6 b; MCPUFreq子系统的初始化7 ^+ D# |4 z, t* P
! x* x5 m/ S& H, j先看看具体的代码:
* V' W: J0 d+ m- g1 e9 J" @5 W, W% z+ n
- static int __init cpufreq_core_init(void)
- {
- int cpu;
4 _6 M5 _+ z# l4 M# n- if (cpufreq_disabled())
- return -ENODEV;
- , i; \. ?# R" E: f% A
- for_each_possible_cpu(cpu) {
- per_cpu(cpufreq_policy_cpu, cpu) = -1;
- init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
- }
- ; ]2 ~* E& l* k. t0 ]) P
- cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
- BUG_ON(!cpufreq_global_kobject);
- register_syscore_ops(&cpufreq_syscore_ops);
2 j# S; s9 Q; m7 v F) [- return 0;
- }
- core_initcall(cpufreq_core_init);
4 s6 {8 r( h& T+ N5 [. H$ N0 a4 G * J0 {8 M0 |+ @+ e0 e S6 |
7 s4 q' G/ N. l' Y Q5 d
* Q8 v* c( f5 C- P; R可见,在系统的启动阶段,经由initcall机制,cpufreq_core_init被调用,由它来完成核心部分的初始化工作,其中:
+ M- p5 j0 y, h8 | ^( [2 Tcpufreq_policy_cpu 是一个per_cpu变量,在smp的系统下,每个cpu可以有自己独立的调频policy,也可以所有的cpu都是用一种policy,这时候就有可能出现其中一个cpu管理着某个policy,而其它cpu因为也使用同一个policy,这些cpu的policy的就交由那个管理cpu代管,这个per_cpu变量就是用来记录各个cpu的policy实际上是由那个cpu进行管理的。初始化时都被初始化为-1了,代表现在还没有开始进行policy的管理。3 J. u! Z A, Y( [/ s
6 a* f$ T v3 Y" |9 }! i, a
接下来的kobject_create_and_add函数在/sys/devices/system/cpu这个节点下建立了一个cpufreq节点,该节点的下面以后会用来放置当前governor的一些配置参数。参数cpu_subsys是内核的一个全局变量,是由更早期的初始化时初始化的,代码在drivers/base/cpu.c中:
+ Z4 F! t8 X" z, a+ \/ p3 I1 ~
: k. A. i4 x( j l
: S* s0 u8 N$ c7 Q4 X
9 Y. q: D$ A' R, O L4 V; K
3 I/ w! u5 u7 E) R h" T
8 j) o! k" `/ ~3 j% O! Y2 d1 i) u4 @
$ a) M, G$ u3 G& s9 V+ G6 W+ S) p$ c |
|