linux的中断处理机制主要包括3个方面:
(1) 中断子系统初始化:内核在自身初始化过程中对中断处理机制的初始化,包括中断描述符表的初始化和中断请求队列的初始化等。
(2) 中断或异常处理:一个实际中断或异常的处理过程。
(3) 中断API: 为设备驱动程序提供一组API,包括注册与释放、激活与禁止等函数
本节介绍第一个方面内容.
一、中断描述符表的初始化
1、第一阶段初始化(发生在内核引导过程)
主要完成两项工作:为IDT(中断描述符表)分配2KB大小的空间(256个中断向量,每个中断向量对应一个8字节的门描述符,并初始化默认值;
存储IDT的起始位置到IDTR寄存器。
完成IDT初始化后,将EDX和EAX寄存器初始化为:
EDX:ignore_int地址高16位 默认属性0x8E00
EAX:段选择符16位 ignore_int地址低16位
将EDX和EAX作为门描述符的高和低32位
2、第二阶段初始化(发生在内核初始化过程中)
内核在初始化过程中的start_kernel函数,使用了trap_init和init_IRQ函数进行初始化,第一个完成对系统保留中断向量(异常、非屏蔽中断以及系统调用)的初始化。init_IRQ完成其余中断向量的初始化。
(1) 调用trap_init函数,它是初始化中断向量为0~19,包括了异常和不可屏蔽中断,所以说所有异常均在在此完成;
(1) 中断子系统初始化:内核在自身初始化过程中对中断处理机制的初始化,包括中断描述符表的初始化和中断请求队列的初始化等。
(2) 中断或异常处理:一个实际中断或异常的处理过程。
(3) 中断API: 为设备驱动程序提供一组API,包括注册与释放、激活与禁止等函数
本节介绍第一个方面内容.
一、中断描述符表的初始化
1、第一阶段初始化(发生在内核引导过程)
主要完成两项工作:为IDT(中断描述符表)分配2KB大小的空间(256个中断向量,每个中断向量对应一个8字节的门描述符,并初始化默认值;
存储IDT的起始位置到IDTR寄存器。
完成IDT初始化后,将EDX和EAX寄存器初始化为:
EDX:ignore_int地址高16位 默认属性0x8E00
EAX:段选择符16位 ignore_int地址低16位
将EDX和EAX作为门描述符的高和低32位
2、第二阶段初始化(发生在内核初始化过程中)
内核在初始化过程中的start_kernel函数,使用了trap_init和init_IRQ函数进行初始化,第一个完成对系统保留中断向量(异常、非屏蔽中断以及系统调用)的初始化。init_IRQ完成其余中断向量的初始化。
(1) 调用trap_init函数,它是初始化中断向量为0~19,包括了异常和不可屏蔽中断,所以说所有异常均在在此完成;
源码如下:
//gate中断向量,type为门描述符属性(类型)