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

📄 interrupt-priority_3.htm

📁 编写自己的操作系统
💻 HTM
📖 第 1 页 / 共 3 页
字号:
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>&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">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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __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>&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">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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __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>&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位还受下列情况的影响:</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 &amp; 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&nbsp;&nbsp; 
$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仍然可以被生成。&nbsp;</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>&nbsp;</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 + -