全部博文(610)
分类: LINUX
2010-06-13 10:02:00
硬件部分
一、中断
中断可分为同步(synchronous)中断和异步(asynchronous)中断:
1. 同步中断是当指令执行时由 CPU 控制单元产生,之所以称为同步,是因为只有在一条指令执行完毕后 CPU 才会发出中断,而不是发生在代码指令执行期间,比如系统调用。
2. 异步中断是指由其他硬件设备依照 CPU 时钟信号随机产生,即意味着中断能够在指令之间发生,例如键盘中断。
二、IRQ与中断向量
2.1 IRQ的工作流程
1. 把接收的引发信号转换成对应的向量。
2. 把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读此向量。
3. 把引发信号送到处理器的INTR引脚,即产生一个中断。
4. 等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它;当这种情况发生时,清INTR线。
2.2 IRQ分为两种模式
l IRQ共享
中断处理程序执行多个中断服务程序,每个ISR市一个与单独设备相关的函数,因为不可能预先知道哪个特定的设备产生IRQ,因此,每个ISR都被执行,以验证它是否被关注。
l IRQ动态分配
一条IRQ线在可能的最后时刻才于一个设备驱动程序相关联,这样,即使几个硬件设备并不共享IRQ线,同一个IRQ向量也可以由这几个设备在不同时刻使用。
三、可编程中断控制器PIC的作用
1. 处理IRQ线之间的优先级,IRQn编号越小,优先级越高,且与IRQn关联的Intel的缺省向量是n+32。
2. 有选择地禁止每条IRQ线,实现IRQ线的屏蔽。
3. 运用PIC的设计,不用考虑CPU的优先级设定,减轻CPU工作。
-------------------------------分割线-----------------------------------------
程序部分
四、中断描述符IDT
4.1中断描述符IDT
中断描述符表(Interrupt Descriptor Table,IDT)是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中存放的是相应的中断或异常处理程序的入口地址。内核在允许中断发生前,也就是在系统初始化时,必须把 IDT 表的初始化地址装载到 idtr 寄存器中,初始化表中的每一项。
中断描述符分为三种类型:任务门描述符、中断门描述符和陷阱门描述符。
这篇文章所涉及的是中断门,即该描述符包含段选择符和中断或异常处理的段内偏移量。简单来说就是,让中断或异常的时候,找到处理程序的入口地址。
4.2运用IDT处理中断和异常的硬件流程
当执行了一条指令后,CS和EIP这对寄存器包含下一条将要执行的逻辑地址。在处理那条指令之前,控制单元会检查在运行前一条是否已经发生了一个中断或异常。
1.确定与中断或异常关联的向量I
2.读由idtr寄存器指向的IDT表中的i项
3.从gdtr寄存器获得GDT的基地址,并在GDT中查找,以读取IDT表项中的选择符所标识的段描述符。这个描述符制定中断或异常处理程序所在段的地址。
4.确信中断是由授权的(中断)发生源发出的。首先将当前特权级CPL(存放在CS寄存器的低两位)与段描述符(存放CDT中)的描述符特权级DPL比较。
5.检查是否产生特权级的变化。
6.如果故障已发生,用引起异常的指令地址装载CS和EIP寄存器,从而使得这条指令能再次被执行。
7.在栈中保存eflags cs 及eip的内容
8.如果异常产生了一个硬件出错码,则将它保存在栈中。
9.装载cs和eip寄存器,其值分别是IDT表中第i项们描述符的选择符和偏移量字段。这些值给出了中断或者异常处理程序的第一条指令的逻辑地址。
其中,第四条,你可能疑问,既然PIC已经对优先级进行了处理为何也要对特权级进行检查,这个检查,主要为了避免用户利用应用程序模拟硬件中断访问特殊的陷阱门和中断门。
中断结束后,相应的处理程序必须产生一条iret指令,把控制权转交给被中断的进程。
4.3 IRQ的数据结构
当处于实模式下时,IDT 被初始化并由 BIOS 程序所使用。然而,一旦 Linux 开始接管,IDT 就被移到 RAM 的另一个区域,并进行第二次初始化,因为 Linux 不使用任何 BIOS 程序,而使用自己专门的中断服务程序(例程)(interrupt service routine,ISR)。中断和异常处理程序很像常规的 C 函数。
有三个主要的数据结构包含了与 IRQ 相关的所有信息:hw_interrupt_type、irq_desc_t 和 irqaction,下图解释了它们之间是如何关联的。
》hw_interrupt_type
主要描述CPU与PIC之间关系,例如startup、shutdown和enable这些都是针对PIC的接收信号设置。
》irq_desc_t
每个中断向量都有它自己的irq_desc_t描述符,所有这些描述符组织在一起形成irq_desc数组。
》Irqaction
需要一个结构体去描述中断后需要做的东西,是考虑到多个设备共享一个IRQ。其中,每个的每个描述符涉及一个特定的硬件设备和一个特定的中断。
注意:以上这三个数据结构在使用前都要进行初始化。