Linux核心程式的時間管理(二)——jiffies與jiffies_64釋疑,jiffiesjiffies_64

來源:互聯網
上載者:User

Linux核心程式的時間管理(二)——jiffies與jiffies_64釋疑,jiffiesjiffies_64

    Linux核心中定義了jiffies變數來記錄從系統啟動到當前時刻系統時鐘所產生的tick數。jiffies變數是一個無符號整型數值,即unsigned long類型。它的聲明如下(在 include/linux/jiffies.h 中):

extern u64 __jiffy_data jiffies_64;

    由此可見,jiffies變數在32位系統中的長度是32位,在64位系統中長度為64位。

    在32位系統中,HZ=1000時,jiffies只要約 49.7 天就會發生迴繞(溢出),而迴繞會給核心程式的時間度量帶來混亂和其他潛在的問題。因此,在Linux2.6核心中引入一個64位的無符號整型變數jiffies_64,核心中計時都是對jiffies_64進行遞增。jiffies_64也在 include/linux/jiffies.h 中有聲明: 

extern u64 __jiffy_data jiffies_64;

    其中,u64為unsigned long long類型。在 1000HZ 的情況下,該變數運行幾億年都不會發出迴繞,從而有效防止了迴繞可能引起的問題。這就是定義jiffies_64變數的原因。

    那麼,既然在32位機器上也是用64位計時,為什麼不直接把jiffies變數改為u64類型呢?或者說乾脆用jiffies_64來代替jiffies呢?根本原因是為了保持相容性及訪問效率!從相容性方面來看,大量的驅動程式使用jiffies 變數來進行一些與時間相關的操作,所以核心中需要保留該變數,以免影響系統功能;從訪問效率方面來看,因為在 32 位的系統中訪問 64 位元的 jiffies_64 變數需要進行兩次記憶體訪問,一來訪問速度沒有直接存取 jiffies 來得快,二來無法保證原子性(在兩次記憶體訪問中間可能會被中斷,從而造成讀取資料的不正確)。但是當真的需要訪問jiffies_64變數時(一般在驅動程式中很少訪問 jiffies_64,通常只有核心核心代碼才會訪問),核心也提供了 get_jiffies_64() 函數來訪問。該函數採用了加鎖機制(xtime_lock),以防止讀取資料的不正確。

    雖然,jiffies和jiffies_64是兩個變數,但它們最終指向相同的地址,只是jiffies取的是jiffies_64變數的低32位。這種效果通過連結程式實現的。通過連結器(ld)指令碼 vmlinux.lds (x86 上位於 arch/x86/kernel下) 可看到: 

1 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") 2 OUTPUT_ARCH(i386) 3 ENTRY(phys_startup_32) 4 jiffies = jiffies_64;

     其中最後一條語句的作用是,讓符號jiffies的地址等於符號jiffies_64的地址,即讓jiffies變數佔用 jiffies_64 的低 32 位。這裡涉及到連結器中的一個重要的概念:

在目標檔案內定義的符號可以在連結器指令碼內賦值,此時該符號應被定義為全域的。每個符號都對應一個地址,在連結器中的賦值(=)操作就是更改這個符號對應的地址。

    所以,這和 C 語言中的等於(=)是完全不同的概念:C 中是賦值,連結器中是改變地址。

    另外,jiffies_64 變數會被初始化為 INITIAL_JIFFIES ,該值定義在檔案 include/linux/jiffies.h 中:

1 /*2  * Have the 32 bit jiffies value wrap 5 minutes after boot3  * so jiffies wrap bugs show up earlier.4  */5 #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

    這樣,就使得系統在啟動後 5 分鐘時發生 jiffies 迴繞。這麼做有利於及早暴露裝置驅動程式中可能的 jiffies 迴繞導致的邏輯錯誤,方便驅動程式的開發。

 

 

參考文獻:

【1】:http://www.groad.net/bbs/thread-3352-1-1.html

【2】:http://bbs.csdn.net/topics/320154818

【3】:《Linux核心設計與實現(原書第3版)》第11章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.