定时器
定时器对操作系统而言十分重要,它会每隔一段时间发送一个中断信号给CPU。想要在电脑里管理定时器,需要对PIT进行设定。
PIT(Programmable Interval Timer),可编程的间隔定时器,可以通过设定PIT,让定时器每隔多少秒就产生一次中断。PIT连接着IRQ(interrupt request)0 ,所以设定了PIT就可以设定IRQ0的中断间隔。
将中断周期设置为11932,中断频率即为100Hz,也就是1秒钟发生100次中断,而11932换算成十六进制数就是0x2e9c。
设置PIT函数,init_pit:
void init_pit(void)
{
io_out8(PIT_CTRL, 0x34);
io_out8(PIT_CNT0, 0x9c);
io_out8(PIT_CNT0, 0x2e);
return;
}
计量时间
我们让这个定时器做点什么吧。定义一个结构体struct TIMERCTL,在这个结构体内定义一个计数变量count。初始化PIT时,将这个计数变量设为0。
每次发生定时器中断时,计数器变量就会增加1,即每秒钟它会增加100。
bootback.h和timer.c节选:
struct TIMERCTL {
unsigned int count;
};
struct TIMERCTL timerctl;
void init_pit(void)
{
io_out8(PIT_CTRL, 0x34);
io_out8(PIT_CNT0, 0x9c);
io_out8(PIT_