熱搜:win11繞過硬件限制安裝 一鍵重裝Win10系統(tǒng) 最干凈的u盤啟動盤 真正純凈版的win7系統(tǒng)
時間:2015-01-14 17:23:30 作者:qipeng 來源:系統(tǒng)之家 1. 掃描二維碼隨時看資訊 2. 請使用手機瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20150114/34867.html 手機查看 評論 反饋
問題提出:
在2.6以前的內(nèi)核中,如果改變內(nèi)核中的HZ值會給用戶空間中某些程序造成異常結(jié)果。因為內(nèi)核是以節(jié)拍數(shù)/秒的形式給用戶空間導(dǎo)出這個值的,應(yīng)用程序便依賴這個特定的HZ值。如果在內(nèi)核中改變了HZ的定義值,就打破了用戶空間的常量關(guān)系---用戶空間并不知道新的HZ值。
解決方法:
內(nèi)核更改所有導(dǎo)出的jiffies值。內(nèi)核定義了USER_HZ來代表用戶空間看到的HZ值。在x86體系結(jié)構(gòu)上,由于HZ值原來一直是100,所以USER_HZ值就定義為100。內(nèi)核可以使用宏jiffies_to_clock_t()將一個有HZ表示的節(jié)拍計數(shù)轉(zhuǎn)換為一個由USER_HZ表示的節(jié)拍計數(shù)。
在中
/*
* Convert jiffies/jiffies_64 to clock_t and back.
*/
clock_t jiffies_to_clock_t(long x)
{
#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
return x / (HZ / USER_HZ);
#else
u64 tmp = (u64)x * TICK_NSEC;
do_div(tmp, (NSEC_PER_SEC / USER_HZ));
return (long)tmp;
#endif
}
unsigned long clock_t_to_jiffies(unsigned long x)
{
#if (HZ % USER_HZ)==0
if (x 》= ~0UL / (HZ / USER_HZ))
return ~0UL;
return x * (HZ / USER_HZ);
#else
u64 jif;
/* Don‘t worry about loss of precision here 。。 */
if (x 》= ~0UL / HZ * USER_HZ)
return ~0UL;
/* 。。 but do try to contain it here */
jif = x * (u64) HZ;
do_div(jif, USER_HZ);
return jif;
#endif
}
u64 jiffies_64_to_clock_t(u64 x)
{
#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
do_div(x, HZ / USER_HZ);
#else
/*
* There are better ways that don’t overflow early,
* but even this doesn‘t overflow in hundreds of years
* in 64 bits, so.。
*/
x *= TICK_NSEC;
do_div(x, (NSEC_PER_SEC / USER_HZ));
#endif
return x;
}
在中
/*
* do_div() is NOT a C function. It wants to return
* two values (the quotient and the remainder), but
* since that doesn’t work very well in C, what it
* does is:
*
* - modifies the 64-bit dividend _in_place_
* - returns the 32-bit remainder
*
* This ends up being the most efficient “calling
* convention” on x86.
*/
#define do_div(n,base) ({ /
unsigned long __upper, __low, __high, __mod, __base; /
__base = (base); /
asm(“”:“=a” (__low), “=d” (__high):“A” (n)); /
__upper = __high; /
if (__high) { /
__upper = __high % (__base); /
__high = __high / (__base); /
} /
asm(“divl %2”:“=a” (__low), “=d” (__mod):“rm” (__base), “0” (__low), “1” (__upper)); /
asm(“”:“=A” (n):“a” (__low),“d” (__high)); /
__mod; /
})
用戶空間期望HZ=USER_HZ,但是如果它們不相等,則由宏完成轉(zhuǎn)換。
上面就是Linux中jiffies變量的用法介紹了,如果你要計算系統(tǒng)運算了多少時間,那么你就可以使用jiffies變量來計算了,jiffies變量還有很多用途,使用多了你就會了解。
發(fā)表評論
共0條
評論就這些咯,讓大家也知道你的獨特見解
立即評論以上留言僅代表用戶個人觀點,不代表系統(tǒng)之家立場