疯狂内核之中断处理
文章平均质量分 86
yunsongice
这个作者很懒,什么都没留下…
展开
-
中断的分类
这是我们疯狂内核系列的中断处理专题开山之作,中断,广义的来说通常被定义为一个事件,该事件触发改变处理器执行指令的顺序。狭义地来说,针对80x86体系,中断被分为中断和异常,又叫同步中断和异步中断。注意广义的中断和狭义的中断千万不要混淆,以后我的博文中所有所谓的“中断”二字,就是指狭义的中断,即Linux处理80x86异步中断的细节。我们首先必须好好理清一下80x86体系中,中断和异常的区别:原创 2010-02-11 10:53:00 · 5344 阅读 · 0 评论 -
中断的硬件环境
1 IRQ讲到中断的硬件环境,我们先从著名的IRQ信号谈起。每个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。所有现有的IRQ线都与一个名为可编程中断控制器(PIC)的硬件电路的输入引脚相连,可编程中断控制器执行下列动作:1. 监视IRQ线,检查产生的信号。如果有条或两条以上的IRQ线上产生信号,就选择引脚编号较小的IRQ线。2. 如果一个引发信号出现原创 2010-02-11 11:27:00 · 2594 阅读 · 0 评论 -
异常处理
80x86处理器发布了大约20种不同的异常。内核必须为每种异常提供一个专门的异常处理程序。对于某些异常,CPU控制单元在开始执行异常处理程序前会产生一个硬件的错误码(hardware error code),并且压入内核态堆栈。下面列表给出了在80x86处理器中可以找到的异常的向量、名字、类型及其简单描述。更多信息可以在Intel的技术文挡中找到。0 - "Divide error原创 2010-02-11 14:10:00 · 2247 阅读 · 0 评论 -
中断描述符表
好了,现在,我们知道了80x86微处理器在硬件级对中断和异常做了些什么,接下来,我们继续关注的是如何初始化中断描述符表。内核启用中断以前,必须把IDT表的初始地址装到idtr寄存器,并初始化表中的每一项。这项工作是在初始化系统时完成的。int指令允许用户态进程发出一个中断信号,其值可以是0-255的任意一个向量。因此,为了防止用户通过int指令模拟非法的中断和异常,IDT的初始化必原创 2010-02-11 13:55:00 · 3555 阅读 · 0 评论 -
中断处理
上一篇博文里,我们谈到了异常处理,现在我们开始研究一下中断处理的情况。中断处理比异常处理复杂得多,这是因为: 第一,中断的发生对于正在运行的进程无关,被调用的中断处理函数叫做中断服务程序,它运行在内核态并处于系统上下文中(使用内核页表、其为内核代码和内核数据结构),所以中断处理程序不允许被阻塞; 第二,由于硬件资源的限制,比如APIC的IRQ引脚数量有限,一根IRQ信号线需要被几个原创 2010-03-07 13:51:00 · 2483 阅读 · 0 评论 -
下半部分
我们在前面的“中断处理”博文中提到,在由内核执行的几个中断任务之间有些不是紧急的:在必要情况下它们可以延迟一段时间。回忆一下,一个中断处理程序是急迫的,调用do_IRQ将几个中断服务例程串行执行,并且通常在一个中断的处理程序结束前,不应该再次出现这个中断,我们叫它“上半部分”。相反,可延迟中断可以在开中断的情况下执行。把可延迟中断从中断处理程序中抽出来有助于使内核保持较短的响应时间。 Li原创 2010-03-07 16:26:00 · 3337 阅读 · 1 评论 -
定时器中断
走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。 在当前的80x86体系结构上,内核显式地与几种时钟和定时器电路打交道,其主要分为了时钟和定时器两大类:- 时钟电路同时用于跟踪当前时间和产生精确的时间度量。- 定时器电路由内核编程,所原创 2010-03-07 17:54:00 · 7695 阅读 · 2 评论 -
中断处理(续)
上一篇博文我们把中断原理和中断处理所需要的数据结构清理了一遍,现在,我们就该看看中断处理的具体动作是怎样的了。 当CPU接收一个中断时,就开始执行相应的中断处理程序代码,前面介绍过了,该代码的地址存放在IDT的相应门中。于是,与其他上下文切换一样,Linux需要保留当前寄存器的内容以便保存和恢复当前指令。 保存寄存器是中断处理程序做的第一件事情。每个IRQ的中断处理程序地址存放于i原创 2010-03-07 15:28:00 · 2786 阅读 · 1 评论