Linux时间系统的设计与实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

尹能linux时间系统的设计与实现第1页共18页Linux时间系统的设计与实现学生姓名:xxx指导老师:XXX摘要时间系统是操作系统的重要组成部分,无论是在分时操作系统还是在实时操作系统中,时间系统都起着极为重要的作用。时间系统的主要功能是负责维护系统时间、计算CPU的使用情况、为分时调度提供计时、提供定时器。概述了时间系统的主要功能,对Linux时间系统的硬件基础进行介绍,介绍了Linux操作系统中用来表示时间的数据结构。结合对源代码的分析,具体描述了Linux独特的时钟中断处理过程和时间系统各功能的实现。最后,介绍了实时操作系统的特征,并针对如何改造时间系统,提高Linux核心的实时处理能力提出了解决方案。。关键词linux时间系统;linux-2.4.3.0源码;RedhatEnterpriselinux5尹能linux时间系统的设计与实现第2页共18页1引言1.1课题背景及意义首先,是经济问题。中国是个人口大国,将来更要成为网络大国,如果每个人都用正版windows那将是一笔不小的开销.linux就不存在这个问题。当然,更不可能每个人都用苹果的macos。其次,linux是一个具有优良血统的系统,它具有unix的特点,又具有极好的易用性,安全性,强大的网络服务功能。综合来说,linux具有良好的发展前景.中国对于推广linux具有非常的价值。1.2课程设计目的(1)学会使用vi编辑器编辑C语言程序(2)学会Linux环境下gcc的使用(3)学会调试工具GDB的使用(4)学习重新编译Linux内核,理解、掌握Linux内核版本和Linux发行版本的区别(5)学会在linux中设置,修改,显示时间1.3课题技术支持了解Linux的时钟由于Linux时钟和Windows时钟从概念的分类、使用到设置都有很大的不同,所以,搞清楚Linux时钟的工作方式与设置操作,不仅对于Linux初学者有着重大意义,而且对于使用Linux服务器的用户来说尤为重要。1.4可行性分析报告Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(SystemClock)和硬件(RealTimeClock,尹能linux时间系统的设计与实现第3页共18页简称RTC)时钟两种。系统时间是指当前LinuxKernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的“StandardBIOSFeture”项中进行设置。既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,见图1所示,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。尹能linux时间系统的设计与实现第4页共18页2实现原理通常,操作系统可以使用三种方法来表示系统的当前时间与日期:①最简单的一种方法就是直接用一个64位的计数器来对时钟滴答进行计数。②第二种方法就是用一个32位计数器来对秒进行计数,同时还用一个32位的辅助计数器对时钟滴答计数,直至累积到一秒为止。因为32位的秒计数超过136年,因此这种方法直至22世纪都可以让系统工作得很好。③第三种方法是按系统启动以来的滴答次数进行计数,而不是相对于某个确定的外部时刻;当读外部后备时钟(如RTC)或用户输入实际时间时,根据当前的滴答次数计算系统当前时间。2.1基本概念首先,有必要明确一些Linux内核时钟驱动中的基本概念。(1)时钟周期(clockcycle)的频率:8253/8254PIT的本质就是对由晶体振荡器产生的时钟周期进行计数,晶体振荡器在1秒时间内产生的时钟脉冲个数就是时钟周期的频率。Linux用宏CLOCK_TICK_RATE来表示8254PIT的输入时钟脉冲的频率(在PC机中这个值通常是1193180HZ),该宏定义在include/asm-i386/timex.h头文件中:#defineCLOCK_TICK_RATE1193180/*UnderlyingHZ*/(2)时钟滴答(clocktick):我们知道,当PIT通道0的计数器减到0值时,它就在IRQ0上产生一次时钟中断,也即一次时钟滴答。PIT通道0的计数器的初始值决定了要过多少时钟周期才产生一次时钟中断,因此也就决定了一次时钟滴答的时间间隔长度。(3)时钟滴答的频率(HZ):也即1秒时间内PIT所产生的时钟滴答次数。类似地,这个值也是由PIT通道0的计数器初值决定的(反过来说,确定了时钟滴答的频率值后也就可以确定8254PIT通道0的计数器初值)。Linux内核用宏HZ来表示时钟滴答的频率,而且在不同的平台上HZ有不同的定义值。对于ALPHA和IA62平台HZ的值是1024,对于SPARC、MIPS、ARM和i386等平台HZ的值都是100。该宏在i386平台上的定义如下(include/asm-i386/param.h):#ifndefHZ尹能linux时间系统的设计与实现第5页共18页#defineHZ100#endif根据HZ的值,我们也可以知道一次时钟滴答的具体时间间隔应该是(1000ms/HZ)=10ms。(4)时钟滴答的时间间隔:Linux用全局变量tick来表示时钟滴答的时间间隔长度,该变量定义在kernel/timer.c文件中,如下:longtick=(1000000+HZ/2)/HZ;/*timerinterruptperiod*/tick变量的单位是微妙(μs),由于在不同平台上宏HZ的值会有所不同,因此方程式tick=1000000÷HZ的结果可能会是个小数,因此将其进行四舍五入成一个整数,所以Linux将tick定义成(1000000+HZ/2)/HZ,其中被除数表达式中的HZ/2的作用就是用来将tick值向上圆整成一个整型数。另外,Linux还用宏TICK_SIZE来作为tick变量的引用别名(alias),其定义如下(arch/i386/kernel/time.c):#defineTICK_SIZEtick(5)宏LATCH:Linux用宏LATCH来定义要写到PIT通道0的计数器中的值,它表示PIT将每隔多少个时钟周期产生一次时钟中断。显然LATCH应该由下列公式计算:LATCH=(1秒之内的时钟周期个数)÷(1秒之内的时钟中断次数)=(CLOCK_TICK_RATE)÷(HZ)类似地,上述公式的结果可能会是个小数,应该对其进行四舍五入。所以,Linux将LATCH定义为(include/linux/timex.h):/*LATCHisusedintheintervaltimerandftapesetup.*/#defineLATCH((CLOCK_TICK_RATE+HZ/2)/HZ)/*Fordivider*/类似地,被除数表达式中的HZ/2也是用来将LATCH向上圆整成一个整数。2.2表示系统当前时间的内核数据结构尹能linux时间系统的设计与实现第6页共18页作为一种UNIX类操作系统,Linux内核显然采用本节一开始所述的第三种方法来表示系统的当前时间。Linux内核在表示系统当前时间时用到了三个重要的数据结构:①全局变量jiffies:这是一个32位的无符号整数,用来表示自内核上一次启动以来的时钟滴答次数。每发生一次时钟滴答,内核的时钟中断处理函数timer_interrupt()都要将该全局变量jiffies加1。该变量定义在kernel/timer.c源文件中,如下所示:unsignedlongvolatilejiffies;C语言限定符volatile表示jiffies是一个易改变的变量,因此编译器将使对该变量的访问从不通过CPU内部cache来进行。②全局变量xtime:它是一个timeval结构类型的变量,用来表示当前时间距UNIX时间基准1970-01-0100:00:00的相对秒数值。结构timeval是Linux内核表示时间的一种格式(Linux内核对时间的表示有多种格式,每种格式都有不同的时间精度),其时间精度是微秒。该结构是内核表示时间时最常用的一种格式,它定义在头文件include/linux/time.h中,如下所示:structtimeval{time_ttv_sec;/*seconds*/suseconds_ttv_usec;/*microseconds*/};其中,成员tv_sec表示当前时间距UNIX时间基准的秒数值,而成员tv_usec则表示一秒之内的微秒值,且1000000tv_usec=0。Linux内核通过timeval结构类型的全局变量xtime来维持当前时间,该变量定义在kernel/timer.c文件中,如下所示:/*Thecurrenttime*/volatilestructtimevalxtime__attribute__((aligned(16)));但是,全局变量xtime所维持的当前时间通常是供用户来检索和设置的,而其他内核模块通常很少使用它(其他内核模块用得最多的是jiffies),因此尹能linux时间系统的设计与实现第7页共18页对xtime的更新并不是一项紧迫的任务,所以这一工作通常被延迟到时钟中断的底半部分(bottomhalf)中来进行。由于bottomhalf的执行时间带有不确定性,因此为了记住内核上一次更新xtime是什么时候,Linux内核定义了一个类似于jiffies的全局变量wall_jiffies,来保存内核上一次更新xtime时的jiffies值。时钟中断的底半部分每一次更新xtime的时侯都会将wall_jiffies更新为当时的jiffies值。全局变量wall_jiffies定义在kernel/timer.c文件中:/*jiffiesatthemostrecentupdateofwalltime*/unsignedlongwall_jiffies;③全局变量sys_tz:它是一个timezone结构类型的全局变量,表示系统当前的时区信息。结构类型timezone定义在include/linux/time.h头文件中,如下所示:structtimezone{inttz_minuteswest;/*minuteswestofGreenwich*/inttz_dsttime;/*typeofdstcorrection*/};基于上述结构,Linux在kernel/time.c文件中定义了全局变量sys_tz表示系统当前所处的时区信息,如下所示:structtimezonesys_tz;2.3Linux对TSC的编程实现Linux用定义在arch/i386/kernel/time.c文件中的全局变量use_tsc来表示内核是否使用CPU的TSC寄存器,use_tsc=1表示使用TSC,use_tsc=0表示不使用TSC。该变量的值是在time_init()初始化函数中被初始化的(详见下一节)。该变量的定义如下:staticintuse_tsc;宏cpu_has_tsc可以确定当前系统的CPU是否配置有TSC寄存器。此外

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功