📄 interrupt-priority_3.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://www.huihoo.com/gnu_linux/own_os/interrupt-priority_3.htm -->
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT
face="Times New Roman" size=6><SPAN style="mso-tab-count: 1"><STRONG>2.3
Priority & Control</STRONG></SPAN></FONT></SPAN></P><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1">
<P>
<P><FONT size=3>[</FONT><A
href="index.htm"
tppabs="http://pagoda-ooos.51.net/os_book/index.htm"><FONT
size=3>Home</FONT></A><FONT size=3>] [</FONT><A
href="interrupt_and_exception.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt_and_exception.htm"><FONT
size=3>Top</FONT></A><FONT size=3>] [</FONT><A
href="interrupt-vectors_2.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-vectors_2.htm"><FONT
size=3>Previous</FONT></A><FONT size=3>] [</FONT><FONT size=3><A
href="interrupt-handling_4.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-handling_4.htm">Next</A>]</FONT></P>
<P><STRONG>
<HR width="100%" SIZE=2>
</STRONG>
<P></P>
<P></P></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR" size=5><STRONG>2.3.1 Overview</STRONG></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT face=宋体><FONT size=3><FONT
face="Times New Roman TUR"></FONT></FONT></FONT></SPAN></FONT></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT face=宋体><FONT size=+0><FONT size=3><FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>有很多种,当一个<FONT
face="Times New Roman TUR">Interrupt/Exception</FONT>发生时,系统会自动调用它的<FONT
face="Times New Roman TUR">ISR</FONT>,在<FONT
face="Times New Roman TUR">ISR</FONT>被执行期间,可能会发生新的<FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>,这样,<FONT
face="Times New Roman TUR">ISR</FONT>的执行就会被新的<FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>打断,而新的<FONT
face="Times New Roman TUR">ISR</FONT>会被执行,当新的<FONT
face="Times New Roman TUR">ISR</FONT>被执行结束之后,再继续执行旧的<FONT
face="Times New Roman TUR">ISR</FONT>。这就是<FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>的嵌套问题。</FONT></FONT></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><IMG src="interrupt-priority_3.files/int_iter.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/priority/int_iter.gif"></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3>这种嵌套可以有很多层,甚至可以无穷嵌套下去——如果中断发生的频率超过<FONT
face="Times New Roman TUR">ISR</FONT>执行速度的话——但这种情况一般不会发生,因为<FONT
face="Times New Roman TUR">ISR</FONT>一般都写的非常短小。但如果发生多层嵌套,有时候会存在问题。比如,当<FONT
face="Times New Roman TUR">OS</FONT>正在运行的时候,<FONT
face="Times New Roman TUR">CPU检测到一个内部总线错误</FONT>,引发了一个<FONT
face="Times New Roman TUR">Machine-Check Exception</FONT>,这个时候,<FONT
face="Times New Roman TUR">CPU</FONT>应该马上来处理这个<FONT
face="Times New Roman TUR">Exception</FONT>。但当<FONT
face="Times New Roman TUR">CPU</FONT>正在执行这个<FONT
face="Times New Roman TUR">Exception</FONT>的<FONT
face="Times New Roman TUR">ISR</FONT>的时候,又接到多个键盘<FONT
face="Times New Roman TUR">Interrupt</FONT>。这个时候硬件(内部总线)已经发生了错误,<FONT
face="Times New Roman TUR">CPU</FONT>应该优先解决这个错误,如果这时候<FONT
face="Times New Roman TUR">CPU</FONT>转而去处理键盘<FONT
face="Times New Roman TUR">Interrupt</FONT>的话,可能会引发灾难性的后果。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3>针对这种情况,一个方法还起来好像能够解决这个问题,那就是,当一个<FONT
face="Times New Roman TUR">Interrupt/Exception</FONT>的<FONT
face="Times New Roman TUR">ISR</FONT>正在被执行的时候,不响应任何其它<FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>,也就是说<FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>应该被一个一个按照<FONT
face="Times New Roman TUR">FIFO(First In, First Out)</FONT>的原则处理。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3>但不幸的是,这样仍然存在问题。我们将上一个例子反过来:当<FONT
face="Times New Roman TUR">CPU</FONT>正在处理一个<FONT
face="Times New Roman TUR">Keyboard Interrupt</FONT>的时候,<FONT
face="Times New Roman TUR">CPU</FONT>突然检测到一个内部总线错误,引发一个<FONT
face="Times New Roman TUR">Machine-Check Exception</FONT>,这个时候<FONT
face="Times New Roman TUR">CPU</FONT>应该马上去处理这个<FONT
face="Times New Roman TUR">Exception</FONT>,而不是继续处理<FONT
face="Times New Roman TUR">Keyboard Interrupt</FONT>。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face=宋体 size=3>从上面两个例子可以看出,那个<FONT face="Times New Roman TUR">Machine-Check
Exception</FONT>总是应该比<FONT face="Times New Roman TUR">Keyboard
Interrupt</FONT>优先处理。所以我们需要为不同的<FONT
face="Times New Roman TUR">Interrupts/Exceptions</FONT>定义不同的<FONT
face="Times New Roman TUR">Priority</FONT>。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><STRONG></P>
<P>
<HR width="100%" SIZE=2>
</STRONG>
<P></P>
<P></P>
<P><STRONG></STRONG></P><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR" size=5><STRONG>2.3.2 Priority</STRONG></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><STRONG><FONT
face="Times New Roman TUR"></FONT></STRONG></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><FONT
face="Times New Roman TUR">当多个Interrupts/Exceptions同时或在很短的时间内相继发生的时候,Intel
80x86芯片可以以一种可以预知的顺序来先后处理它们。能够预知的原因就是每个Interrupt/Exception都有自己的Priority。对于这批Interrrupts/Exceptions,CPU优先执行高优先级的,对于相同优先级的,CPU以FIFO的顺序执行它们。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">对于所有可能的Interrupts/Exceptions,Intel为它们定义了各自的Priority。这些Priority分类按照Interrupts/Exceptions的来源进行。下表总结了这些分类:</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"><IMG src="interrupt-priority_3.files/ie_prior.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/priority/ie_prior.gif"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体
size=3>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><FONT
face="Times New Roman TUR"></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -