热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

Linux内核学习之BogoMIPS值的计算

来源: 作者: 时间:2007-11-20 Tag: 点击:

   对calibrate_delay()函数分析如下:
   1 定义计算BogoMIPS的精度,这个值越大,则计算出的BogoMIPS越精确。
   7 loops_per_sec为每秒钟执行一个极短的循环的次数。
   9 printk()是内核消息日志打印函数,用法同printf()函数。
   10 第10至21行,是第一次计算loops_per_sec的值,这次计算只是一个粗略的计算,为下面的计算打好基础。
   11 第11 至16行,是用于等待一个新的定时器滴答(它大概是百万分之一秒)的开始。可以想象我们要计算loops_per_sec的值,可以在一个滴答的开始时,立即重复执行一个极短的循环,当一个滴答结束时,这个循环执行了多少次就是我们要求的初步的值,再用它乘以一秒钟内的滴答数就是 loops_per_sec的值。
   12 系统用jiffies全局变量记录了从系统开始工作到现在为止,所经过的滴答数。它会被内核自动更新。这行语句用于记录当前滴答数到tick变量中。
   13 注意这是一个没有循环体得空循环,第14行仅有一个“;”号。这条循环语句是通过判断tick的值与jiffies的值是否不同,来判断jiffies是否变化,即是否一个新的滴答开始了
   16 记录下新的滴答数以备后用。
   17 根据loops_per_sec值进行延时(及执行loop_per_sec次极短循环)。
   18 以下三行用于判断执行的延时是否超过一个滴答。一般loops_per_sec的初始值并不大,所以循环会逐步加大loops_per_sec的值,直到延时超过一个滴答。我们可以看出,前一次loops_per_sec的值还因太小不合适时,经过一次增大,它提高了两倍,满足了循环条件,跳出循环,而这个值实在是误差太大,所以我们还要经过第二次计算。这里还要注意的是通过上面的分析,我们可以知道更加精确的loops_per_sec的值应该在现在的值与它的一半之间。
   23 这里开始就是第二次计算了。它用折半查找法在我们上面所说的范围内计算出了更精确的loops_per_sec的值。
   25 义查找范围的最小值,我把它称为起点。
   26 定义查找范围,这样我们就可以看到loop_per_sec的值在“起点”与“起点加范围(终点)”之间。
   27 进入循环,将查找范围减半。
   28 重新定义起点,起点在“原起点加27行减半范围”处,即新起点在原先起点与终点的中间。这时我们可以看出loops_per_sec在“新起点”与“新起点加减半范围(新终点)”之间。
   29 第29至32行与第12至17行一致,都是等待新的滴答,执行延时。
   33 如果延时过短,说明loops_per_sec的值小了,将会跳过这部分,再次进入循环。它将是通过不断的折半方式来增大。如果延时过长,说明loops_per_sec的值大了,将起点重新返回原起点,当再次进入循环,由于范围减半,故可以达到减小的效果。
   38 计算出每秒执行极短循环的次数。从这里我们可以看出它好像是个死循环,所以加入了lps_precision变量,来控制循环,即LPS_PREC越大,循环次数越多,越精确。可能这些不太好懂,总的说来,它首先将loop_per_sec的值定为原估算值的1/2,作为起点值(我这样称呼它),以估算值为终点值.然后找出起点值到终点值的中间值.用上面相同的方法执行一段时间的延时循环.如果延时超过了一个tick,说明loop_per_sec值偏大,则仍以原起点值为起点值,以原中间值为终点值,以起点值和终点值的中间为中间值继续进行查找,如果没有超过一个tick,说明 loop_per_sec偏小,则以原中间值为起点值,以原终点值为终点值继续查找。
   40 出BogoMIPS,并打印。

   至此,我们就分析完了calibrate_delay()函数。

 

   原文地址 http://szricky.blog.hexun.com/5295603_d.html


相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析