- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- (必会)人身险销售从业人员近年考试真题题库汇总(答案).docx
- 大队委竞选讲话稿PPT.pptx
- 毕业论文_-——汽车凸轮轴加工工艺分析.doc
- 国家安全概论-西安交通大学-中国大学MOOC慕课答案.pdf
- 2024年中国成人心肌炎临床诊断与治疗指南解读课件PPT.pptx
- 2024-2025学年小学信息技术(信息科技)四年级全一册义务教育版(2024)教学设计合集.docx
- 项目四 任务六 旅游娱乐(练习-解析版)-《旅游概论》 (高教社第二版)同步精品课堂.docx
- 第四届-全国大学生结构设计信息技术大赛竞赛题-20211206.docx
- 慢性阻塞性肺疾病患者健康服务规范(试行)培训课件.pptx
- 《全国医疗服务价格项目规范(2012年版)》规范目录.pdf
文档评论(0)