分享
 
 
 

Linux操作系统内核的时钟中断机制

王朝system·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

摘要:

本文主要从内核实现的角度分析了Linux 2.4.0内核的时钟中断、内核对时间的表示等。本文是为那些想要了解Linux I/O子系统的读者和Linux驱动程序开发人员而写的。

关键词:Linux、时钟、定时器

申明:这份文档是按照自由软件开放源代码的精神发布的,任何人可以免费获得、使用和重新发布,但是你没有限制别人重新发布你发布内容的权利。发布本文的目的是希望它能对读者有用,但没有任何担保,甚至没有适合特定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证(GPL),以及GNU自由文档协议(GFDL)。

你应该已经和文档一起收到一份GNU通用公共许可证(GPL)的副本。如果还没有,写信给:The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,MA02139, USA 欢迎各位指出文档中的错误与疑问。

前言

时间在一个操作系统内核中占据着重要的地位,它是驱动一个OS内核运行的“起博器”。一般说来,内核主要需要两种类型的时间:

1. 在内核运行期间持续记录当前的时间与日期,以便内核对某些对象和事件作时间标记(timestamp,也称为“时间戳”),或供用户通过时间syscall进行检索。

2. 维持一个固定周期的定时器,以提醒内核或用户一段时间已经过去了。

PC机中的时间是有三种时钟硬件提供的,而这些时钟硬件又都基于固定频率的晶体振荡器来提供时钟方波信号输入。这三种时钟硬件是:(1)实时时钟(Real Time Clock,RTC);(2)可编程间隔定时器(Programmable Interval Timer,PIT);(3)时间戳计数器(Time Stamp Counter,TSC)。

时钟硬件

1、实时时钟RTC

自从IBM PC AT起,所有的PC机就都包含了一个叫做实时时钟(RTC)的时钟芯片,以便在PC机断电后仍然能够继续保持时间。显然,RTC是通过主板上的电池来供电的,而不是通过PC机电源来供电的,因此当PC机关掉电源后,RTC仍然会继续工作。通常,CMOS RAM和RTC被集成到一块芯片上,因此RTC也称作“CMOS Timer”。最常见的RTC芯片是MC146818(Motorola)和DS12887(maxim),DS12887完全兼容于MC146818,并有一定的扩展。本节内容主要基于MC146818这一标准的RTC芯片。具体内容可以参考MC146818的Datasheet。

1.1 RTC寄存器

MC146818 RTC芯片一共有64个寄存器。它们的芯片内部地址编号为0x00~0x3F(不是I/O端口地址),这些寄存器一共可以分为三组:

(1)时钟与日历寄存器组:共有10个(0x00~0x09),表示时间、日历的具体信息。在PC机中,这些寄存器中的值都是以BCD格式来存储的(比如23dec=0x23BCD)。

(2)状态和控制寄存器组:共有4个(0x0A~0x0D),控制RTC芯片的工作方式,并表示当前的状态。

(3)CMOS配置数据:通用的CMOS RAM,它们与时间无关,因此我们不关心它。

时钟与日历寄存器组的详细解释如下:

Address Function

00 Current second for RTC

01 Alarm second

02 Current minute

03 Alarm minute

04 Current hour

05 Alarm hour

06 Current day of week(01=Sunday)

07 Current date of month

08 Current month

09 Current year(final two digits,eg:93)

状态寄存器A(地址0x0A)的格式如下:

其中:

(1)bit[7]——UIP标志(Update in Progress),为1表示RTC正在更新日历寄存器组中的值,此时日历寄存器组是不可访问的(此时访问它们将得到一个无意义的渐变值)。

(2)bit[6:4]——这三位是“除法器控制位”(divider-control bits),用来定义RTC的操作频率。各种可能的值如下:

Divider bits Time-base frequency Divider Reset Operation Mode

DV2 DV1 DV0

0 0 0 4.194304 MHZ NO YES

0 0 1 1.048576 MHZ NO YES

0 1 0 32.769 KHZ NO YES

1 1 0/1 任何 YES NO

PC机通常将Divider bits设置成“010”。

(3)bit[3:0]——速率选择位(Rate Selection bits),用于周期性或方波信号输出。

RS bits 4.194304或1.048578 MHZ 32.768 KHZ

RS3 RS2 RS1 RS0 周期性中断 方波 周期性中断 方波

0 0 0 0 None None None None

0 0 0 1 30.517μs 32.768 KHZ 3.90625ms 256 HZ

0 0 1 0 61.035μs 16.384 KHZ

0 0 1 1 122.070μs 8.192KHZ

0 1 0 0 244.141μs 4.096KHZ

0 1 0 1 488.281μs 2.048KHZ

0 1 1 0 976.562μs 1.024KHZ

0 1 1 1 1.953125ms 512HZ

1 0 0 0 3.90625ms 256HZ

1 0 0 1 7.8125ms 128HZ

1 0 1 0 15.625ms 64HZ

1 0 1 1 31.25ms 32HZ

1 1 0 0 62.5ms 16HZ

1 1 0 1 125ms 8HZ

1 1 1 0 250ms 4HZ

1 1 1 1 500ms 2HZ

PC机BIOS对其默认的设置值是“0110”。

状态寄存器B的格式如下所示:

各位的含义如下:

(1)bit[7]——SET标志。为1表示RTC的所有更新过程都将终止,用户程序随后马上对日历寄存器组中的值进行初始化设置。为0表示将允许更新过程继续。

(2)bit[6]——PIE标志,周期性中断使能标志。

(3)bit[5]——AIE标志,告警中断使能标志。

(4)bit[4]——UIE标志,更新结束中断使能标志。

(5)bit[3]——SQWE标志,方波信号使能标志。

(6)bit[2]——DM标志,用来控制日历寄存器组的数据模式,0=BCD,1=BINARY。BIOS总是将它设置为0。

(7)bit[1]——24/12标志,用来控制hour寄存器,0表示12小时制,1表示24小时制。PC机BIOS总是将它设置为1。

(8)bit[0]——DSE标志。BIOS总是将它设置为0。

状态寄存器C的格式如下:

(1)bit[7]——IRQF标志,中断请求标志,当该位为1时,说明寄存器B中断请求发生。

(2)bit[6]——PF标志,周期性中断标志,为1表示发生周期性中断请求。

(3)bit[5]——AF标志,告警中断标志,为1表示发生告警中断请求。

(4)bit[4]——UF标志,更新结束中断标志,为1表示发生更新结束中断请求。

状态寄存器D的格式如下:

(1)bit[7]——VRT标志(Valid RAM and Time),为1表示OK,为0表示RTC已经掉电。

(2)bit[6:0]——总是为0,未定义。

1.2 通过I/O端口访问RTC

在PC机中可以通过I/O端口0x70和0x71来读写RTC芯片中的寄存器。其中,端口0x70是RTC的寄存器地址索引端口,0x71是数据端口。

读RTC芯片寄存器的步骤是:

mov al, addr

out 70h, al ; Select reg_addr in RTC chip

jmp $+2 ; a slight delay to settle thing

in al, 71h ;

写RTC寄存器的步骤如下:

mov al, addr

out 70h, al ; Select reg_addr in RTC chip

jmp $+2 ; a slight delay to settle thing

mov al, value

out 71h, al

1.3 可编程间隔定时器PIT

每个PC机中都有一个PIT,以通过IRQ0产生周期性的时钟中断信号。当前使用最普遍的是Intel 8254 PIT芯片,它的I/O端口地址是0x40~0x43。

Intel 8254 PIT有3个计时通道,每个通道都有其不同的用途:

(1) 通道0用来负责更新系统时钟。每当一个时钟滴答过去时,它就会通过IRQ0向系统产生一次时钟中断。

(2) 通道1通常用于控制DMAC对RAM的刷新。

(3) 通道2被连接到PC机的扬声器,以产生方波信号。

每个通道都有一个向下减小的计数器,8254 PIT的输入时钟信号的频率是1193181HZ,也即一秒钟输入1193181个clock-cycle。每输入一个clock-cycle其时间通道的计数器就向下减1,一直减到0值。因此对于通道0而言,当他的计数器减到0时,PIT就向系统产生一次时钟中断,表示一个时钟滴答已经过去了。当各通道的计数器减到0时,我们就说该通道处于“Terminal count”状态。

通道计数器的最大值是10000h,所对应的时钟中断频率是1193181/(65536)=18.2HZ,也就是说,此时一秒钟之内将产生18.2次时钟中断。

2、 PIT的I/O端口

在i386平台上,8254芯片的各寄存器的I/O端口地址如下:

Port Description

40h Channel 0 counter(read/write)

41h Channel 1 counter(read/write)

42h Channel 2 counter(read/write)

43h PIT control word(write only)

其中,由于通道0、1、2的计数器是一个16位寄存器,而相应的端口却都是8位的,因此读写通道计数器必须进行进行两次I/O端口读写操作,分别对应于计数器的高字节和低字节,至于是先读写高字节再读写低字节,还是先读写低字节再读写高字节,则由PIT的控制寄存器来决定。8254 PIT的控制寄存器的格式如下:

(1)bit[7:6]——Select Counter,选择对那个计数器进行操作。“00”表示选择Counter 0,“01”表示选择Counter 1,“10”表示选择Counter 2,“11”表示Read-Back Command(仅对于8254,对于8253无效)。

(2)bit[5:4]——Read/Write/Latch格式位。“00”表示锁存(Latch)当前计数器的值;“01”只读写计数器的高字节(MSB);“10”只读写计数器的低字节(LSB);“11”表示先读写计数器的LSB,再读写MSB。

(3)bit[3:1]——Mode bits,控制各通道的工作模式。“000”对应Mode 0;“001”对应Mode 1;“010”对应Mode 2;“011”对应Mode 3;“100”对应Mode 4;“101”对应Mode 5。

(4)bit[0]——控制计数器的存储模式。0表示以二进制格式存储,1表示计数器中的值以BCD格式存储。

2.1 PIT通道的工作模式

PIT各通道可以工作在下列6种模式下:

1. Mode 0:当通道处于“Terminal count”状态时产生中断信号。

2. Mode 1:Hardware retriggerable one-shot。

3. Mode 2:Rate Generator。这种模式典型地被用来产生实时时钟中断。此时通道的信号输出管脚OUT初始时被设置为高电平,并以此持续到计数器的值减到1。然后在接下来的这个clock-cycle期间,OUT管脚将变为低电平,直到计数器的值减到0。当计数器的值被自动地重新加载后,OUT管脚又变成高电平,然后重复上述过程。通道0通常工作在这个模式下。

4. Mode 3:方波信号发生器。

5. Mode 4:Software triggered strobe。

6. Mode 5:Hardware triggered strobe。

2.2 锁存计数器(Latch Counter)

当控制寄存器中的bit[5:4]设置成0时,将把当前通道的计数器值锁存。此时通过I/O端口可以读到一个稳定的计数器值,因为计数器表面上已经停止向下计数(PIT芯片内部并没有停止向下计数)。NOTE!一旦发出了锁存命令,就要马上读计数器的值。

2.3 时间戳记数器TSC

从Pentium开始,所有的Intel 80x86 CPU就都又包含一个64位的时间戳记数器(TSC)的寄存器。该寄存器实际上是一个不断增加的计数器,它在CPU的每个时钟信号到来时加1(也即每一个clock-cycle输入CPU时,该计数器的值就加1)。

汇编指令rdtsc可以用于读取TSC的值。利用CPU的TSC,操作系统通常可以得到更为精准的时间度量。假如clock-cycle的频率是400MHZ,那么TSC就将每2.5纳秒增加一次。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有