范德萨发而为
全部博文(392)
分类:
2009-12-13 23:34:08
4.6.7 中断描述符表
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT 不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以 IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设 置其存在位(标志)为0。
IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长 度(限长)值,如图4-26所示。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。
图4-26 中断描述符表IDT和寄存器IDTR |
LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令 仅能由当前特权级CPL是0的代码执行,通常被用于创建IDT时的操作系统初始化代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。 该指令可在任何特权级上执行。
如果中断或异常向量引用的描述符超过了IDT的界限,处理器会产生一个一般保护性异常。
4.6.8 IDT描述符
IDT表中可以存放3种类型的门描述符:中断门(Interrupt gate)描述符、陷阱门(Trap gate)描述符、任务门(Task gate)描述符。
图4-27给出了这三种门描述符的格式。中断门和陷阱门含有一个长指针(即段选择符和偏移值),处理器使用这个长指针把程序执行权转移到代码段中异 常或中断的处理过程中。这两个段的主要区别在于处理器操作EFLAGS寄存器IF标志上。IDT中任务门描述符的格式与GDT和LDT中任务门的格式相 同。任务门描述符中含有一个任务TSS段的选择符,该任务用于处理异常或中断。
图4-27 中断门、陷阱门和任务门描述符格式 |
4.6.9 异常与中断处理
处理器对异常和中断处理过程的调用操作方法与使用CALL指令调用程序过程和任务的方法类似。当响应一个异常或中断时,处理器使用异常或中断的向量 作为IDT表中的索引。如果索引值指向中断门或陷阱门,则处理器使用与CALL指令操作调用门类似的方法调用异常或中断处理过程。如果索引值指向任务门, 则处理器使用与CALL指令操作任务门类似的方法进行任务切换,执行异常或中断的处理任务。
异常或中断门引用运行在当前任务上下文中的异常或中断处理过程,如图4-28所示。门中的段选择符指向GDT或当前LDT中的可执行代码段描述符。门描述符中的偏移字段指向异常或中断处理过程的开始处。
(点击查看大图)图4-28 中断过程调用 |
当处理器执行异常或中断处理过程调用时会进行以下操作:
(1)如果处理过程将在高特权级(如0级)上执行时就会发生堆栈切换操作。堆栈切换过程如下:
处理器从当前执行任务的TSS段中得到中断或异常处理过程使用的堆栈的段选择符和栈指针(例如tss.ss0、tss.esp0)。然后处理器会把被中断程序(或任务)的栈选择符和栈指针压入新栈中,如图4-29所示。
图4-29 转移到中断处理过程时堆栈的使用方法 |
接着处理器会把EFLAGS、CS和EIP寄存器的当前值也压入新栈中。
如果异常会产生一个错误号,那么该错误号也会被最后压入新栈中。
(2)如果处理过程将在被中断任务同一个特权级上运行,那么:
处理器把EFLAGS、CS和EIP寄存器的当前值保存在当前堆栈上。
如果异常会产生一个错误号,那么该错误号也会被最后压入新栈中。
为了从中断处理过程中返回,处理过程必须使用IRET指令。IRET指令与RET指令类似,但IRET还会把保存的寄存器内容恢复到EFLAGS 中。不过只有当CPL是0时才会恢复EFLAGS中的IOPL字段,并且只有当CPL不大于IOPL时,IF标志才会被改变。 如果当调用中断处理过程时 发生了堆栈切换,那么在返回时IRET指令会切换到原来的堆栈。
(1)异常和中断处理过程的保护
异常和中断处理过程的特权级保护机制与通过调用门调用普通过程类似。处理器不允许把控制转移到比CPL更低特权级代码段的中断处理过程中,否则将产生一个一般保护性异常。另外,中断和异常的保护机制在以下方面与一般调用门过程不同:
因为中断和异常向量没有RPL,因此在隐式调用异常和中断处理过程时不会检查RPL。
只有当一个异常或中断是由INT n、INT 3或INT 0指令产生时,处理器才会检查中断或陷阱门中的DPL。此时CPL必须小于或等于门的DPL。这个限制可以防止运行在特权级3的应用程序使用软件中断访问 重要的异常处理过程,例如页错误处理过程,假设这些处理过程已被存放在更高特权级的代码段中。对于硬件产生的中断和处理器检测到的异常,处理器会忽略中断 门和陷阱门中的DPL。
因为异常和中断通常不会定期发生,因此这些有关特权级的规则有效地增强了异常和中断处理过程能够运行的特权级限制。我们可以利用以下技术之一来避免违反特权级保护:
异常或中断处理程序可以存放在一个一致性代码段中。这个技术可以用于只需访问堆栈上数据的处理过程(如除出错异常)。如果处理程序需要数据段中的数据,那么特权级3必须能够访问这个数据段。但这样一来就没有保护可言了。
处理过程可以放在具有特权级0的非一致代码段中。这种处理过程总是可以执行的,与被中断程序或任务的当前特权级CPL无关。
(2)异常或中断处理过程的标志使用方式
当通过中断门或陷阱门访问一个异常或中断处理过程时,处理器会在把EFLAGS寄存器内容保存到堆栈上之后清除EFLAGS中的TF标志。清除TF标志可以防止指令跟踪影响中断响应。而随后的IRET指令会用堆栈上的内容恢复EFLAGS的原TF标志。
中断门与陷阱门唯一的区别在于处理器操作EFLAGS寄存器IF标志的方法。当通过中断门访问一个异常或中断处理过程时,处理器会复位IF标志以防 止其他中断干扰当前中断处理过程。随后的IRET指令则会用保存在堆栈上的内容恢复EFLAGS寄存器的IF标志。而通过陷阱门访问处理过程并不会影响 IF标志。
(3)执行中断处理过程的任务
当通过IDT表中任务门访问异常或中断处理过程时,就会导致任务切换。从而可以在一个专用任务中执行中断或异常处理过程。IDT表中的任务门引用 GDT中的TSS描述符。切换到处理过程任务的方法与普通任务切换一样。由于本书讨论的Linux操作系统没有使用这种中断处理方式,因此这里不再赘述。
4.6.10 中断处理任务
当通过IDT中任务门来访问异常或中断处理过程时就会导致任务切换。使用单独的任务来处理异常或中断有如下好处:
被中断程序或任务的完整上下文会被自动保存。
在处理异常或中断时,新的TSS可以允许处理过程使用新特权级0的堆栈。在当前特权级0的堆栈已毁坏时如果发生了一个异常或中断,那么在为中断过程提供一个新特权级0的堆栈条件下,通过任务门访问中断处理过程能够防止系统崩溃。
通过使用单独的LDT给中断或异常处理任务独立的地址空间,可以把它与其他任务隔离开来。
使用独立任务处理异常或中断的不足之处是:在任务切换时必须对大量机器状态进行保存,使得它比使用中断门的响应速度要慢,导致中断延时增加。
IDT中的任务门会引用GDT中的TSS描述符,如图4-30所示。切换到句柄任务的过程与普通任务切换过程相同。到被中断任务的反向链接会被保存在句柄任务TSS的前一任务链接字段中。如果一个异常会产生一个出错码,则该出错码会被复制到新任务堆栈上。
图4-30 中断处理任务切换 |
当异常或中断句柄任务用于操作系统中时,实际上有两种分派调度任务的机制:操作系统软件调度和处理器中断机制的硬件调度。使用软件调度方法时需要考虑到中断开启时采用中断处理任务。
chinaunix网友2009-12-18 23:45:41
这位兄弟,最近部门在针对合适人选内部推荐,这次机会较好,真诚希望你或者这里的朋友能关注下: ------------------------------------------------------------------------------------------- 全球TOP3通信公司创新项目招募人才(机会较好,待遇从优) 地点:上海 包括但不限于以下方面:(1)嵌入式技术和linux开发(2)编译环境开发(3)应用和业务软件开发(4)浏览器和互联网技术(5)媒体平台:媒体技术和算法(6)通信协议:传输,组网以及协议开发等 招聘范围:中高级技术专家,技术带头人,3年以上工作经验 待遇:从优,只要您有实力,待遇一切可谈 关于我们:提供一个良好的技术和开发环境,提供优越的个人发展空间通道以及完善的培训制度,个人配股激励计划。 若有任何疑问或者兴趣,欢迎邮件:BlankHt@163.com 静候您或者您的朋友回音。