写在前面:自制操作系统Gos 第二章第十篇:主要内容是如何协调操作系统中各部件工作频率的组件定时器
Gos完整代码:Github
时钟
之前,我其实在中断的实现机制那篇博客中提到了时钟中断这个概念,而且它被放在RPQ0这个最为重要的位置。那它是干什么的呢?为什么会这么重要呢?
我们可以想想在平时生活中,我们如何跟其他人进行工作中的同步呢?
以下为虚拟场景:
“小龚,这个任务下周一前解决”
“好的”
其实主要就是依靠时间来完成这个过程,计算机系统中也一样,为了让所有设备之间的通信尽然有序,就必然有一个大家都遵守的时间规约,而这个就被称之为时钟。它并不是计算机处理速度的衡量,而是一种使设备相互配合而避免发生冲突的节拍。
一般来说时钟会分为两种:
- 内部时钟:一般由晶体振荡器产生(晶振),位于主板上。其频率经过分频之后就是主板的外频,Intel将此外频×某个倍数(倍频)就被称之为主频。一般用作CPU中的内部元件,如运算器或者控制器的工作时序。主要用于控制、同步内部工作过程的。
- 外部时钟:其是至处理器和外部设备或外部设备之间通信采用的时序,粒度比较大,一般是毫秒或者秒级别。
其中内部时钟一般使无法改变的,我们想要在操作系统中协调组件就只能对外频进行更改。其实也有两种手段:
- 软件:通过类似于让CPU空转来达到目的:
int clock_times = 1000;
while(clock_times>=0)
{
clock_times--;
)
- 硬件:一般采用定时器,定时器会定时发信号,当达到所计数的时间,计数器就可以自动发出一个信号,这个信号就会产生一个时钟中断。操作系统开启中断后,可以编写时钟中断的处理程序,一般这个最主要的作用其实就是在进程间切换啦,也就是大名鼎鼎的时间片轮转法!
所以,综上来看:软件控制外部时钟太浪费CPU资源啦,我们最好的方法就是采用硬件控制外部时钟。
定时器8253
定时器主要使分为不可编程定时器和可编程定时器两种。我们主要用到的就是可编程定时器(programmable interval timer,PIT)。
注:
不可编程定时器的有关资料我也没有找到,由同学找到可以在评论区@我一下。
常见的定时器有Intel 8253/8254/82C54A,我们只需要会使用最简单的8253就可以了。
定时器计时
定时器计时方式主要有两种:
- 正计时:每一次时钟脉冲发生的时候,将当前计数值+1,直到加到一个阈值为值。代码表示如下:
int clock_times = 0;
int end_times = 1000;
while(clock_times <= end_times

本文介绍了计算机系统中的时钟及其重要性,区分了内部时钟和外部时钟,并讨论了如何通过硬件定时器而非软件来更有效地控制外部时钟。文章详细讲解了8253可编程间隔定时器的结构、工作方式和初始化过程,强调了其在操作系统中协调组件和实现时间片轮转法中的作用。还提供了8253初始化的代码示例和中断处理函数的实现。
最低0.47元/天 解锁文章
3333

被折叠的 条评论
为什么被折叠?



