linux内核源代码分析-中断处理程序与内核同步.ppt

linux内核源代码分析-中断处理程序与内核同步.ppt

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LINUX中断处理程序及内核同步 系统调用和中断(回顾上节课内容) 中断处理程序的上、下半部机制 LINUX下半部处理机制 同步的经典问题 LINUX内核同步实现 实验问题解答 系统调用和中断(回顾上节课内容) 系统调用原理 INT 80H 中断描述符(80H指向system_call) 系统调用表(system_call_table) 系统调用编号(系统调用在系统调用表中的位置) 中断 中断描述符 中断号 中断处理程序 中断处理程序的上、下半部机制 中断处理程序为什么要分上下半部 中断处理程序以异步方式执行,可能打断重要的操作的执行,越快越好 中断处理程序屏蔽其他中断,执行越快越好 中断处理程序往往需要对硬件操作,通常有很高的时限要求 中断处理程序不在进程的上下文中运行,所以不能阻塞 以上说明:中断处理程序必须执行快,否则影响并发性;中断处理程序在某些时候必须屏蔽其他的中断。 把必须屏蔽中断的一些操作放在上半部 把有些操作放在下半部,可以被打断 这就是操作系统中断处理的上下半部机制。(网络通信的例子) 上、下半部怎样分开 如果一个任务对时间非常敏感,将其放在中断处理程序中(上半部)执行。 如果一个任务和硬件相关,放在中断处理程序执行 如果一个任务要保证不被其他中断打断,则放在中断处理程序执行 其他的所有任务,考虑放在下半部执行。 下半部实现机制 LINUX的上半部就是中断处理程序 下半部有多种机制 软中断机制 Tasklet机制 工作队列机制 软中断机制 此处的软中断和系统调用用大INT80H不同,是操作系统支持的一种中断机制。 软中断机制的实现 软中断在编译期间静态分配(由softirq_action结构表示,定义在linux/interrupt.h中) Struct softirq_action { void (*action)(struct softirq_action*);/*将要执行的函数*/ void *data; /* 传递给函数的参数*/ Kernel/softirq.c中定义了一个包含有32个该结构体的数组 Static struct softirq_action softirq_vec[32]; 软中断机制 32个是最大值,目前用到6个 软中断处理程序 Void softirq_handler(struct softirq_action*)(传的是整个结构) 当内核运行一个软中断处理程序的时候,会执行这个action函数 如若my_softirq指向softirq_vec数组的某项,内核已下方式调用函数: My_softirq-action(mysoftirq); 执行软中断 标记(raising the softirq) 处理完一个硬件中断后 在ksoftirqd内核线程中 显示检查和执行待处理软中断的代码中 软中断机制 do_softirq(不管执行的时机,软中断都要在do_softirq中执行) 核心部分代码: u32 pending = softirq_pending(cpu); if (pending) { struct softirq_action *h = softirq_vec; softirq_pending(cpu) = 0; do { if (pending 1) h-action(h); h++; pending =1;} while (pending); 软中断机制 使用软中断 分配索引 linux/interrupt.h中,已用的: HI_SOFTIRQ 0 优先级高的TASKLets TIMER_SOFTIRQ 1 NET_TX_SOFTIRQ 2 NET_RX_SOFTIRQ 3 SCSI_SOFTIRQ 4 TASKLET_SOFTIRQ 5 添加自己的项时要根据优先级定义加入,一般在SCSI的下面。 软中断机制 注册你的处理程序 OPEN_SOFTIRQ(NET_TX_SOFTIRQ,actions,NULL); 触发你的软中断 Raise_softirq(NET_TX_SOFTIRQ)(在你的中断处理程序里触发) 与中断处理程序一起的一般处理过程。 Tasklets机制 基于软中断实现的下半部机制 接口更简单,锁保护也要求较低 Tasklets的实现(linux/interrupt.h) Struct tasklet_struct { Struct tasklet_struct *next; Unsigned long sate;(0/TASKLET_STATE_SCHED/TASKLET_STATE_RUN) Atomic_t count;/*引用计数器,0允许执行,否则禁

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档