📄 interrupt-priority_3.htm
字号:
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++的inline函数:</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">inline void
sti(void)</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"> __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">}</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">inline void
cli(void)</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"> __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></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">IF位还受下列情况的影响:</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<UL>
<LI><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">PUSHF指令将所有的flags存入Stack中,在Stack中flags可以被检测和修改。然后POPF指令会将这些修改过的flags放入EFLAGS寄存器。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT>
<LI><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><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">任务切换,以及POPF和IRET指令会引起内存中的值装入EFLAGS寄存器,因此,它们可以被用来修改IF位的设置。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT>
<LI><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><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">当一个Interrupt通过一个Interrupt Gate处理时,为了屏蔽掉所有的Maskable
Hardware Interrupts,IF flag会被自动清除。但如果一个中断通过一个Trap Gate处理时,IF
flag不受影响。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></LI></UL>
<P><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.2
Masking Instruction Breakpoints</STRONG></SPAN></FONT></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
size=4><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Times New Roman TUR" size=3>EFLAGS寄存器的RF位被用来控制CPU对Instruction Breakpoints
Condition的响应。如果被设置,则禁止Instruction Breakpoints产生Debug
Exceptions;如果被清除,则Instruction Breakpoints将会产生Debug
Exceptions。</FONT></SPAN></SPAN></SPAN></SPAN></SPAN></FONT></SPAN></SPAN></SPAN></P><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT size=4><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman TUR"
size=3>
<P><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.3
Masking Exceptions & Interrupts when Switching
Tasks</STRONG></SPAN></FONT></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
size=4><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Times New Roman TUR" size=3>为了切换到一个不同的Stack
Segment,通常会使用下面一对指令:</FONT></SPAN></SPAN></SPAN></SPAN></SPAN></FONT></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">movw %ax, %ss<BR>movl
$stack_top, %esp</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">如果在这个segment
selector被装入SS寄存器之后,在ESP寄存器被装入之前,一个Interrupt/Exception恰好发生了,由于一个Stack是由SS和ESP两个寄存器决定的,那么在这个刚刚发生的Interrupt/Exception的ISR执行期间,这个Stack可能处于一种不合法的状态。</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">为了避免这种情况,CPU在执行了一个MOV to SS指令,或一个POP
to SS指令之后,会禁止:</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">
<UL>
<LI>所有的Interrupts(包括著名的NMI);
<LI></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">debug
exceptions;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>
<LI><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN
style="mso-tab-count: 1"></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">single-step trap
exceptions</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></LI></UL>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN
style="mso-tab-count: 1">知道下一条指令被执行完毕之后(不管下一条指令是什么)为止。</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN
style="mso-tab-count: 1">在这个期间,其它的Exceptions仍然可以被生成。 </SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN
style="mso-tab-count: 1">如果使用LSS指令来修改SS寄存器,这个问题就不存在。并且这种方法也是被Intel建议用来修改SS寄存器的方法。</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN
style="mso-tab-count: 1"></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN> </P></FONT></SPAN></SPAN></SPAN></SPAN></SPAN></FONT></SPAN></SPAN></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -