linux中的jiffies变量【DOC精选】.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux中的jiffies变量【DOC精选】

全局变量jiffies用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。 ?? 系统运行时间以秒为单位,等于jiffies/Hz。 注意,jiffies类型为无符号长整型(unsigned long),其他任何类型存放它都不正确。 将以秒为单位的时间转化为jiffies: seconds * Hz 将jiffies转化为以秒为单位的时间: jiffies / Hz 相比之下,内核中将秒转换为jiffies用的多些。 jiffies的内部表示 ?? jiffies定义于文件linux\Jiffies.h中: /* * 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 在Time.c(kernel)中 #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 wont 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 * wouldnt 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) #defi

文档评论(0)

taotao0b + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档