欢迎来到天天文库
浏览记录
ID:57045347
大小:47.00 KB
页数:31页
时间:2020-07-28
《内核源代码分析中断处理程序与内核同步课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、LINUX中断处理程序及内核同步系统调用和中断(回顾上节课内容)中断处理程序的上、下半部机制LINUX下半部处理机制同步的经典问题LINUX内核同步实现实验问题解答系统调用和中断(回顾上节课内容)系统调用原理INT80H中断描述符(80H指向system_call)系统调用表(system_call_table)系统调用编号(系统调用在系统调用表中的位置)中断中断描述符中断号中断处理程序中断处理程序的上、下半部机制中断处理程序为什么要分上下半部中断处理程序以异步方式执行,可能打断重要的操作的执行,越快越好中断处理程序屏蔽其他中断,执行越
2、快越好中断处理程序往往需要对硬件操作,通常有很高的时限要求中断处理程序不在进程的上下文中运行,所以不能阻塞以上说明:中断处理程序必须执行快,否则影响并发性;中断处理程序在某些时候必须屏蔽其他的中断。把必须屏蔽中断的一些操作放在上半部把有些操作放在下半部,可以被打断这就是操作系统中断处理的上下半部机制。(网络通信的例子)上、下半部怎样分开如果一个任务对时间非常敏感,将其放在中断处理程序中(上半部)执行。如果一个任务和硬件相关,放在中断处理程序执行如果一个任务要保证不被其他中断打断,则放在中断处理程序执行其他的所有任务,考虑放在下半部执行。
3、下半部实现机制LINUX的上半部就是中断处理程序下半部有多种机制软中断机制Tasklet机制工作队列机制软中断机制此处的软中断和系统调用用大INT80H不同,是操作系统支持的一种中断机制。软中断机制的实现软中断在编译期间静态分配(由softirq_action结构表示,定义在中)Structsoftirq_action{void(*action)(structsoftirq_action*);/*将要执行的函数*/void*data;/*传递给函数的参数*/Kernel/softirq.c中定义了一
4、个包含有32个该结构体的数组Staticstructsoftirq_actionsoftirq_vec[32];软中断机制32个是最大值,目前用到6个软中断处理程序Voidsoftirq_handler(structsoftirq_action*)(传的是整个结构)当内核运行一个软中断处理程序的时候,会执行这个action函数如若my_softirq指向softirq_vec数组的某项,内核已下方式调用函数:My_softirq->action(mysoftirq);执行软中断标记(raisingthesoftirq)处理完一个硬件中断
5、后在ksoftirqd内核线程中显示检查和执行待处理软中断的代码中软中断机制do_softirq(不管执行的时机,软中断都要在do_softirq中执行)核心部分代码:u32pending=softirq_pending(cpu);if(pending){structsoftirq_action*h=softirq_vec;softirq_pending(cpu)=0;do{if(pending&1)h->action(h);h++;pending>>=1;}while(pending);软中断机制使用软中断分配索引6、errupt.h>中,已用的:HI_SOFTIRQ0优先级高的TASKLetsTIMER_SOFTIRQ1NET_TX_SOFTIRQ2NET_RX_SOFTIRQ3SCSI_SOFTIRQ4TASKLET_SOFTIRQ5添加自己的项时要根据优先级定义加入,一般在SCSI的下面。软中断机制注册你的处理程序OPEN_SOFTIRQ(NET_TX_SOFTIRQ,actions,NULL);触发你的软中断Raise_softirq(NET_TX_SOFTIRQ)(在你的中断处理程序里触发)与中断处理程序一起的一般处理过程。Tasklets7、机制基于软中断实现的下半部机制接口更简单,锁保护也要求较低Tasklets的实现(linux/interrupt.h)Structtasklet_struct{Structtasklet_struct*next;Unsignedlongsate;(0/TASKLET_STATE_SCHED/TASKLET_STATE_RUN)Atomic_tcount;/*引用计数器,0允许执行,否则禁止*/Void(*func)(unsignedlong);/*执行函数*/Unsignedlongdata;};Tasklets机制调度tasklets8、Tasklets放在tasklet_vec和task_hi_vec两个链表中;由tasklet_schedule()和tasklet_hi_schedule()进行调度Task_schedule执行的步骤:
6、errupt.h>中,已用的:HI_SOFTIRQ0优先级高的TASKLetsTIMER_SOFTIRQ1NET_TX_SOFTIRQ2NET_RX_SOFTIRQ3SCSI_SOFTIRQ4TASKLET_SOFTIRQ5添加自己的项时要根据优先级定义加入,一般在SCSI的下面。软中断机制注册你的处理程序OPEN_SOFTIRQ(NET_TX_SOFTIRQ,actions,NULL);触发你的软中断Raise_softirq(NET_TX_SOFTIRQ)(在你的中断处理程序里触发)与中断处理程序一起的一般处理过程。Tasklets
7、机制基于软中断实现的下半部机制接口更简单,锁保护也要求较低Tasklets的实现(linux/interrupt.h)Structtasklet_struct{Structtasklet_struct*next;Unsignedlongsate;(0/TASKLET_STATE_SCHED/TASKLET_STATE_RUN)Atomic_tcount;/*引用计数器,0允许执行,否则禁止*/Void(*func)(unsignedlong);/*执行函数*/Unsignedlongdata;};Tasklets机制调度tasklets
8、Tasklets放在tasklet_vec和task_hi_vec两个链表中;由tasklet_schedule()和tasklet_hi_schedule()进行调度Task_schedule执行的步骤:
此文档下载收益归作者所有