DS_TD_Linux中断机制_1223资料.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中断机制 注册中断函数 irq中断通道号 handler中断处理程序 irqflags标志位 devname设备名 (/proc/interrupt) dev_id—区分共享中断 中断控制器与中断号IRQ ARM IRQ 中断处理例程 中断处理例程 不能与用户空间传递数据; 不能休眠; 不能调用schedule(); 尽可能快 ,如果需要长时间使用下半部中断。 中断共享 irqflags : IRQF_SHARED dev_id: 设备结构体(唯一性) handler: 区分设备是否真的产生了中断。 进入中断 中断(异常)向量表 向量表初始化 中断体系结构 irq_desc /irq_desc_t--中断描述符/数组 irq_chip--中断控制器描述符 irqaction--中断服务例程描述符 irq_desc irq_chip irqaction 中断处理流程 中断API 内核同步—自旋锁 自旋锁(spinlock) 只能被一个可执行线程持有 争用一个被占用的自旋锁需等待(旋转) 不能长时间占用,否则效率低 应用 spinlock_t my_lock = SPIN_LOCK_UPLOCKED spinlock(my_lock); spinlock_unlock(my_lock); 上半部 VS 下半部 中断下半部机制 软中断数据结构 软中断注册与触发 注册软中断 触发软中断 软中断实现 软中断执行 tasklet(小任务)是一种基于软中断实现的灵活性强可动态创建的下半部实现机制。 tasklet是I/O驱动程序中实现可延迟函数的首选方法。 建立在HI_SOFTIRQ和TASKLET_SOFTIRQ软中断之上。 tasklet 工作线程 工作队列 将work_struct 加入到自定义工作线程的工作队列中可以采用以下接口: 软中断 VS Tasklet VS 工作队列 Q A 【这是软中断的数据结构: 软中断待执行函数和传给函数的参数。并且定义了32个软中断的数组。 但目前只用到6个软中断,优先级从上到下:有高优先级的tasklet,定时器中断,网络发送与接受,块设备,普通tasklet等等。 从数据结构中也可看到,软中断是静态的机制,也就是说软中断是编译在内核中的,增加修改必须重编译内核。】 【tasklet是基于软中断中HI_SOFTIRQ和TASKLET_SOFTIRQ 实现的一种机制。 实现灵活,接口简单。而且锁保护机制要求不高。因此是软中断中首选方法。】 【工作队列是下半部中断的另外一种机制,和前面的软中断有很大的不同。工作队列把工作推后,交给一个内核线程完成。工作在进程上下文中中,可以休眠,允许调度。】 【一般情况下, 大多数驱动都使用默认工作线程来执行自己的工作。某些情况下, 驱动产生自己的自定义工作线程可以满足更高的性能要求, 并可以减轻默认工作线程的负担。】 【内核提供了下面2 个宏来方便地建立该结构】 【内核提供以下2 个宏操作: 】 【name 为该类型工作工作线程的名字】 【举个例子,8259chip的定义 】 从中断返回时 在Ksoftiqrd内核线程中 特定的执行代码中 do_softirq() HI_SOFTIRQ TIMER_SOFTIRQ TASKLET_SOFTIRQ … raise_softirq PEND tasklet struct tasklet_struct { struct tasklet_struct *next; unsigned long state; /*同一时间内只有一个tasklet运行*/ atomic_t count; void (*func)(unsigned long); /*执行函数*/ unsigned long data; /*0激活;其他禁止*/ } enum { TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */ TASKLET_STATE_RUN /* Tasklet is running (SMP only) */ } tasklet机制 …. tasklet0 tasklet1 taskletn … HI_SOFTIRQ tasklet_schedule raise_softirq_irqoff PEND ADD tasklet_hi_action 软中断 VS tasklet 软中断 软中断的分配是静态的。 软中断可以并发地运行在多个CPU上。因此,软中断是可重入函数而且必须明确地使用自旋锁保护其数据结

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档