内核可以设置CPU的“硬件定时器”的间隔吗?CPU是否有专用的硬件定时器来进行调度?

时间:2017-05-06 05:17:27

标签: timer operating-system kernel cpu scheduling

根据我的理解,CPU有一个“硬件定时器”,当它的间隔到期时会触发中断。

内核使用此硬件定时器来实现进程的调度机制,因此如果硬件定时器触发数量为123的中断,内核会将此中断号映射到执行调度程序代码(将决定下一个要执行的进程)。

我有两个问题:

  1. 内核是否可以设置硬件定时器的间隔,或者是一个无法以编程方式更改的固定数量的间隔?
  2. CPU是否有用于调度的专用硬件定时器,或者是否有许多硬件定时器,内核可以选择要用于调度的任何定时器吗?
  3. 编辑: 我更感兴趣的硬件架构是PC,但我想知道其他架构(例如:手机) ,覆盆子PI等)以类似的方式工作。

3 个答案:

答案 0 :(得分:0)

详细信息是特定于硬件的(可能与各种主板,芯片组,处理器不同;请阅读SouthBridge)。阅读High Precision Event Timer(和APIC)。

另请参阅OSDEV wiki,特别是Programmable Interval Timer

(所以两个问题的答案通常都是肯定的)

答案 1 :(得分:0)

从早期开始,IBM兼容PC就有PIT(可编程间隔定时器):IBM PC和IBM PC XT拥有Intel 8253,IBM PC AT推出了Intel 8254。

从1984年4月的IBM PC技术参考,第1-11页:

  
    

系统计时器

         

系统使用三个可编程定时器/计数器,如下所示:通道0是一个通用定时器,为实现时钟,通道1次和从直接存储器请求刷新周期提供恒定时基访问(DMA)通道和通道2支持扬声器的音调生成。 [...]

  

频道0正是您所要求的“恒定时基”,“间隔”。并且,为了回答你的1 st 问题,它是可以改变的;它是可编程间隔定时器。

然而,原始IBM PC内置的CPU是Intel 8088,基本上是带有8位数据总线的Intel 8086。真实模式是当时最先进的模式;几年后,使用英特尔80286引入了保护模式,因此当DOS占领市场时,有效的多任务处理,更不用说抢占式多任务处理或多线程处理,无关紧要。

快速转发到IBM PC AT,全世界都拥有一个支持保护模式的CPU,英特尔80286和英特尔8254,这是“8253的超集”。 (来自8254 PIT数据表)。如果您真的想要深入了解PIT,请阅读底部链接的8253/8254数据表。它也许值得一看Linux。由于最新的内核过于复杂而无法在20分钟内真正理解特定部分,因此我建议您先查看Linux 0.01,这是第一个版本。 _timer_interrupt kernel/system_calls.s中的================ ================ | Person | | Country | |--------------| |--------------| |- name |------------------|- id | |- age | |- name | |--------------| |- population | |+ drinkWater()| ================ |+ drinkBeer() | ================ 可能很有趣,从那里你就可以去任何你想去的地方。

关于你的2 nd 问题:有多个定时器源,但只有一个适用于间隔定时,即通道0.IBM兼容性仍然符合上面显示的系统定时器布局。它们保留了相同的功能,但可能会增加更多功能,或者更改硬件的工作方式和打包方式。如今,其他定时器确实存在,如高分辨率定时器,但将其用于中断定时会破坏兼容性。

答案 2 :(得分:0)

  

内核可以设置硬件定时器的间隔,还是一个无法以编程方式更改的固定数字的间隔?

您的问题完全取决于处理器。某些处理器具有可控定时器。其他人有固定间隔的定时器。但是,您可能遇到的大多数处理器都有可调节的计时器。

  

CPU是否有专用的硬件定时器用于调度,或者是否有许多硬件定时器,内核可以选择它想要用于调度的定时器吗?

某些处理器只有一个计时器。如今大多数处理器都有多个计时器。