|
对于每一个linux编程爱好者来说,他们都有一个共同的心愿,就是了解linux的内核。但是linux内核的庞大与复杂让人望而生畏。往往是鼓足勇气一头扎进去,学得昏天黑地的,却没有学到什么。这里我想说,初学者不妨先学习学习内核中一些简单的函数,从中既可以得到乐趣,又能了解到内核的一些编程风格。然后,再将linux划分成几个部分,如进程调度、内存管理等,对每个部分从原理上去把握了解。接着,在详细分析各个部分的具体实现。最后,各部分串在一起,把过去单独分析时,不懂的地方加以重新了解。这样循环监禁,可以让我们更快更系统的学习linux的内核。
这是我对内核学习的一些理解,欢迎各位提宝贵意见。我今天向大家介绍的是linux内核中一个有趣的函数calibrate_delay()。 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 } 0
最新评论共有 4 位网友发表了评论
查看所有评论
发表评论
热点关注
|
Linux内核学习之BogoMIPS值的计算
来源:
作者:
时间:2007-11-20
Tag:
点击:
