【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-5
文件下载与邀请翻译者
学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。
讲解下载英特尔开发手册的文章
翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么,欢迎你的加入。
另外,我不仅仅是打算翻译这一种手册,以后,可能还需要去翻译许多的英文技术文档,以支持系统底层的教学,培养系统底层程序员。
我有钱了以后,应该是会出私钱来请人翻译一批英文技术文档。当前,暂时没钱,若是有志愿加入的,欢迎啊。
本节翻译
【原文】2.1.4. Interrupt and Exception Handling
External interrupts, software interrupts, and exceptions are handled through the Interrupt descriptor table (IDT), see Figure 2-1. The IDT contains a collection of gate descriptors, which provide access to interrupt and exception handlers. Like the GDT, the IDT is not a segment. The linear address of the base of the IDT is contained in the IDT register (IDTR).
【翻译】2.1.4. 中断和异常处理
外部中断、软件中断和异常是通过中断描述符表(IDT)处理的,如图2-1所示。IDT包含一组门描述符,提供对中断和异常处理程序的访问。像GDT一样,IDT不是一个片段。IDT基址的线性地址包含在IDT寄存器(IDTR)中。
【原文】The gate descriptors in the IDT can be of the interrupt-, trap-, or task-gate type. To access an interrupt or exception handler, the processor must first receive an interrupt vector (Interrupt number) from internal hardware, an external interrupt controller, or from software by means of an INT, INTO, INT 3, or BOUND instruction. The interrupt vector provides an index into the IDT to a gate descriptor. If the selected gate descriptor is an interrupt gate or a trap gate, the associated handler procedure is accessed in a manner very similar to calling a procedure through a call gate. If the descriptor is a task gate, the handler is accessed through a task switch.
【翻译】IDT中的门描述符可以是中断门、陷阱门或任务门类型。为了访问中断或异常处理程序,处理器必须首先从内部硬件、外部中断控制器或通过INT、INTO、INT 3或BOUND指令从软件接收一个中断向量(中断号)。中断向量提供IDT到门描述符的索引。如果选择的门描述符是中断门或陷阱门,则以与通过调用门调用过程非常相似的方式访问相关的处理程序过程。如果描述符是任务门,则通过任务切换来访问处理程序。
【讲评】在这里,谈到了中断向量的问题。我担心翻译文字没有说明白,所以,再来梳理一下。中断向量号,可以通过内部硬件或者外部中断控制器来获得。如果某一个中断,属于是硬件中断,且为可屏蔽中断,并且它连接到了可编程中断控制器 8259A上,那么,传递到处理器的中断向量号,则是8259A给出。如果是硬件中断,且为非屏蔽中断,那么,它的中断,固定地就是2号,且不是通过8259A等等的外部中断控制器传递进来。像是除0错误,无效的TSS等,均是通过内部硬件传递中断向量号的。
软件中断,这个呢,就是通过汇编指令,程序员主动发起的中断。在Linux里面,int 0x80,可以发起系统调用。系统调用,就是软中断。学习8086汇编是,在学习王爽老师的教材时,里面有BIOS中断,有DOS中断,这些个中断,都是通过【int n】指令发起的,这都是软件中断,都是程序员主动发起的。【int n】里面,n是一个整数,是中断向量号。
手册里面,还有提到了【into】,【int3】,【bound】等等的指令,这些指令也能发起软件中断。不过,以我目前的学习经验来讲,这三个东西,我还没有用到过。
至于【int n】,这个东西,我倒是用过。因为,在学习编写主引导山区的引导记录程序时,会用到BIOS中断。
想要更多地了解中断与异常处理程序,一个方法,就是你去学习流行的,教你写内核的教材。我所知道的,有郑刚的《操作系统真象还原》,李忠的《x86汇编语言,从实模式到保护模式》。你也可以去学习赵炯的《Linux内核完全剖析(基于0.12内核)》。
然后呢,关于这个中断和异常处理的知识,你还真得是把学习英特尔手册放在重要的位置上。这是因为,我所说的那几个教材,它在讲到中断和异常处理程序的时候,它把概念讲得比较混乱,说不清,道不明,一个人说的一个样。为了搞清楚这个概念,你还真的是需要再英特尔开发手册上,获得权威的知识。
我之前,学习这些个流行的内核教材的时候,有一个地方,流行的入门内核教材,也是给讲得很乱,那就是线性地址,虚拟地址,逻辑地址的概念。这个概念,也是英特尔开发手册里面,给出的说明比较权威一些。
当然了,手册的话,也不能完全靠它。因为,有的时候,手册上给出的讲解方式,也会令人疑惑。学习的时候,多方参照,认真求证,应该是一个比较好的态度与方法。