Chinaunix首页 | 论坛 | 博客
  • 博客访问: 221403
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 218
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-06 12:33
文章分类
文章存档

2017年(2)

2015年(11)

2014年(18)

2013年(8)

我的朋友

分类: 嵌入式

2013-11-27 00:20:45

本片博文主要简单的介绍下Kernel 中断处理模型与过程。
首先:对整个中断处理模型有个整体上的认识,如下图:


1、irq_desc中断例程描述符表:内核路劲(include/linux/irq.h)
从名字上就可以看出它就是一个中断例程描述符数组(下表号即中断号),也就是中断映射表,
也就说各个中断号对应的中断例程描述符。故:NR_IRQS就表示中断源的数目。
该结构体在内核中的定义如下:

点击(此处)折叠或打开

  1. struct irq_desc {
  2.     unsigned int        irq;
  3.     struct timer_rand_state *timer_rand_state;
  4.     unsigned int *kstat_irqs;
  5. #ifdef CONFIG_INTR_REMAP
  6.     struct irq_2_iommu *irq_2_iommu;
  7. #endif
  8.     irq_flow_handler_t    handle_irq;
  9.     struct irq_chip        *chip;
  10.     struct msi_desc        *msi_desc;
  11.     void            *handler_data;
  12.     void            *chip_data;
  13.     struct irqaction    *action;    /* IRQ action list */
  14.     unsigned int        status;        /* IRQ status */

  15.     unsigned int        depth;        /* nested irq disables */
  16.     unsigned int        wake_depth;    /* nested wake enables */
  17.     unsigned int        irq_count;    /* For detecting broken IRQs */
  18.     unsigned long        last_unhandled;    /* Aging timer for unhandled count */
  19.     unsigned int        irqs_unhandled;
  20.     raw_spinlock_t        lock;
  21. #ifdef CONFIG_SMP
  22.     cpumask_var_t        affinity;
  23.     const struct cpumask    *affinity_hint;
  24.     unsigned int        node;
  25. #ifdef CONFIG_GENERIC_PENDING_IRQ
  26.     cpumask_var_t        pending_mask;
  27. #endif
  28. #endif
  29.     atomic_t        threads_active;
  30.     wait_queue_head_t wait_for_threads;
  31. #ifdef CONFIG_PROC_FS
  32.     struct proc_dir_entry    *dir;
  33. #endif
  34.     const char        *name;
  35. }
从中我们可以看到有这么一个结构体struct irqaction    *action;它指向的就是中断事件服务
链表,也就是说当有申请中断的时候就会把它这个中断加入到这个量表中,该结构体的定义如下:


点击(此处)折叠或打开

  1. struct irqaction {
  2.     irq_handler_t handler;
  3.     unsigned long flags;
  4.     const char *name;
  5.     void *dev_id;
  6.     struct irqaction *next;
  7.     int irq;
  8.     struct proc_dir_entry *dir;
  9.     irq_handler_t thread_fn;
  10.     struct task_struct *thread;
  11.     unsigned long thread_flags;
  12. };
其中 irq_handler_t handler;  //为中断服务函数,也就是中断产生时所要执行的函数。
下面举个列子:
当用户请求中断的时候调用request_irq:
int request_irq(unsigned int irq, irq_handler_t handler,
                unsigned long flags, const char * devname, void * dev_id)
其中 irq就是中断号,什么意思,就是说你要放在irq_desc[]这个数组的哪里,换句话就是申请
哪个中断号, irq_handler_t handler这个就是中断处理函数句柄,flags中断标志位是用来决定
中断类型的,比如是快速中断或者共享中断等属性,devname就是设备驱动的名称了,最后一个i额dev_id就是
设备id,主要用在共享中断里面用来制定中断服务需要参考的数据地址,简单点就是在调用中断服务函数的时候
会当作参数床给中断服务函数。
过程是怎样的呢?当用户调用这个函数的时候,内核会创建一个irqaction结构体,然后把它加入到irq_desc[]数组
中就可以了。当CPU收到中断请求后就通过中断好找到中断例程描述符再找到中断函数执行即可。

以上就是全部内容,知识简单的介绍以下中断的处理模型,如果有讲不对的地方还请大牛指点出来。






阅读(1454) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~