在进入时间子系统需要了解的--理论 - D0
- 中断
- <u>中断上半部</u>:设备产生中断 - 中断处理程序处理
其特点为
- 中断处理程序执行期间,所有其他中断被禁止。
- 由于0.的存在本处理程序具有严格的时间限制。
- 执行期间处理器处于<u>中断上下文</u>。
- 中断处理程序的实现机制有平台相关性。
- <u>中断下半部</u>:执行“与中断处理密切相关但中断处理程序本身不执行的工作”
中断下半部的实现机制有:软中断、tasklet、工作队列。
- 上下文?
中断上下文和进程上下文:
- 处理器总处于以下三种状态之一 1. 内核态,运行于进程上下文,内核代表进程运行于内核空间; 2. 内核态,运行于中断上下文,内核代表硬件运行于内核空间;3. 用户态,运行于用户空间。
- 用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递 很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存 器值、变量等。所谓的<u>“进程上下文”</u>,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
- 硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的 一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的<u>“ 中断上下文”</u>,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
- 运行在进程上下文的内核代码是可以被抢占的(Linux2.6支持抢占)。但是一个中断上下文,通常都会始终占有CPU(当然中断可以嵌套,但我们一般不这样做),不可以被打断。正因为如此,运行在中断上下文的代码就要受一些限制,不能做下面的事情:1、睡眠或者放弃CPU。这样做的后果是灾难性的,因为内核在进入中断之前会关闭进程调度,一旦睡眠或者放弃CPU,这时内核无法调度别的进程来执行,系统就会死掉. 2、尝试获得信号量 如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况. 3、执行耗时的任务 中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。4、访问用户空间的虚拟地址 因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中端上下文无法访问用户空间的虚拟地址
- 关于current:进程上下文中引用有意义,中断上下文引用无意义。
- 关于上下文的切换:只能发生在内核态。
- 锁?
- spin_lock:
- 堆栈是什么?
- what is "cache line" ?
- 通知链技术
参考文献:
<a href=http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint>ibmlinux内核中断内幕</a>
<a href=http://blog.chinaunix.net/uid-24919665-id-3018666.html>linux内核设计与实现笔记---下半部和推后执行的工作</a>
<a href=http://www.cnblogs.com/hustcat/articles/1505618.html>进程上下文和中断上下文</a>