linux内核源代码分析-中断处理程序与内核同步.ppt
《linux内核源代码分析-中断处理程序与内核同步.ppt》由会员分享,可在线阅读,更多相关《linux内核源代码分析-中断处理程序与内核同步.ppt(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、系统调用和中断(回顾上节课内容) 系统调用原理 INT 80H 中断描述符(80H指向system_call) 系统调用表(system_call_table) 系统调用编号(系统调用在系统调用表中的位置) 中断 中断描述符 中断号 中断处理程序中断处理程序的上、下半部机制 中断处理程序为什么要分上下半部 中断处理程序以异步方式执行,可能打断重要的操作的执行,越快越好 中断处理程序屏蔽其他中断,执行越快越好 中断处理程序往往需要对硬件操作,通常有很高的时限要求 中断处理程序不在进程的上下文中运行,所以不能阻塞以上说明:中断处理程序必须执行快,否则影响并发性;中断处理程序在某些时候必须屏蔽其他的
2、中断。把必须屏蔽中断的一些操作放在上半部把有些操作放在下半部,可以被打断这就是操作系统中断处理的上下半部机制。(网络通信的例子)上、下半部怎样分开 如果一个任务对时间非常敏感,将其放在中断处理程序中(上半部)执行。 如果一个任务和硬件相关,放在中断处理程序执行 如果一个任务要保证不被其他中断打断,则放在中断处理程序执行 其他的所有任务,考虑放在下半部执行。下半部实现机制 LINUX的上半部就是中断处理程序 下半部有多种机制 软中断机制 Tasklet机制 工作队列机制软中断机制 此处的软中断和系统调用用大INT80H不同,是操作系统支持的一种中断机制。 软中断机制的实现 软中断在编译期间静态分
3、配(由softirq_action结构表示,定义在中)Struct softirq_action void (*action)(struct softirq_action*);/*将要执行的函数*/void *data; /* 传递给函数的参数*/Kernel/softirq.c中定义了一个包含有32个该结构体的数组Static struct softirq_action softirq_vec32;软中断机制 32个是最大值,目前用到6个 软中断处理程序Void softirq_handler(struct softirq_action*)(传的是整个结构)当内核运行一个软中断处理程序的时候
4、,会执行这个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;so
5、ftirq_pending(cpu) = 0;do if (pending & 1) h-action(h); h+; pending =1; while (pending);软中断机制 使用软中断 分配索引 中,已用的:HI_SOFTIRQ0优先级高的TASKLetsTIMER_SOFTIRQ1NET_TX_SOFTIRQ2NET_RX_SOFTIRQ3SCSI_SOFTIRQ4TASKLET_SOFTIRQ5添加自己的项时要根据优先级定义加入,一般在SCSI的下面。软中断机制 注册你的处理程序 OPEN_SOFTIRQ(NET_TX_SOFTIRQ,actions,NULL); 触发你的软
6、中断 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允许执行,否则禁止*/Void (*func)(unsigned
7、long);/*执行函数*/Unsigned long data;Tasklets机制调度tasklets Tasklets 放在tasklet_vec和task_hi_vec两个链表中; 由tasklet_schedule()和tasklet_hi_schedule()进行调度Task_schedule执行的步骤: 检查tasket的状态是否为tASKLET_STATE_SCHED,若是返回, 保存中断状态,然后禁止本地中断 把需要调度的tasklet放在每个处理器的tasklet_vec表头上去。 唤起TASKLET_SOFTIRQ或TASKLET_HI_SOFTIRQ. 恢复中断。Tas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 内核 源代码 分析 中断 处理 程序 同步
限制150内