jiffies是Linux系統中的全局變量,與時間有關,那麼jiffies變量具體有哪些作用呢?下面小編就給大家介紹下Linux全局變量jiffies的用法,感興趣的朋友不妨來了解下吧。
系統運行時間以秒為單位,等於jiffies/Hz。
注意,jiffies類型為無符號長整型(unsigned long),其他任何類型存放它都不正確。
將以秒為單位的時間轉化為jiffies:
seconds * Hz
將jiffies轉化為以秒為單位的時間:
jiffies / Hz
相比之下,內核中將秒轉換為jiffies用的多些。
jiffies的內部表示
jiffies定義於文件中:
/*
* The 64-bit value is not atomic - you MUST NOT read it
* without sampling the sequence number in xtime_lock.
* get_jiffies_64() will do this for you as appropriate.
*/
extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;
ld(1)腳本用於連接主內核映像(在x86上位於arch/i386/kernel/vmlinux.lds.S中),然後用jiffies_64變量的初值覆蓋jiffies變量。因此jiffies取整個jiffies_64變量的低32位。
訪問jiffies的代碼只會讀取jiffies_64的低32位,通過get_jiffies_64()函數就可以讀取整個64位的值。在64位體系結構上,jiffies_64和jiffies指的是同一個變量。
#if (BITS_PER_LONG 《 64)
u64 get_jiffies_64(void);
#else
static inline u64 get_jiffies_64(void)
{
return (u64)jiffies;
}
#endif
在中
#if (BITS_PER_LONG 《 64)
u64 get_jiffies_64(void)
{
unsigned long seq;
u64 ret;
do {
seq = read_seqbegin(&xtime_lock);
ret = jiffies_64;
} while (read_seqretry(&xtime_lock, seq));
return ret;
}
jiffies的回繞wrap around
當jiffies的值超過它的最大存放范圍後就會發生溢出。對於32位無符號長整型,最大取值為(2^32)-1,即429496795。如果節拍計數達到了最大值後還要繼續增加,它的值就會回繞到0。
內核提供了四個宏來幫助比較節拍計數,它們能正確的處理節拍計數回繞的問題:
/*
* These inlines deal with timer wrapping correctly. You are
* strongly encouraged to use them
* 1. Because people otherwise forget
* 2. Because if the timer wrap changes in future you won‘t have to
* alter your driver code.
*
* time_after(a,b) returns true if the time a is after time b.
*
* Do this with “《0” and “》=0” to only test the sign of the result. A
* good compiler would generate better code (and a really good compiler
* wouldn’t care)。 Gcc is currently neither.
*/
#define time_after(a,b) /
(typecheck(unsigned long, a) && /
typecheck(unsigned long, b) && /
((long)(b) - (long)(a) 《 0))
#define time_before(a,b) time_after(b,a)
#define time_after_eq(a,b) /
(typecheck(unsigned long, a) && /
typecheck(unsigned long, b) && /
((long)(a) - (long)(b) 》= 0))
#define time_before_eq(a,b) time_after_eq(b,a)
/* Same as above, but does so with platform independent 64bit types.
* These must be used when utilizing jiffies_64 (i.e. return value of
* get_jiffies_64() */
#define time_after64(a,b) /
(typecheck(__u64, a) && /
typecheck(__u64, b) && /
((__s64)(b) - (__s64)(a) 《 0))
#define time_before64(a,b) time_after64(b,a)
#define time_after_eq64(a,b) /
(typecheck(__u64, a) && /
typecheck(__u64, b) && /
((__s64)(a) - (__s64)(b) 》= 0))
#define time_before_eq64(a,b) time_after_eq64(b,a)
用戶空間和HZ
 12 共2頁