嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用

上传人:E**** 文档编号:89375597 上传时间:2019-05-24 格式:PPT 页数:26 大小:388KB
返回 下载 相关 举报
嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用_第1页
第1页 / 共26页
嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用_第2页
第2页 / 共26页
嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用_第3页
第3页 / 共26页
嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用_第4页
第4页 / 共26页
嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用》由会员分享,可在线阅读,更多相关《嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第7章 中断与系统调用(26页珍藏版)》请在金锄头文库上搜索。

1、嵌入式Linux操作系统 第7章 中断与系统调用,www.embedu.org,2,第1章 嵌入式Linux操作系统简介 第2章 Linux操作系统使用与系统配置 第3章 嵌入式Linux编程环境 第4章 存储管理 第5章 操作系统进程 第6章 进程间通信 第7章 中断与系统调用 第8章 文件管理 第9章 设备管理 第10章 嵌入式Linux的构建,课程安排:,www.embedu.org,3,第7章 中断与系统调用 7.1 什么是中断 7.2 嵌入式平台硬件中断特点 7.3 Linux内核中断机制概述 7.4 编写中断处理程序ISR 7.5 tasklet机制 7.6 上半部和下半部 7.7

2、 工作队列workqueues 7.8 系统调用 思考题,本章课程:,www.embedu.org,4,7.1 什么是中断,当一个设备发出中段请求时,CPU停止正在执行的指令,转而跳到包括中断处理代码或者包括指向中断处理代码的转移指令所在的内存区域。当中断处理完毕以后,CPU将恢复到以前的状态,继续执行中断处理前正在执行的指令。,www.embedu.org,5,7.2 嵌入式平台硬件中断特点,申请IRQ(Interrupt Requirement)的过程,分为3步: 1将所有的中断线探测一遍,看看哪些中断还没有被占用。从这些还没有被占用的中断中选一个作为该设备的IRQ。 2通过中断申请函数申

3、请选定的IRQ,这是要指定申请的方式是独占还是共享。 3根据中断申请函数的返回值决定是否重新申请或者放弃申请并返回错误。,www.embedu.org,6,7.3 Linux内核中断机制概述,Linux系统的中断就是通常意义上的“中断处理程序”,它是直接处理由硬件发过来的中断信号。当Linux内核收到中断请求后,它首先判断中断源,然后调用相应的设备驱动程序, 驱动程序会去设备上查看其状态寄存器以了解发生了什么事情,并进行相应的操作。 Linux内核与中断相关的部分包括:硬件中断,下半部任务和内核线程 1、硬中断任务 硬中断是指那些由处理器以外的外设产生的中断,这些中断被处理器接收后交给内核中的

4、中断处理程序处理。要注意的是:第一,硬中断是异步产生的,中断发生后立刻得到处理,也就是说中断操作可以抢占内核中正在运行的代码。这点非常重要。第二,中断操作是发生在中断上下文中的(所谓中断上下文指的是和任何进程无关的上下文环境)。中断上下文中不可以使用进程相关的资源,也不能够进行调度或睡眠。因为调度会引起睡眠,但睡眠必须针对进程而言(睡眠其实是标记进程状态,然后把当前进程推入睡眠列队),而异步发生的中断处理程序根本不知道当前进程的任何信息,也不关心当前哪个进程在运行,它完全是个过客。,www.embedu.org,7,7.3 Linux内核中断机制概述,2、下半部任务 下半部任务的由来完全出自上

5、面提到的硬中断的影响。硬件中断任务(处理程序)是一个快速、异步、简单地对硬件做出迅速响应并在最短时间内完成必要操作的中断处理程序。硬中断处理程序可以抢占内核任务并且执行时还会屏蔽同级中断或其它中断,因此中断处理必须要快、不能阻塞。这样一来对于一些要求处理过程比较复杂的任务就不合适在中断任务中一次处理。例如在网卡接收数据的过程中,首先网卡发送中断信号通知CPU获取数据,然后系统从网卡中读取数据存入系统缓冲区中,再下来解析数据然后送入应用层。这些如果都让中断处理程序来处理显然过程太长,造成新来的中断丢失。因此Linux将这种任务分割为两个部分,中断处理程序,短平快地处理与硬件相关的操作(如从网卡读

6、数据到系统缓存);而把对时间要求相对宽松的任务(如解析数据的工作)放在另一个部分执行,这个部分就是下半部任务。下半部任务是一种推后执行任务,它将某些不那么紧迫的任务推迟到系统更方便的时刻运行。内核中实现下半部的手段经过不断演化,目前已经从最原始的BH(bottom thalf) 衍生出tasklet,软中断softirq,BH,工作队列(work queues)。,www.embedu.org,8,7.3 Linux内核中断机制概述,3、软中断操作 软中断softirq不象硬中断那样是由硬件中断信号触发执行的,所以也不同于硬件中断那样时随时都能够被执行。总的来讲,软中断会在内核处理任务完毕后返

7、回用户级程序前得到处理机会。具体的讲,有三个时刻它将被执行do_softirq函数。硬件中断操作完成后,系统调用返回时,内核调度程序中。从中可以看出软中断会紧随硬中断处理,所以抢占内核任务至少在时钟中断后总有机会运行一次。还要记得软中断可以在不同处理器上并发执行。 使用时先open_softirq,需要出发此软中断时使用raise_softirq或cpu_raise_softirq。 软中断的执行也处于中断上下文中,所以中断上下文对它的限制是和硬中断一样的,一样不能进入阻塞状态。,www.embedu.org,9,7.3 Linux内核中断机制概述,tasklet和bottom half都是建

8、立在软中断之上的两种延迟机制,其具体不同之处在于软中断是静态分配的,而且同类软中断可以并发地在几个CPU上运行。tasklet可以动态分配,并且不同种类的Tasklets可以并发地在几个CPU上运行,但同类的Tasklets不可以。bottom half 只能静态分配。实际上,下半部分是一个不能与其它下半部分并发执行的高优先级tasklet,即使它们类型不同,而且在不同 CPU上运行。tasklet可以理解为软中断的派生,所以它的调度时机与软中断一致。 Tasklets与softirq的主要一个区别就是在同一时刻,只能用一个cpu来运行一个tasklet。而softirq就不然,可以在不同cp

9、u上运行同一个softirq,但要注意做好相关的保护工作。而它与BH的区别是不同的Tasklets可以在同一时刻运行在不同的cpu上,而BH是不可以的。而在它的结构定义中,最重要的就是func成员,它所指的地址就是最终要执行的处理函数。对于内核中需要延迟执行的多数任务都可以利用tasklet来完成,由于同类tasklet本身已经进行了同步保护,所以使用 tasklet 相比软中断要简单得多,而且效率也不错。 bottom half 是Linux最早的内核延迟方法,它结构简单且容易控制,因为所有的BH处理程序都被严格地顺序执行,不允许任何两个BH处理程序同时并发执行,即使它们的类型不同也不可以,

10、这样一来BH执行其间减少了许多同步保护。但是BH不得不被淘汰,因为它的“简便“牺牲了多处理器并发处理的高性能,等于一队人过独木桥那样速度受到牵制。 任务列队是BH的替代品,来自BH,所以它的属性也和BH相同。它的原意在于简化BH的操作接口,但它的随意性(数量随意、执行时机随意)却给系统带来了混乱,所以到今天已经被工作队列所取代。,www.embedu.org,10,7.4 编写中断处理程序ISR,7.4.1中断处理系统结构 irqaction数据结构中包含了对应于此中断处理的相关信息,包括中断处理例程的地址,此中断所属的模块名称,以及是否允许共享的标志位,如果允许共享next成员将指向共巷此中

11、断号的下一个irqaction的结构指针等。 中断发生时Linux首先读取系统可编程中断控制器中中断状态寄存器判断出中断源,将其转换成irq_action数组中偏移值。 根据中断号找到相应的irqaction后,内核是凭借 handler指针调入驱动程序的ISR,在此使用循环的意义是如果此中断号被多个ISR共享,可以依次遍历每一个注册的ISR,使它得到一次执行的机会。,www.embedu.org,11,7.4 编写中断处理程序ISR,7.4.2 注册中断处理函数 int request_irq(unsigned int irq, void (*handler)(int irq,void de

12、v_id,struct pt_regs *regs), unsigned long flags, const char *device, void *dev_id) 参数irq表示所要申请的硬件中断号。Handler是向系统登记的中断处理子程序,中断产生时由系统来调用,调用时所带参数irq为中断号,dev_id为申请时告诉系统的设备标识,regs为中断发生时寄存器内容。device为设备名,将会出现在/proc/interrupts文件里。flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序(flag里设置了SA_INTERRUPT)还是慢速处理程序(

13、不设置SA_INTERRUPT),快速处理程序运行时,所有中断都被屏蔽,而慢速处理程序运行时,除了正在处理的中断外,其它中断都没有被屏蔽。 Linux内核中注销一个中断处理的函数: void free_irq(unsigned int irq, void *dev_id),www.embedu.org,12,7.4 编写中断处理程序ISR,7.4.3 中断标志flags 中断标志flags可以设置为: SA_INTERRUPT。如果设置该位,就指示这是一个“快速“中断处理程序,如果清除这位,那么它就是一个“慢速“中断处理程序。 SA_SHIRQ 该位表明中断可以在设备间共享。共享的概念在稍后的

14、“中断共享“一节中介绍。 SA_SAMPLE_RANDOM 该位表明产生的中断对/dev/random和/dev/urandom设备要使用的熵池(entropy pool)有贡献。读这些设备返回真正的随机数,它们用来帮助应用软件选取用于加密的安全钥匙。这些随机数是从一个熵池中取得的,各种随机事件都会对系统的熵池(无序度)有贡献。如果希望设备真正随机地产生中断,应该置上这个标志。而如果的中断是可预测的(例如,帧捕捉卡的垂直消隐),那就不值得设置这个标志位它对系统的熵池没有任何贡献。,www.embedu.org,13,7.4 编写中断处理程序ISR,7.4.4 ISR上下文 当进程发出一个系统调

15、用的请求时,由应用态切换到内核态。这样的内核控制路径被成为进程内核路径,也叫进程上下文。当CPU执行一个与中断有关的内核控制路径的时候,被成为中断上下文。中断的上半部和下半部都属于ISR上下文。,www.embedu.org,14,7.5 tasklet机制,tasklet是一种特殊的软中断机制,它可以被多次调度运行。Linux内核使用tasklet机制实现底半部处理。软中断向量HI_SOFTIRQ和TASKLET_SOFTIRQ均是用tasklet机制来实现的。实际上,现在的底半处理程序本身就是用tasklet实现的。 tasklet机制是Linux内核对BH机制的一种扩展: 1. 与一般的

16、软中断不同,某一段tasklet代码在某个时刻只能在一个CPU上运行,而不像一般的软中断服务函数(即softirq_action结构中的action函数指针)那样在同一时刻可以被多个CPU并发地执行。 2. 与BH机制不同,不同的tasklet代码在同一时刻可以在多个CPU上并发地执行,而不像BH机制那样必须严格地串行化执行(也即在同一时刻系统中只能有一个CPU执行BH函数)。 tasklet_struct结构定义在文件中 定义一个处理函数:void my_tasklet_func(unsigned long) DECLARE_TASKLET(my_tasklet,my_tasklet_func,data); /*定义一个tasklet结构my_tasklet,与my_tasklet_func(data)函数相关联,相当于DECLARE_TASK_QUEUE() */ tasklet_schedule( /* 登记my_tasklet,允许系统在适当的时候进行调度运行,相当于queue_task(&my_task,&tq_immediate)和mark_bh(IMMED

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号