calibrate_delay ()函数可以计算出cpu在一秒钟内执行了多少次一个极短的循环,计算出来的值经过处理后得到BogoMIPS值,Bogo是Bogus(伪)的意思, MIPS是millions of instructions per second(百万条指令每秒)的缩写。这样我们就知道了其实这个函数是linux内核中一个cpu性能测试函数。由于内核对这个数值的要求不高,所以内核使用了一个十分简单而有效的算法用于得到这个值。这个值虽然不准确,但也足以令我们心动。如果你想了解自己机器的BogoMIPS,你可以察看 /proc/cpuinfo文件中的最后一行。在你知道了自己cpu的BogoMIPS之后,如果你觉得不过瘾,那么让我们一起来看看 calibrate_delay函数是怎么完成工作的。
下面是calibrate_delay的源代码,我在每行之前都加上了行号,以便讲解。
1 #define LPS_PREC 8
2 void __init calibrate_delay(void)
3 {
4 unsigned long ticks,loopbit;
5 int lps_precision=LPS_PREC
6
7 loops_per_sec=(1<<12);
8
9 printk(“Calibrating delay loop…”);
10 while(loops_per_sec<<=1) {
11 /* wait for “start of” clock tick */
12 ticks=jiffies;
13 while(ticks==jiffies)
14 /* nothing */;
15 /* Go… */
16 ticks=jiffies;
17 __delay(loops_per_sec);
18 ticks=jiffies-ticks;
19 if(ticks)
20 break;
21 }
22
23 /* Do a binary approximation to get loops_per_second set
24 * to equal one clock (up to lps_precision bits) */
25 loops_per_sec >>=1;
26 loopbit=loop_per_sec;
27 while(lps_precision-- && (loopbit >>=1) ) {
28 loops_per_sec |= loopbit;
29 ticks=jiffies;
30 while(ticks==jiffies);
31 ticks=jiffies;
32 __delay(loops_per_sec);
33 if(jiffies!=ticks) /* longer than 1 tick */
34 loops_per_sec &=~loopbit;
35 }
36 /* finally,adjust loops per second in terms of seconds
37 * instead of clocks */
38 loops_per_sec *= HZ;
39 /* Round the value and print it */
40 printk(“%lu.%02lu BogoMIPSn”,
41 (loops_per_sec+2500)/500000,
42 ((loops_per_sec+2500)/5000) % 100);
43 }