《一个操作系统的实现》总结2——中断处理
2013-05-02 18:38
183 查看
二、中断处理程序
1、时钟中断
kernel/clock.c:
调度函数schedule()在kernel/proc.c:
2、键盘中断
我只说一下大体的处理流程,键盘中断处理程序负责读取按键并写入一个循环队列缓冲区中。(它只负责解释和存放键值,之后的处理是由task_tty从缓冲区中取出数据并处理。 )
键盘中断涉及到一些硬件的细节,要读写端口、通过一张map来对应数值和按键,另外还涉及多个按键等,较为复杂,具体的处理请参见第7章。
3、硬盘中断
硬盘中断的处理很简单,就是给task_hd发送一个中断消息,使task_hd知道数据已经准备好。在硬盘没有进行读写时是不会出现硬件中断的,只有在对硬盘处理的函数中进行interrupt_wait时才会出现。
节自kernel/hd.c:
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); }
相关文章推荐
- 一个操作系统的实现(于渊)———前七章总结
- orange's一个操作系统的实现实验遇到的问题及处理方法
- 一个操作系统的实现-笔记-开启时钟中断
- 《一个操作系统的实现》(三):4.中断和异常&5.保护模式下的I/O
- 一个操作系统的实现(10)-中断和异常的补充说明
- 一个操作系统的实现(9)-中断和异常
- 《一个操作系统的实现》(三):4.中断和异常&5.保护模式下的I/O
- Linux内核的设计与实现 读书笔记(7)中断处理
- 《一个操作系统的实现》阅读笔记 之 保护模式
- C#实现让程序只能打开一个实例(总结3方法)(转)
- java实现从一个数据库查询数据经过处理导入另外一个数据库中
- java开发系统内核:使用一个中断实现多个API调用
- 【NROS-00】自己实现一个简单操作系统
- 一个简单的混音播放器,处理中断
- asp.net 读取一个文本文件,并输出到网页显示 通过 一般处理程序实现
- 一个操作系统的实现(2)-认识保护模式
- 配置实现-一个信息管理类项目的实践总结
- winform实现让程序只能打开一个实例(总结3方法)
- 自我学习总结2:在各个网页基本上一致时,通过URL传一个值就可以实现一个html实现多个页
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群