[第12天]定时器

      6月简直就是废了,大作业加考试,没时间搞自己的东西了。我擦,换了个键盘,打字真tm舒服。

      接着干《30天自制操作系统》,时间太久,都不知道第12天到底干了什么了。原来是定时器。为什么操作系统需要定时器呢?因为中断,因为要多任务分配时间槽。MD,一下子就明白了多任务的原理。以前完全不了解。以前我是这么想的:多任务肯定需要调度,那么必须有一个主任务一直在运行,那么其他任务怎么运行?

PIT:

      操作系统使用的是PIT(Programmable interval timer),就是用他来产生中断,然后处理中断。而这个跟硬件的时钟频率密切相关。基本上用的都是Intel 8254。如下设置,可以使其产生100HZ的中断频率,具体原因看说明。然后bochs有点问题,可能是我配置不当。时钟总是不对。virutalbox和qtemu都没有问题。

中断处理:

      接下来就是中断处理。跟鼠标键盘事件一样先要注册中断处理程序,具体见github。然后可以扩展到真的定时器,原理:设置超时时间,每次中断后比较是否超时。当然这是最简单的,效率不高,可以优化很多。这里就展示一下核心的中断处理程序。

 多个定时器:

      这个的实现原理与图层类似,就是设定一个数组,存放对应的定时器信息。有了这个就可以进行多任务了。但是今天和明天都还有很多优化要做。

      顺便提一句,GCC的优化是必要的。GCC -O1直接将编译好的代码缩小了近2/3。但是这会导致之前第十天说的bug,所以还是跟作者一样把检测内存的代码改成了汇编。好像volatile也可以起到作用。最后是今天结果。

counter