Linux:操作系统分析 Chapter5中断和异常 陈香兰(xlanchen@ustc.edu.cn) 计算机应用教研室©计算机学院 嵌入式系统实验室●苏州研究院 中国科学技术大学 Fa112014 October 21,2014 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21,20141760
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Linux操作系统分析 Chapter 5 中断和异常 陈香兰(xlanchen@ustc.edu.cn) 计算机应用教研室@计算机学院 嵌入式系统实验室@苏州研究院 中国科学技术大学 Fall 2014 October 21, 2014 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 1 / 69
Outline 中断信号的作用和处理的一般原则 ② I/0设备如何引起CPU中断 ③x86CPU如何在硬件级处理中断信号 ●中断和异常的硬件处理:进入中断/异常 ●中断和异常的硬件处理:从中断/异常返回 @Linux内核中软件级中断处理及其数据结构 ·初始化中断描述符表 ·低级异常处理 ●低级中断处理 ●Linux体系无关部分的中断管理数据结构 ●do_IRQ的中断处理过程 ⑤Linux的软中断、task1et以及下半部分 o Linux的软中断softirq ●Tasklet ·工作队列和工作线程 作业 4口4四1是4P刀00 东香兰(x1 anchenoustc,edu.cn)(计界丸应 LHux操作系统分折Chapter5中断和齐常 0 ctober21,20142/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Outline 1. 中断信号的作用和处理的一般原则 .2 I/O设备如何引起CPU中断 .3 x86 CPU如何在硬件级处理中断信号 中断和异常的硬件处理:进入中断/异常 中断和异常的硬件处理:从中断/异常返回 4. Linux内核中软件级中断处理及其数据结构 初始化中断描述符表 低级异常处理 低级中断处理 Linux体系无关部分的中断管理数据结构 do_IRQ的中断处理过程 5. Linux的软中断、tasklet以及下半部分 Linux的软中断softirq Tasklet 工作队列和工作线程 .6 作业 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 2 / 69
为什么会有中断? ©内核的一个主要功能就是处理硬件外设I/0 。处理器速度一般比外设快很多 。轮询方式效率不高 ●内核应当处理其它任务,只有当外设莫正完成/准备好了时 才转过来处理外设I0 ●中断机制就是满足上述条件的一种解决办法。 (回忆I0方式:轮询、中断~DMA等) 查看系统中断信息 o cat /proc/interrupts /proc/interrupts: to display every IRQ vector in use by the system 4口4四1是4P刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21,20144/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 为什么会有中断? 内核的一个主要功能就是处理硬件外设I/O 处理器速度一般比外设快很多 轮询方式效率不高 内核应当处理其它任务,只有当外设真正完成/准备好了时 才转过来处理外设IO 中断机制就是满足上述条件的一种解决办法。 (回忆IO方式:轮询、中断、DMA等) . 查看系统中断信息 . . cat /proc/interrupts /proc/interrupts: to display every IRQ vector in use by the system 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 4 / 69
中断和异常 ●中断(广义)会改变处理器执行指令的顺序,通常与CPU 芯片内部或外部硬件电路产生的电信号相对应 。中断一一异步的:(狭义) 由硬件随机产生,在程序执行的任何时候可能出现 。异常一一同步的: 在(特殊的或出错的)指令执行时由CPU控制单元产生 我们用“中断信号”来通称这两种类型的中断 1口4四是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21.20145/6阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断和异常 中断(广义)会改变处理器执行指令的顺序,通常与CPU 芯片内部或外部硬件电路产生的电信号相对应 中断——异步的:(狭义) 由硬件随机产生,在程序执行的任何时候可能出现 异常——同步的: 在(特殊的或出错的)指令执行时由CPU控制单元产生 我们用“中断信号”来通称这两种类型的中断 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 5 / 69
中断信号的作用 。中断信号提供了一种特殊的方式,使得CPU转去运行正常程序 之外的代码 。比如一个外设采集到一些数据,发出一个中断信号,CPU必须 立刻响应这个信号,否则数据可能丢失 。当一个中断信号到达时,CPU必须停止它当前正在做的事,并 切换到一个新的活动以响应这个中断信号 ·为了做到这这一点, 在进程的内核态堆栈中保存程序计数器的当前值(即eip和cs寄存器) 以便处理完中断的时候能正确返回到中断点,并把与中断信号相关 的一个地址放入进程序计数器,从而进入中断的处理 1口t4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和齐常 0 ctober21.20146/6阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断信号的作用 中断信号提供了一种特殊的方式,使得CPU转去运行正常程序 之外的代码 比如一个外设采集到一些数据,发出一个中断信号,CPU必须 立刻响应这个信号,否则数据可能丢失 当一个中断信号到达时,CPU必须停止它当前正在做的事,并 切换到一个新的活动以响应这个中断信号 为了做到这这一点, 在进程的内核态堆栈中保存程序计数器的当前值(即eip和cs寄存器) 以便处理完中断的时候能正确返回到中断点,并把与中断信号相关 的一个地址放入进程序计数器,从而进入中断的处理 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 6 / 69
中断信号的处理原则 ©快! 。当内核正在做一些别的事情的时候,中断会随时到来· 无辜的正在运行的代码被打断 ·中断处理程序在run的时候可能禁止了同级中断 ·中断处理程序对硬件操作,一般硬件对时间也是非常敏感的 ·内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理 向后推迟 。上半部分(top half)和下半部分(bottom half) ©允许不同类型中断的嵌套发生, 这样能使更多的1/0设备处于忙状态 ©尽管内核在处理一个中断时可以接受一个新的中断, 但在内核代码中还在存在一些临界区· 在临界区中,中断必须被禁止 4口4四是4P在刀00 陈香兰(x1 anchenoustc,edu.cn)(计算丸应Linux禄作系统分折Chapter5中断和齐常 0 ctober21.20147/6阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断信号的处理原则 1. 快! 当内核正在做一些别的事情的时候,中断会随时到来。 无辜的正在运行的代码被打断 中断处理程序在run的时候可能禁止了同级中断 中断处理程序对硬件操作,一般硬件对时间也是非常敏感的 内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理 向后推迟 上半部分(top half)和下半部分(bottom half) 2. 允许不同类型中断的嵌套发生, 这样能使更多的I/O设备处于忙状态 3. 尽管内核在处理一个中断时可以接受一个新的中断, 但在内核代码中还在存在一些临界区, 在临界区中,中断必须被禁止 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 7 / 69
中断上下文与进程上下文 。程序的运行必然有上下文,中断处理程序亦然。 。中断上下文不同于进程上下文 。中断或异常处理程序执行的代码不是一个进程 ·它是一个内核控制路径,执行内核代码,在中断发生时 正在运行的进程上下文中执行 ·作为一个内核控制路径,中断处理程序比一个进程要“轻” (中断上下文只包含了很有限的几个寄存器,建立和终止中断上 下文所需要的时间很少) 。假设: 2个interrupt context,记为A和B 2个process,记为C和D 分析A,B,C,D在互相抢占上的关系 1口10是·P在0C 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和齐常 0 ctober21.20148/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断上下文与进程上下文 程序的运行必然有上下文,中断处理程序亦然。 中断上下文不同于进程上下文 中断或异常处理程序执行的代码不是一个进程 它是一个内核控制路径,执行内核代码,在中断发生时 正在运行的进程上下文中执行 作为一个内核控制路径,中断处理程序比一个进程要“轻” (中断上下文只包含了很有限的几个寄存器,建立和终止中断上 下文所需要的时间很少) 假设: 2个interrupt context,记为A和B 2个process,记为C和D 分析A,B,C,D在互相抢占上的关系 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 8 / 69
中断上下文与进程上下文 ●假设某个时刻C占用CPU运行,此时A中断发生, 则C被A抢占,A得以在CPU上执行· 由于Linux不为中断处理程序设置process context,A只能使用 C的kerne1 stack作为自己的运行栈 D进程 current C进程 B中断 A中断 A中断发生 1口t4四1是4200 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21.20148/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断上下文与进程上下文 1. 假设某个时刻C占用CPU运行,此时A中断发生, 则C被A抢占,A得以在CPU上执行。 由于Linux不为中断处理程序设置process context,A只能使用 C的kernel stack作为自己的运行栈 D进程 current → C进程 B中断 A中断 A中断发生 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 8 / 69
中断上下文与进程上下文 无论如何,Linux的interrupt context A绝对不会被某个 进程C或者D抢占!! 这是由于所有已经启动的interrupt contexts,不管是interrupt contexts.之间切换,还是在某个interrupt context中执行代码 的过程,决不可能插入scheduler调度例程的调用。 除非interrupt context主动或者被动阻塞进入睡眠,唤起 scheduler,但这是必须避免的,危险性见第3点说明。 D进程 current C进程 B中断 A中断 A中断发生 4口4四是4P在刀0C 陈香兰(xlanchenoustc,edu,cn)(升算丸应Linux禄作系统分析hapter5中断和并常 0 ctober21.20148/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断上下文与进程上下文 2. 无论如何,Linux的interrupt context A绝对不会被某个 进程C或者D抢占!! 这是由于所有已经启动的interrupt contexts,不管是interrupt contexts之间切换,还是在某个interrupt context中执行代码 的过程,决不可能插入scheduler调度例程的调用。 除非interrupt context主动或者被动阻塞进入睡眠,唤起 scheduler,但这是必须避免的,危险性见第3点说明。 D进程 current → C进程 B中断 A中断 A中断发生 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 8 / 69
中断上下文与进程上下文 ©关于第2点的解释: 首先,interrupt context没有process context,A中断是 “借”了C的进程上下文运行的,若允许A“阻塞”或“睡眠”, 则C将被迫阻塞或睡眠,仅当A被“唤醒”C才被唤醒;而 “唤醒”后,A将按照C在就绪队列中的顺序被调度。这既损害了 A的利益也污染了C的kerne1 stack。 其次,如果interrupt context A由于阻塞或是其他原因睡眠, 外界对系统的响应能力将变得不可忍受 D进程 current→C进程 B中断 A中断 A中断发生 4口4四是4P在刀0C 陈奇兰(xlanchenoustc,edu,cn)(升算丸应Linux操作系统分折Chapter5中断和并常 0 ctober21.20148/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断上下文与进程上下文 3. 关于第2点的解释: 首先,interrupt context没有process context,A中断是 “借”了C的进程上下文运行的,若允许A“阻塞”或“睡眠”, 则C将被迫阻塞或睡眠,仅当A被“唤醒”C才被唤醒;而 “唤醒”后,A将按照C在就绪队列中的顺序被调度。这既损害了 A的利益也污染了C的kernel stack。 其次,如果interrupt context A由于阻塞或是其他原因睡眠, 外界对系统的响应能力将变得不可忍受 D进程 current → C进程 B中断 A中断 A中断发生 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 8 / 69