calibrate_delay() // Linux核心學習之BogoMIPS值的計算

來源:互聯網
上載者:User

原文

Linux核心學習之BogoMIPS值的計算

--------------------------------------------------------------------------------

作者:曹磊

對於每一個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 }

對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,並列印。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.