您的位置:首页 > 其它

《一个操作系统的实现》总结2——中断处理

2013-05-02 18:38 183 查看
二、中断处理程序

1、时钟中断
kernel/clock.c:
PUBLIC void clock_handler(int irq)
{
	if (++ticks >= MAX_TICKS)
		ticks = 0;

	if (p_proc_ready->ticks)
		p_proc_ready->ticks--;

	if (key_pressed)
		inform_int(TASK_TTY);

	if (k_reenter != 0) {
		return;
	}

	if (p_proc_ready->ticks > 0) {
		return;
	}

	schedule();

}


调度函数schedule()在kernel/proc.c:
PUBLIC void schedule()
{
	struct proc*	p;
	int		greatest_ticks = 0;
/***每个进程都有一个ticks数,每个tick代表一次时钟中断的时间,也就是说每个进程都有ticks个时间片的执行时间,而且ticks越大优先级越高,这里就是选ticks最大的进程执行。schedule()会选择一个将要执行的进程赋值到p_proc_ready,在时钟中断返回时就会跳入到p_proc_ready所指向的进程执行。当greatest_ticks变为0时代表所有进程都已经用完自己的时间片,此时会给所有进程重新赋予时间片,进而重新执行。***/
	while (!greatest_ticks) {
		for (p = &FIRST_PROC; p <= &LAST_PROC; p++) {
			if (p->p_flags == 0) {
				if (p->ticks > greatest_ticks) {
					greatest_ticks = p->ticks;
					p_proc_ready = p;
				}
			}
		}

		if (!greatest_ticks)
			for (p = &FIRST_PROC; p <= &LAST_PROC; p++)
				if (p->p_flags == 0)
					p->ticks = p->priority;
	}
}


2、键盘中断

我只说一下大体的处理流程,键盘中断处理程序负责读取按键并写入一个循环队列缓冲区中。(它只负责解释和存放键值,之后的处理是由task_tty从缓冲区中取出数据并处理。 )
键盘中断涉及到一些硬件的细节,要读写端口、通过一张map来对应数值和按键,另外还涉及多个按键等,较为复杂,具体的处理请参见第7章。


3、硬盘中断
硬盘中断的处理很简单,就是给task_hd发送一个中断消息,使task_hd知道数据已经准备好。在硬盘没有进行读写时是不会出现硬件中断的,只有在对硬盘处理的函数中进行interrupt_wait时才会出现。
节自kernel/hd.c:

PUBLIC void hd_handler(int irq)
{
	/*
	 * Interrupts are cleared when the host
	 *   - reads the Status Register,
	 *   - issues a reset, or
	 *   - writes to the Command Register.
	 */
	hd_status = in_byte(REG_STATUS);

	inform_int(TASK_HD);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐