系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux變量jiffies用法

Linux全局變量jiffies的用法(2)

時間: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變量還有很多用途,使用多了你就會了解。

標(biāo)簽 變量

發(fā)表評論

0

沒有更多評論了

評論就這些咯,讓大家也知道你的獨特見解

立即評論

以上留言僅代表用戶個人觀點,不代表系統(tǒng)之家立場

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

掃碼關(guān)注
掃碼關(guān)注

掃碼關(guān)注 官方交流群 軟件收錄