初步了解Linux内核中断初始化

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步了解Linux内核中断初始化相关的知识,希望对你有一定的参考价值。

    在linux内核中,用struct irq_chip结构体描述一个可编程中断控制器,它的整个结构和调度器中的调度类类似,里面定义了中断控制器的一些操作;

    在中断处理中所涉及的几个重要的数据结构:中断描述符(struct irq_desc),中断控制器描述符(struct irq_chip),中断服务例程(struct irqaction)。它们的组织形式如下:

 

 


中断初始化概述

  中断相关的数据结构组成了整个内核中断框架主体,所以内核对整个中断的初始化工作大多集中在了这几个结构上;

   在系统中,当一个中断产生时,首先CPU会从中断向量表中获取相应的中断向量,并根据中断向量的权限位判断是否处于该权限,之后跳转至中断处理函数,在中断处理函数中会根据中断向量号获取中断描述符,并通过中断描述符获取此中断对应的中断控制器描述符,然后对中断控制器执行应答操作,最后执行此中断描述符中的中断服务例程链表,最后执行软中断;

  而整个初始化的过程与中断处理过程相应,首先先初始化中断向量表,再初始化中断描述符表和中断描述符;
    中断控制器描述符是系统预定编写好的静态变量,如i8259A中断控制器对应的变量就是i8259A_chip;
这时一个中断已经初始化完毕,之后驱动需要使用此中断时系统会将驱动中的中断处理加入到该中断的中断服务例程链表中;
    如下图,

 

 初始化中断向量
  虽然称之为中断向量表,其实对于CPU来说只是一个起始地址,此地址开始每向上8个字节为一个中断向量。我们的CPU上有一个idtr寄存器,它专门用于保存中断向量表地址,当产生一个中断时,CPU会自动从idtr寄存器保存的中断向量表地址处获取相应的中断向量,然后判断权限并跳转至中断处理函数。当计算机刚启动时,首先会启动引导程序(Bios),在BIOS中会把中断向量表存放在内存开始位置(0x00000000)。BIOS会有自己的一些默认中断处理函数,而当BIOS处理完后,会将计算机控制器转交给linux,而linux会在使用BIOS的中断向量表的同时重新设置新的中断向量表(新的地址保存在配置中的CONFIG_VECTORS_BASE),之后会完全使用新的中断向量表;

以上是关于初步了解Linux内核中断初始化的主要内容,如果未能解决你的问题,请参考以下文章

Linux x86_64内核中断初始化

初步了解Linux中的线程与进程

linux内核源码分析中断work_queue

linux内核网络收包过程—网络子系统与协议栈初始化

《Linux内核设计与实现》读书笔记- 中断处理转

linux基础19系统初始化流程