时间:2015-01-14 17:23:30 作者:qipeng 来源:系统之家 1. 扫描二维码随时看资讯 2. 请使用手机浏览器访问: https://m.xitongzhijia.net/xtjc/20150114/34867.html 手机查看 评论 反馈
问题提出:
在2.6以前的内核中,如果改变内核中的HZ值会给用户空间中某些程序造成异常结果。因为内核是以节拍数/秒的形式给用户空间导出这个值的,应用程序便依赖这个特定的HZ值。如果在内核中改变了HZ的定义值,就打破了用户空间的常量关系---用户空间并不知道新的HZ值。
解决方法:
内核更改所有导出的jiffies值。内核定义了USER_HZ来代表用户空间看到的HZ值。在x86体系结构上,由于HZ值原来一直是100,所以USER_HZ值就定义为100。内核可以使用宏jiffies_to_clock_t()将一个有HZ表示的节拍计数转换为一个由USER_HZ表示的节拍计数。
在中
/*
* 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,但是如果它们不相等,则由宏完成转换。
上面就是Linux中jiffies变量的用法介绍了,如果你要计算系统运算了多少时间,那么你就可以使用jiffies变量来计算了,jiffies变量还有很多用途,使用多了你就会了解。
发表评论
共0条
评论就这些咯,让大家也知道你的独特见解
立即评论以上留言仅代表用户个人观点,不代表系统之家立场