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

📄 interrupt-handling_4.htm

📁 编写自己的操作系统
💻 HTM
📖 第 1 页 / 共 3 页
字号:
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">&nbsp;</P></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN>
<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">由于Fault类的Exception是一种可恢复异常,其ISR就是为了处理造成异常的条件,等处理结束后,CPU会返回重新执行那条引起异常的指令。一个最常用的例子是Page-fault 
Exception——当系统引用一个Page时,如果这个Page不在RAM中,会引起Page-fault 
Exception,而其ISR所作的就是将这个Page以某种算法调入RAM,这时候,引起Exception的条件已经解除了,当ISR结束之后,重新去执行那条引用此Page的指令,就不会再引起任何异常。所以,对于Fault类Exception,当发生时,在Stack中保存的CS和EIP的内容应该是那条引起Exception的那条指令的位置。</FONT></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 TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN>&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><FONT face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT 
face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1">而Trap类Exceptions用于在进行下一步操作之前的条件检查,比如INTO指令用于在执行下一条指令之前检查EFLAGS的OF 
flag,如果OF flag被设置,则引起一个Overflow 
Exception;再比如BOUND指令用于在进行数组操作之前检查一个对某个数组的索引是否越界,一旦越界,则会引起一个Bound Range Exceed 
Exception;而这些Exceptions的ISR被用作消除这些引起异常的条件,然后指令从下一条继续执行。另外,Trap类Exception也被用作调试目的,如INT 
1和INT 3,一旦执行这两个指令,则会引起一个Debug Exception或Breakpoint 
Exception;这时候ISR的目的被用作暂时阻塞当前任务的运行,等阻塞解除后,任务可以从下一条指令继续进行。这里所说的"下一条",指的不是指令物理顺序,而是指令执行顺序的。比如一个JMP指令执行时发生Trap 
Exception异常,那么等ISR执行结束后,继续执行的是JMP指令要跳转去的位置的那条指令。</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 TUR" size=3><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN>&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><FONT face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1">Abort类的Exception不支持可靠的Task Restart。Abort 
ISR被设计为用来收集关于Abort 
Exception发生时的诊断信息,然后尽可能优雅的当掉Application和系统。</SPAN></FONT></SPAN><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"></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3">&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3">Interrupts严格的支持被中断程序的Restart。被保存在Stack中的CS, 
EIP内容指向Interrupt发生时执行结束的那条指令之后的那条指令。如果当时被执行的指令有循环前缀(比如REP),则CPU会等到当前这次循环结束,相关寄存器被设置为下一次循环的内容之后,才会引发Interrupt。</P></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN>
<P>
<HR width="100%" SIZE=2>
<STRONG><FONT face="Times New Roman" size=5></FONT></STRONG>
<P></P>
<P></P>
<P><FONT face="Times New Roman" size=5><STRONG></STRONG></FONT></P><SPAN 
lang=EN-US><FONT face="Times New Roman"><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.4.4 Error Code</STRONG><SPAN 
lang=EN-US><FONT face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"> 
</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>&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><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">如果一个Exception 
Condition与一个段相关的时候,那么当这个Exception发生的时候,CPU会将一个Error 
Code压入ISR所使用的Stack中。</FONT></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"></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN>&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><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">Error 
Code的格式如下图所示:</FONT></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" 
align=center><SPAN lang=EN-US><FONT face="Times New Roman" size=5><SPAN 
style="mso-tab-count: 1"><IMG src="interrupt-handling_4.files/error_code.gif" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/handling/error_code.gif"></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" 
align=center><SPAN lang=EN-US><FONT face="Times New Roman" size=5><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN></P><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">
<UL>
  <LI><STRONG>EXT</STRONG> - 
  </FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">External 
  event (bit 0). </FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">如果EXT被设置,则表示一个<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">External 
  event引起了这个Exception。比如一个硬件中断。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN> 

  <LI><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><FONT face="Times New Roman" 
  size=5><SPAN 
  style="mso-tab-count: 1"></SPAN></FONT></SPAN></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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"><STRONG>IDT</STRONG> - Descriptor location (bit 1). 
  </FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">如果IDT被设置,表示这个Error Code中的Segment Select 
  Index引用的是一个IDT中的Gate 
  Descriptor。否则,则表示引用的是一个GDT或当前LDT中的一个Descriptor。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN> 

  <LI><SPAN lang=EN-US><FONT face="Times New Roman" size=5><SPAN 
  style="mso-tab-count: 1"></SPAN></FONT></SPAN><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"><STRONG>TI</STRONG> - GDT/LDT (bit 2). 
  </FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">如果IDT 
  bit被清除时,才使用这个bit来进一步区分Segment Select 
  Index引用的是GDT还是本地LDT中的Descriptor。被设置则表示本地LDT,否则表示GDT。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></LI></UL><SPAN 
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1">
<P><BR>当一个带有Error Code的Exception发生时,一个Error 
Code会被压入栈顶,但必须注意的是,IRET指令并不Pop,所以ISR程序在执行IRET之前必须明确的删除它。</P>
<P>当一个Exception是通过INT n指令产生的时候,即使对于那些产生Error Code的异常来说,CPU也不会将Error 
Code压栈。<BR></P></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></BODY></HTML>

⌨️ 快捷键说明

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