| 方法之三:以数据结构为基点,触类旁通
结构化程序设计思想认为:程序 = 数据结构 + 算法。数据结构体现了整个系统的构架,所以数据结构通常都是代码分析的很好的着手点,对Linux内核分析尤其如此。比如,把进程控制块结构分析清楚了,就对进程有了基本的把握;再比如,把页目录结构和页表结构弄懂了,两级虚存映射和内存管理也就掌握得差不多了。为了体现循序渐进的思想,在这我就以Linux对中断机制的处理来介绍这种方法。
首先,必须指出的是:在此处,中断指广义的中断概义,它指所有通过idt进行的控制转移的机制和处理;它覆盖以下几个常用的概义:中断、异常、可屏蔽中断、不可屏蔽中断、硬中断、软中断
… … …
I、硬件提供的中断机制和约定
一.中断向量寻址:
硬件提供可供256个服务程序中断进入的入口,即中断向量;
中断向量在保护模式下的实现机制是中断描述符表idt,idt的位置由idtr确定,idtr是个48位的寄存器,高32位是idt的基址,低16位为idt的界限(通常为2k=256*8);
idt中包含256个中断描述符,对应256个中断向量;每个中断描述符8位,其结构如图一:
中断进入过程如图二所示。
当中断是由低特权级转到高特权级(即当前特权级CPL>DPL)时,将进行堆栈的转移;内层堆栈的选择由当前tss的相应字段确定,而且内层堆栈将依次被压入如下数据:外层SS,外层ESP,EFLAGS,外层CS,外层EIP;
中断返回过程为一逆过程;
二.异常处理机制:
Intel公司保留0-31号中断向量用来处理异常事件:当产生一个异常时,处理机就会自动把控制转移到相应的处理程序的入口,异常的处理程序由操作系统提供,中断向量和异常事件对应如表一:
表一、中断向量和异常事件对应表
| 中断向量号
|
异常事件
|
Linux的处理程序
|
| 0
|
除法错误
|
Divide_error
|
| 1
|
调试异常
|
Debug
|
| 2
|
NMI中断
|
Nmi
|
| 3
|
单字节,int
3 |
Int3
|
| 4
|
溢出
|
Overflow
|
| 5
|
边界监测中断
|
Bounds
|
| 6
|
无效操作码
|
Invalid_op
|
| 7
|
设备不可用
|
Device_not_available
|
| 8
|
双重故障
|
Double_fault
|
| 9
|
协处理器段溢出
|
Coprocessor_segment_overrun
|
| 10
|
无效TSS
|
Incalid_tss
|
| 11
|
缺段中断
|
Segment_not_present
|
| 12
|
堆栈异常
|
Stack_segment
|
| 13
|
一般保护异常
|
General_protection
|
| 14
|
页异常
|
Page_fault
|
| 15
|
|
Spurious_interrupt_bug
|
| 16
|
协处理器出错
|
Coprocessor_error
|
| 17
|
对齐检查中断
|
Alignment_check
|
三.可编程中断控制器8259A:
为更好的处理外部设备,x86微机提供了两片可编程中断控制器,用来辅助cpu接受外部的中断信号;对于中断,cpu只提供两个外接引线:NMI和INTR;
NMI只能通过端口操作来屏蔽,它通常用于:电源掉电和物理存储器奇偶验错;
INTR可通过直接设置中断屏蔽位来屏蔽,它可用来接受外部中断信号,但只有一个引线,不够用;所以它通过外接两片级链了的8259A,以接受更多的外部中断信号。8259A主要完成这样一些任务:
中断优先级排队管理,
接受外部中断请求
向cpu提供中断类型号
外部设备产生的中断信号在IRQ(中断请求)管脚上首先由中断控制器处理。中断控制器可以响应多个中断输入,它的输出连接到
CPU 的 INT 管脚,信号可通过INT 管脚,通知处理器产生了中断。如果 CPU 这时可以处理中断,CPU
会通过 INTA(中断确认)管脚上的信号通知中断控制器已接受中断,这时,中断控制器可将一个
8 位数据放置在数据总线上,这一 8 位数据也称为中断向量号,CPU 依据中断向量号和中断描述符表(IDT)中的信息自动调用相应的中断服务程序。图三中,两个中断控制器级联了起来,从属中断控制器的输出连接到了主中断控制器的第
3 个中断信号输入,这样,该系统可处理的外部中断数量最多可达 15 个,图的右边是 i386
PC 中各中断输入管脚的一般分配。可通过对8259A的初始化,使这15个外接引脚对应256个中断向量的任何15个连续的向量;由于intel公司保留0-31号中断向量用来处理异常事件(而默认情况下,IBM
bios把硬中断设在0x08-0x0f),所以,硬中断必须设在31以后,linux则在实模式下初始化时把其设在0x20-0x2F,对此下面还将具体说明。
图三、i386 PC 可编程中断控制器8259A级链示意图
|