- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
四Linux内核时钟的学习课件;四 Linux内核时钟;1 时钟与定时器;Linux系统时钟以读取的硬件时钟为起始点,根据系统启动后的滴答数来计算时间,系统内的所有计时均基于它。系统用一个全局变量jiffies表示,该变量每个时钟周期更新一次,即表示系统自启动以来的时钟滴答数目。;时钟滴答;时钟中断的物理产生;bottom half -- 任务延迟处理机制;定时器:是系统提供的一种定时服务机制,它能够在某个特定的时刻唤醒某个进程来完成相应的工作。
Linux的链表定时器:;; 2. Linux系统时钟的实现;相关的数据结构及变量:
wall_jiffies:每次bottom half时用来记
录当前jiffies的变量.
TSC:保存CPU的ticks数目.;系统时钟初始化:arch/i386/kernel/time.c
调用get_cmos_time()函数从cmos中读取硬件时钟赋给tv_sec,初始化 tv_usec 为0。
调用setup_irq()重新设置时钟中断irq0的中断服务程序入口。
系统时钟的运行:
时钟中断发生时,中断服务程序实际上是依靠do_timer()函数来完成其必须完成的工作; do_timer() 进一步调用update_times函数来更新系统时间,调用run_timer_list函数来检查、执行定时服务,即在bottom half中完成。;系统时钟的设置和调整:系统调用
sys_time; //读取,秒级
sys_stime; //设置,秒级
sys_gettimeofday; //读取,微秒级
sys_settimeofday; //设置,微秒级
sys_adjtimex; //调整,主要用于网络和分布式系统。
时间的准确读取:
最近一次bottom half运行的时间值xtime+
从最近一次bottom half到最近一次时钟中断的间隔(jiffies-
wall_jiffies)+
最近一次时钟中断到当前的时间间隔usec; 3. Linux定时器的实现;链表结构体 kernel/timer.c
struct timer_vec {
int index; //定时器链表索引,指向当前要响应的链表。
struct list_head vec[TVN_SIZE]; //定时器链表数组
}; // TVN_SIZE=64
根链表结构体:
struct timer_vec_root {
int index; //定时器链表索引,指向当前要响应的链表。
struct list_head vec[TVR_SIZE]; //定时器链表数组
}; // TVN_SIZE=256;定义数组tvecs的5个成员管理定时器链表:
static sturct timer_vec tv5;
static sturct timer_vec tv4;
static sturct timer_vec tv3;
static sturct timer_vec tv2;
static sturct timer_vec_root tv1;
static struct timer_vec * const tvecs[] = {
(struct timer_vec *)tv1,tv2,tv3,tv4,tv5
};;;可以采用以下的假定:
Tv1 分
Tv2 时
Tv3 日
Tv4 月
Tv5 年;实现机制:
定时器升序排列,在时钟中断的bottom_half检查当前节点是否到时。
实现:
由5个定时器数组形成树形链表结构加以实现。
-初始化:根据用户空间得到的数据设置初值
并将设定好的定时器挂到链表上。
-运行:判断时间到达,由run_timer_list()
检查并执行定时服务。;run_timer_list()函数的实现思想:
1 首先判断tv1.index的值。如果非0,则激活定时器,递增timer_jiffies和tv1.index,使tv1.vec[tv1.index]指向
文档评论(0)