中断信号的处理原则 ©快! 。当内核正在做一些别的事情的时候,中断会随时到来· 无辜的正在运行的代码被打断 ·中断处理程序在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