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

上传人:豆**** 文档编号:26544144 上传时间:2022-07-18 格式:PPT 页数:32 大小:702.50KB
返回 下载 相关 举报
linux内核源代码分析-中断处理程序与内核同步.ppt_第1页
第1页 / 共32页
linux内核源代码分析-中断处理程序与内核同步.ppt_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《linux内核源代码分析-中断处理程序与内核同步.ppt》由会员分享,可在线阅读,更多相关《linux内核源代码分析-中断处理程序与内核同步.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

8、klets机制 Tasklet_action() 和tasklet_hi_action()做的工作: 禁止中断 将当前处理器上的该链表清空 允许中断 循环遍历链表上每一个待处理的tasklet 若是多处理器系统,看是否RUN,若是下一个 若没有执行,设为RUN 检查count是否为0,若不是,下一个 调用执行TASKLET,后清空相应的标志。 下一个Tasklets机制 使用 tasklets 声明Tasklet DECLARE_TASKLET(name,func,data) DECLARE_TASKLET_DISABLED()以上是静态的方式Tasklet_init(t,tasklet_ha

9、ndler,dev) ;/*动态创建*/ 编写处理程序 Tasklet_handler(unsigned long data)Tasklets机制 调度自己的tasklet 实际上是标记,或称挂起 Tasklet_schedule(&mytasklet); 另外的控制:tasklet_disable(&my_tasklet);tasklet_enable(&my_tasklet);总结tasklet机制Ksoftirqd 软中断和tasklet机制中,当中断或 tasklet频繁发生时其处理方式要慎重选择。 尽快执行(系统忙时,用户进程得不到响应) 滞后执行(系统闲的时候,中断处理的也不快)

10、折中的办法:低优先级核心进程专门处理软中断Ksoftirqd/n For(;)If (!softirq_pending(cpu) shedule();set_current_state(TASK_RUNNING);While (softirq_pending(cpu)Do_softirq();If (need_resched() schedule() 工作队列机制 工作队列机制和上面两中机制不同,它将下半部功能交由内核线程执行,有线程的上下文环境,可以睡眠。 工作队列机制的实现 提供创建worker threads的接口 提供默认的工作者线程处理排到队列里的下半部工作 提供把需要推后执行的任务

11、排到队列里的接口工作队列机制 表示线程的数据结构 Struct workqueue_struct Struct cpu_workqueue_struct cpu_wqNR_CPUS; Struct cpu_workqueue_struct Spinlock_t lock; Struct list_head worklist; wait_queue_head_t more_work; Wait_queue_head_t work_done; Struct workqueue_struct *wq; Tast_t *thread; Struct completion exit;工作队列机制 表示工

12、作的数据结构 Struct work_struct Unsigned long pending; Struct list_head entry; Void (*func)(void*); Void *data; Void *wq_data; Struct timer_list timer;工作队列机制 核心线程 见书81页,处理机制如下: 线程将自己设置为休眠状态 若工作连表为空,休眠 若不空,调用run_workqueue() 函数执行工作。 Run_workqueue的执行:(p82) 当工作链表不空时,选取下一个节点对象,获取要执行的函数和参数。 待处理标志清0 调用函数 重复执行工作队

13、列机制 工作队列机制的使用 创建工作DECLARE_WORK(name,void(*func)(void*),void*data);Init_work(.) 工作队列处理函数void work_handler(void *data); 对工作进行调度shedule_work();shedule_delayed_work(&work,delay); 刷新操作 flush_scheduled_work(); cancel_ 创建新的队列选择推后任务的处理机制 上下文顺序执行保障 软中断中断没有 Tasklet中断同类型的不能同时执行 工作队列进程没有加锁的问题 下半部之间 下半部与用户进程之间有共

14、享资源的地方要加锁内核同步问题 临界区临界区就是访问和操作共享资源的代码段,必须保证原子地执行才能保证安全。 共享变量的例子(p90)内核同步问题 加锁一个简单共享变量的操作问题还容易解决一些,比如让硬件本身提供原子操作的复合指令。但若是共享的是一个复杂的数据结构,比如一个结构的链表,就不能这样解决啦。加锁的思路是,保证在临界区中执行的线程只有一个。(P91)内核同步问题 同步问题一般必须事先设计好,否则很难调试。(即使不加处理,有时也很难出现错误) 内核中有并发执行,所以也有同步问题,引起并发的原因: 中断 内核抢占 睡眠及用户空间的同步 对称多处理内核同步问题 死锁 死锁产生的四个必要条件

15、内核同步方法 原子操作 原子整数操作 Atomic_dec_and_test(atomic_t,*v) 原子位操作 Set_bit(0,&word)内核同步方法 自旋锁(spinlock) 自旋锁只能被一个可执行线程持有 若争用一个被占用的自旋锁则进程忙等(旋转) 自旋锁不能长时间占用,否则效率太低 自旋锁实现与体系结构密切相关(一个实现的例子) 应用 Spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; Spinlock(&mr_lock); . Spin_unlock(&mr_lock);实验问题解答 在命令结构中添加int argc表示参数个数,它必须定义在char * argv之前 结束结束

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁