您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第17章 Linux 内核时钟定时机制
Linux操作系统精讲大连理工大学软件学院邱铁综合楼413,Tel:0411-87571632E_mail:qiutie@dlut.edu.cn参考教材:《Linux应用与开发典型实例精讲》邱铁、于玉龙、徐子川编著.清华大学出版社.2010.5第17章时钟定时管理学习本章要达到的目标:1.了解操作系统内核定时器的分类,熟悉实时时钟、时间戳计数器和可编程间隔定时器的硬件工作原理;2.理解Linux内核时钟节拍的含义;3.掌握Linux内核定时器的管理机制;4.掌握Linux定时器加载与使用方式。17.1内核定时器分类80x86体系结构上,内核与时钟密切相关,与时钟相关的硬件有:实时时钟(RealTimeClock,RTC)时间戳计数器(TimeStampCounter,TSC)可编程间隔定时器(ProgrammableIntervalTimer,PIT)SMP系统上的本地APIC定时器高精度事件定时器(HighPrecisionEventTimer,HPET)。1.实时时钟RTCRTC是一个独立于CPU的专用芯片,它依靠独立于系统供电电源的小电池给RTC的振荡器进行供电,因此在关机时也能保证时间是正确的。即使关闭PC电源,也会继续运转。这些芯片一般与主板的CMOS芯片组集成在一个芯片中。例如:Motorala146818,实时时钟中断是从IRQ8上引入的,能发出周期性的中断,频率在2HZ~8192之间,可以对其编程实现对时间的长短计时。时间戳计数器TSC从Pentium开始,很多80x86微处理器都引入了一个TSC,这是一个64位的、用作时间戳计数器的寄存器,它在每个时钟信号(CLK)到来时+1,例如时钟频率1GHz的微处理器,TSC每隔1ns就加1。在Linux2.6.24中,使用对32位操作的rdtscl()函数和64位操作的rdtscll()函数分别用来读取TSC的值。可编程间隔定时器PIT在IBMPC中使用的是8253或8254定时计数器芯片经过适当编程后,可以周期性的给出时钟中断。在8254CMOS芯片中,使用I/O端口0x40~0x43,进行数据控制和数据操作。Linux内核每隔一定的时间会周期性的发出中断,HZ是用来定义每一秒有几次定量中断的。tick(滴答)是HZ的倒数,也就是发生两次定时中断的时间间隔。如HZ为100时,tick为1/100=10ms(毫秒)。jiffies为Linux内核中的一个全局变量,用来记录从系统启动以来产生的节拍数,externu64__jiffy_datajiffies_64;externunsignedlongvolatile__jiffy_datajiffies;SMP系统上的本地APIC定时器在SMP系统上,可以单次或者周期性的产生中断信号。本地APIC只把中断信号发送给本地CPU进行处理,而PIC发送的中断信号任何CPU都可以处理高精度计时器(HPET)在linux2.6中增加了对高精度计时器HPET的支持。高精度计时器是一种由微软和intel联合开发的新型定时芯片。该设备有一组计时器,每个计时器对应有自己的时钟信号,时钟信号到来的时候就会自动加1。17.2内核时钟管理分析时钟源及其初始化软定时器17.2.1时钟源及其初始化在Linux内核启动过程中,要对所有定时机制所用到的软硬件资源进行初始化。在sart_kernel()函数中:时钟滴答的初始化tick_init定时器相关初始化init_timers高精度定时器相关初始化hrinit_timersxtime相关初始化timekeeping_init时间的初始化time_init以及时钟调度器相关的初始化sched_colck_init时钟源初始化时间的初始化函数time_init()在内核源码arch/x86/kernel/time_32.c文件中的定义如下:void__inittime_init(void){tsc_init();//时间戳计数器TSClate_time_init=choose_time_init();}17.2.2软定时器Linux的动态定时器是一种软定时器,它可以被动态的创建和删除,当前活动的动态定时器个数没有限制。软定时器列表结构timer_list中记录了软件时钟的到期时间以及到期后要执行的操作structtimer_list{structlist_headentry;//定时器链表的入口unsignedlongexpires;//到期时间,以jiffies为单位void(*function)(unsignedlong);//勾挂函数,定时到期时所要执行的函数unsignedlongdata;//勾挂函数的参数structtvec_t_base_s*base;//记录软定时器所在的structtvec_base变量……};软定时器列表管理结构structtvec_base用于组织、管理软定时器的结构。在SMP系统中,每个CPU占有一个。软定时器的组织结构17.3应用实例训练针对Linux时钟管理机制,设计了一个小测试实例以模块的方式插入内核,实现定时器my_timer1、my_timer2,定时器my_timer1的过期时间为(1xHZ),并在定时器my_timer1中创建定时器my_timer2,定时器my_timer2的过期时间为(2xHZ)。头文件及函数声明:#includelinux/module.h#includelinux/timer.hMODULE_LICENSE(GPL);voidmy_timer1_function(unsignedlong);voidmy_timer2_function(unsignedlong);structtimer_listmy_timer1;//定义定时器列表my_timer1structtimer_listmy_timer2;//定义定时器列表my_timer2staticint__inittimer_init_module(void);staticvoid__exittimer_exit_module(void);module_init(timer_init_module);module_exit(timer_exit_module);定义定时器my_timer1的过期函数my_timer1_function(),并在此函数中创建定时器my_timer2:voidmy_timer1_function(unsignedlongdata){printk(KERN_INFOInthemy_timer1_function\n);printk(KERN_INFOmy_timer1willcreatemy_timer2\n);unsignedlongj=jiffies;init_timer(&my_timer2);//初始化定时器my_timer2my_timer2.expires=j+2*HZ;//设置定时器my_timer2的过期时间my_timer2.data=&my_timer2;my_timer2.function=my_timer2_function;//设置定时器my_timer2的到期执行的函数my_timer2_functionadd_timer(&my_timer2);printk(KERN_INFOmy_timer2init.\n);structtimer_list*mytimer=data;del_timer(mytimer);//删除my_timer1printk(KERN_INFOmy_timer1wasdeleted.\n);}定义定时器my_timer2的过期函数my_timer2_function():voidmy_timer2_function(unsignedlongdata){printk(KERN_INFOInthemy_timer2_function\n);structtimer_list*mytimer=data;del_timer(mytimer);//删除my_timer2printk(KERN_INFOmy_timer2wasdeleted.\n);}定义安装模块初始化函数:/*安装模块*/inttimer_init_module(void){printk(KERN_INFOmy_timer1willbecreated.\n);unsignedlongj=jiffies;init_timer(&my_timer1);//初始化定时器my_timer1my_timer1.expires=j+1*HZ;//设置定时器my_timer1的过期时间my_timer1.data=&my_timer1;//设置定时器my_timer1的到期执行的函数my_timer1_functionmy_timer1.function=my_timer1_function;add_timer(&my_timer1);printk(KERN_INFOmy_timer1init.\n);return0;}定义退出模块函数:/*退出模块*/voidtimer_exit_module(void){printk(KERN_INFOGoodbyetimer_mod_test\n);}17.3.3编译及运行结果查看系统信息思考与练习1.在80x86体系结构下,与内核时钟相关的硬件有哪几种?2.在Linux内核启动过程中,要对所有定时机制所用到的软硬件资源进行初始化,分析内核源代码,说出都包括哪些初始化。3.Linux内核对软定时器进行动态管理与维护,分析软定时器的组织结构,并分析structtvec_base结构的具体成员项的含义。4.针对Linux时钟管理机制,设计测试实例,用模块的方式实现五个定时器,延时时间分别为:10xHZ、20xHZ、30xHZ、40xHZ、50xHZ。
本文标题:第17章 Linux 内核时钟定时机制
链接地址:https://www.777doc.com/doc-5735258 .html