⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt-priority_3.htm

📁 编写自己的操作系统
💻 HTM
📖 第 1 页 / 共 3 页
字号:
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">当一个Interrupt/Exception正在被处理时,如果又发生了其它Interrupts/Exceptions,CPU会去查看它们中间是否存在着比当前正在处理的Interrupt/Exception 
优先级更高的,如果存在,则保留当前中断处理的Context,然后从这些Interrupts/Exceptions中挑选一个优先级最高的,并开始处理它。然后,剩下的那些未被处理的Exceptions将被丢弃,未被处理的Interrupts则继续处于Pending状态,等待被处理。那些被丢弃的Exceptions,都是由软件引起的(由硬件引起的Exceptions具有最高的Priority,永远不可能被丢弃),所以,等所有的Interrupts/Exceptions被处理结束时候,执行点会重新回到那些引起这些Exceptions的点,那时候,Exceptions会被重新生成并被处理。</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>&nbsp;</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">下图表现了CPU的指令循环(Instruction 
Cycle):</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/flowchrt.gif" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/priority/flowchrt.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>
<P>
<HR width="100%" SIZE=2>

<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.3 Control - Disable &amp; Enable 
Interrupts</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>&nbsp;</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">依赖于状态寄存器EFLAGS的IF和RF位的设置,CPU可以禁止一些Interrupts的发生。</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>&nbsp;</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><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=4><SPAN style="mso-tab-count: 1"><STRONG>2.3.3.1 
Masking Maskable Hardware 
Interrupts</STRONG></SPAN></FONT></SPAN></SPAN></SPAN></SPAN></FONT></SPAN></P></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><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"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><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">
<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>&nbsp;</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"><SPAN lang=EN-US><SPAN 
style="mso-tab-count: 1"><SPAN lang=EN-US><FONT face="Times New Roman TUR" 
size=4><SPAN style="mso-tab-count: 1"><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">EFLAGS寄存器的</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></SPAN></SPAN>IF位的设置可以决定是否屏蔽那些来自于INTR 
pin的中断。</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>&nbsp;</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">如果IF位被清除,CPU会禁止外部中断传递给INTR 
pin;</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><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">如果IF位被设置,CPU则允许外部中断传递给INTR pin。INTR 
pin外接PIC-8259A。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><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">IF位的设置不影响NMI,也不影响处理器产生的Exceptions。当CPU被Reset之后,IF位被清除。</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>&nbsp;</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">通过STI(Set 
Interrupt-Enable Flag)和CLI(Clear Interrupt 
Flag)指令可以设置和清除IF位。但在执行这些指令时,必须保证当前CPL小于或等于IOPL;如果CPL &gt; IOPL,则会产生一个General 
Protection Exception。</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>&nbsp;</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">我们可以使用C的Macro实现这两个操作:</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>&nbsp;</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">#define sti() 
__asm__ __volatile__ ("sti": : 
:"memory")</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">#define cli() 
__asm__ __volatile__ ("cli": : 
:"memory")</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>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -