嵌入式操作系统课件.ppt

上传人:牧羊曲112 文档编号:1559240 上传时间:2022-12-05 格式:PPT 页数:79 大小:2.74MB
返回 下载 相关 举报
嵌入式操作系统课件.ppt_第1页
第1页 / 共79页
嵌入式操作系统课件.ppt_第2页
第2页 / 共79页
嵌入式操作系统课件.ppt_第3页
第3页 / 共79页
嵌入式操作系统课件.ppt_第4页
第4页 / 共79页
嵌入式操作系统课件.ppt_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《嵌入式操作系统课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式操作系统课件.ppt(79页珍藏版)》请在三一办公上搜索。

1、嵌入式操作系统,中断和异常,为什么会有中断,内核的一个主要功能就是处理硬件外设I/O处理器速度一般比外设快很多内核必须处理其他任务,只有当外设真正完成了准备好了时CPU才转过来处理外设IOIO方式:轮询、中断、DMA等轮询方式效率不高中断机制就是满足上述条件的一种解决办法,主要内容,中断基础(ARM版)Linux内核中软件级中断处理及其数据结构Linux的软中断、tasklet以及下半部分,中断和异常,中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应中断异步的:由硬件随机产生,在程序执行的任何时候可能出现异常同步的:在(特殊的或出错的)指令执行时由C

2、PU控制单元产生我们用“中断信号”来通称这两种类型的中断,中断信号的作用,中断信号提供了一种特殊的方式,使得CPU转去运行正常程序之外的代码比如一个外设采集到一些数据,发出一个中断信号,CPU必须立刻响应这个信号,否则数据可能丢失当一个中断信号到达时,CPU必须停止它当前正在做的事,并且切换到一个新的活动为了做到这这一点,在进程的内核态堆栈保存程序计数器的当前值(即eip和cs寄存器)以便处理完中断的时候能正确返回到中断点,并把与中断信号相关的一个地址放入进程序计数器,从而进入中断的处理,中断信号的处理原则,快!当内核正在做一些别的事情的时候,中断会随时到来。无辜的正在运行的代码被打断中断处理

3、程序在run的时候可能禁止了同级中断中断处理程序对硬件操作,一般硬件对时间也是非常敏感的内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理向后推迟上半部分(top bottom)和下半部分(half bottom),允许不同类型中断的嵌套发生,这样能使更多的I/O设备处于忙状态尽管内核在处理一个中断时可以接受一个新的中断,但在内核代码中还在存在一些临界区,在临界区中,中断必须被禁止,中断上下文,中断上下文不同于进程上下文中断或异常处理程序执行的代码不是一个进程它是一个内核控制路径,代表了中断发生时正在运行的进程执行作为一个进程的内核控制路径,中断处理程序比一个进程要“轻”(中断上下文只

4、包含了很有限的几个寄存器,建立和终止这个上下文所需要的时间很少),中断上下文举例,分析A,B,C,D在互相抢占上的关系 假设: 2个interrupt context,记为A和B 2个process,记为C和D 1, 假设某个时刻C占用CPU运行,此时A中断发生,C被A抢占,A得以在CPU上执行。 由于Linux不为中断处理程序设置process context,A只能使用 C的kernel stack作为自己的运行栈,C进程,D进程,A中断,B中断,A中断发生,current,2 ,无论如何,Linux的interrupt context A绝对不会被某个进程C或者D抢占!这是由于所有已经启

5、动的interrupt contexts,不管是interrupt contexts之间切换,还是在某个interrupt context中执行代码的过程,决不可能插入scheduler调度例程的调用。除非interrupt context主动或者被动阻塞进入睡眠,唤起scheduler,但这是必须避免的,危险性见第3点说明。,C进程,D进程,A中断,B中断,A中断发生,current,3 ,关于第2点的解释:首先,interrupt context没有process context,A中断是“借”了C的进程上下文运行的,若允许A“阻塞”或“睡眠”,则C将被迫阻塞或睡眠,仅当A被“唤醒”C才被

6、唤醒;而“唤醒”后,A将按照C在就绪队列中的顺序被调度。这既损害了A的利益也污染了C的kernel stack。其次,如果interrupt context A由于阻塞或是其他原因睡眠,外界对系统的响应能力将变得不可忍受,4 ,那么interrupt context A和B的关系又如何呢?由于可能在interrupt context的某个步骤打开了CPU的IF flag标志,这使得在A过程中,B的irq line已经触发了PIC,进而触发了CPU IRQ pin,使得CPU执行中断B的interrupt context,这是中断上下文的嵌套过程。 5,通常Linux不对不同的interrupt

7、 contexts设置优先级,这种任意的嵌套是允许的当然可能某个实时Linux的patch会不允许低优先级的interrupt context抢占高优先级的interrupt context,C进程,D进程,A中断,B中断,A中断发生,current,B中断发生,开中断,中断和异常的分类(Intel文档),中断分为:可屏蔽中断(Maskable interrupt)I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断。可屏蔽中断可以处于两种状态:屏蔽的(masked)和非屏蔽的(unmasked)非屏蔽中断(Nonmaskable interrupt)只有几个特定的危急事件才引起非屏蔽中

8、断。如硬件故障或是掉电,异常分为:处理器探测异常由CPU执行指令时探测到一个反常条件时产生,如溢出、除0错等编程异常由编程者发出的特定请求产生,通常由int类指令触发通常叫做“软中断”例如系统调用,ARM的异常(中断)机制,在ARM中,中断异常系统调用统称为异常ARM的异常有7种,下面是向量表,ARM的寄存器和模式,ARM异常的优先级,ARM的异常(中断)机制,发生异常时异常返回:R14_ PCSPSR_ CPSR,开关中断,include/asm-arm/assembler.h,Interrupts are disabled when the I bit in the CPSR is set

9、. If the I bit is clear, ARM checks for an IRQ at instruction boundaries.,主要内容,中断基础(ARM版)Linux内核中软件级中断处理及其数据结构Linux的软中断、tasklet以及下半部分,中断和异常处理程序的嵌套执行,当内核处理一个中断或异常时,就开始了一个新的内核控制路径当CPU正在执行一个与中断相关的内核控制路径时,linux不允许进程切换。不过,一个中断处理程序可以被另外一个中断处理程序中断,这就是中断的嵌套执行,抢占原则普通进程可以被中断或异常处理程序打断异常处理程序可以被中断程序打断中断程序只可能被其他的

10、中断程序打断Linux允许中断嵌套的原因提高可编程中断控制器和设备控制器的吞吐量实现了一种没有优先级的中断模型,初始化中断向量表,内核启动中断前,必须初始化中断向量表,arch/arm/kernel/entry-armv.S,每个向量长度为4个字节,向量表的初始化,trap_init中,中断的处理vector_irq:普通的中断,vector_stub的宏定义,/arch/arm/kernel/entry-armv.S,_irq_user,ret_to_user,arch/arm/kernel/entry-common.S,_irq_svc,中断的处理vector_fiq:快速中断,异常处理1

11、:未定义指令异常,未定义指令异常,第2个向量对于协处理器的指令,arm处理器将等待协处理器来说明是否可以处理,若无响应,则产生未定义指令异常对于其他未定义指令,也产生该异常。,arch/arm/kernel/entry-armv.S,_und_usr,参见arch/arm/kernel/traps.c按hook处理,或者发送信号终止进程的执行,_und_svc,参见arch/arm/kernel/traps.c按hook处理,或者发送信号终止进程的执行,中断处理,中断跟异常不同,它并不是表示程序出错,而是硬件设备有所动作,所以不是简单地往当前进程发送一个信号就OK的主要有三种类型的中断:I/O

12、设备发出中断请求时钟中断处理器间中断(在SMP, Symmetric Multiprocessor上才会有这种中断),I/O中断处理,I/O中断处理程序必须足够灵活以给多个设备同时提供服务比如几个设备可以共享同一个IRQ线(2个8259级联也只能提供15根IRQ线,所以外设共享IRQ线是很正常的)这就意味着仅仅中断向量解决不了全部问题,灵活性以两种不同的方式达到IRQ共享:中断处理程序执行多个中断服务例程(interrupt service routines, ISRs)。每个ISR是一个与单独设备(共享IRQ线)相关的函数IRQ动态分配:一条IRQ线在可能的最后时刻才与一个设备相关联,为了保

13、证系统对外部的响应,一个中断处理程序必须被尽快的完成。因此,把所有的操作都放在中断处理程序中并不合适Linux中把紧随中断要执行的操作分为三类紧急的(critical)一般关中断运行。诸如对PIC应答中断,对PIC或是硬件控制器重新编程,或者修改由设备和处理器同时访问的数据,非紧急的(noncritical)如修改那些只有处理器才会访问的数据结构(例如按下一个键后读扫描码),这些也要很快完成,因此由中断处理程序立即执行,不过一般在开中断的情况下,非紧急可延迟的(noncritical deferrable)如把缓冲区内容拷贝到某个进程的地址空间(例如把键盘缓冲区内容发送到终端处理程序进程)。这

14、些操作可以被延迟较长的时间间隔而不影响内核操作,有兴趣的进程将会等待数据。内核用在一个更为合适的时机用独立的函数来执行这些操作,不管引起中断的设备是什么,所有的I/O中断处理程序都执行相同的基本操作1,若有必要,进入核心态2,在内核态堆栈保存上下文(用户态核心态)3,调用asm_do_IRQ4,恢复上下文5,若有必要,返回用户态,中断处理,asm_do_IRQ()函数,arch/arm/kernel/irq.c,include/asm-arm/mach/irq.h,asm_do_IRQ使用的数据结构(体系结构无关)irq_desc数组包含了NR_IRQS个irq_desc_t描述符,N,Irq

15、_desc,Irq_chip,中断控制器处理例程,每一个中断号具有一个描述符,使用action链表连接共享同一个中断号的多个设备和中断,查看相关数据结构查看irq_desc数组的定义和最初的初始化,include/linux/irq.h,kernel/irq/handle.c,irqaction数据结构,用来实现IRQ的共享,维护共享irq的特定设备和特定中断,所有共享一个irq的链接在一个action表中,由中断描述符中的action指针指向设置irqaction的函数:setup_irq,链表,中断处理程序,include/linux/interrupt.h,kernel/irq/mana

16、ge.c,irq_chip数据结构,为特定PIC编写的低级I/O例程例如为一个中断设置irq_chip,set_irq_chip,arch/arm/plat-s3c24xx/irq.c,kernel/irq/chip.c,例如,Init_IRQ的中断初始化,arch/arm/kernel/irq.c,函数setup_arch:,函数setup_arch:,关于machine_arch_type,以s3c2410为例,include/asm-arm/mach-types.h,arch/arm/kernel/setup.c,关于machine_desc,include/asm-arm/mach/a

17、rch.h,以smdk2410为例,arch/arm/mach-s3c2410/mach-smdk2410.c,阅读:arch/arm/plat-s3c24xx/irq.c,irq_desc的第一个数据项:irq_flow_handler_t handle_irq,_set_irq_handler设置handle_irq数据项handle_level_irq handle_simple_irqhandle_fasteoi_irqhandle_edge_irqhandle_percpu_irq,arch/arm/plat-s3c24xx/irq.c,kernel/irq/chip.c,Actio

18、nhandle,在setup_irq时,给定例如,arch/arm/plat-s3c24xx/time.c,中断处理,asm_do_IRQ()函数,arch/arm/kernel/irq.c,include/asm-arm/mach/irq.h,以handle_level_irq为例,handle_level_irq,handle_IRQ_event(irq, action);,kernel/irq/handle.c,小结:中断处理过程,根据需要进入核心态保存上下文调用asm_do_IRQ根据中断号,找到中断处理函数处理恢复上下文根据需要返回用户态,主要内容,中断信号的作用和中断信号处理的一般

19、原则I/O设备如何引起CPU中断x86 CPU如何在硬件级处理中断信号Linux内核中软件级中断处理及其数据结构Linux的软中断、tasklet以及下半部分,软中断、tasklet以及下半部分,对内核来讲,可延迟中断不是很紧急,可以将它们从中断处理例程中抽取出来,保证较短的中断响应时间Linux2.6提供了三种方法可延迟的函数软中断、taskletTasklet在软中断之上实现一般原则:在同一个CPU上软中断/tasklet不嵌套软中断由内核静态分配(编译时确定)Tasklet可以在运行时分配和初始化(例如装入一个内核模块时)工作队列( work queues ),一般而言,可延迟函数上可以

20、执行4种操作初始化:定义一个新的可延迟函数,通常在内核初始化时进行激活:设置可延迟函数在下一轮处理中执行屏蔽:有选择的屏蔽一个可延迟函数,这样即使被激活也不会被运行执行:在特定的时间执行可延迟函数,Linux2.6.26使用有限个软中断,软中断,优先级0:处理高优先级的tasklet和下半部分,优先级2:把数据包传送到网卡,优先级3:从网卡接受数据包,优先级5:处理tasklet,优先级1:与时钟中断相关的tasklet,优先级4:块设备相关,优先级6:调度SMP相关,include/linux/interrupt.h,在softirq_vec中定义,优先级对应于softirq_vec的下标,

21、软中断函数及其参数,kernel/softirq.c,include/linux/interrupt.h,软中断的初始化,初始化软中断函数分别在softirq_init和net_dev_init、blk_dev_init等中初始化,例如,kernel/softirq.c,net/core/dev.c,kernel/softirq.c,软中断的触发,raise_softirq,include/asm-blackfin/hardirq.h,typedef struct unsigned int _softirq_pending;unsigned int local_timer_irqs; _cac

22、heline_aligned irq_cpustat_t;,kernel/softirq.c,#ifndef _ARCH_IRQ_STATirq_cpustat_t irq_statNR_CPUS _cacheline_aligned;EXPORT_SYMBOL(irq_stat);#endif,kernel/softirq.c,软中断的检查,local_softirq_pending在某些特定的时机,会检查是否有软中断被挂起调用local_bh_enable重新激活软中断时当asm_do_IRQ完成了I/O中断的处理时调用irq_exit当那个特定的进程ksoftirqd被唤醒时这种时机,称

23、为检查点,if (!in_interrupt() =即do_softirq,在每个检查点,若有软中断被挂起,就调用do_softirq判断是否可以执行软中断若可以,就执行软中断执行后,若发现又有新的软中断被激活,就唤醒ksoftirqd进程,来触发do_softirq的另一次执行,kernel/softirq.c,Ksoftirqd内核线程,kernel/softirq.c,Tasklet,Tasklet是I/O驱动程序中实现可延迟函数的首选方法建立在HI_SOFTIRQ和TASKLET_SOFTIRQ等软中断之上Tasklet和高优先级的tasklet分别存放在tasklet_vec和tas

24、klet_hi_vec数组中数组的每一项针对一个CPU,代表这个CPU上的tasklet列表分别由tasklet_action和tasklet_hi_action处理找到CPU对应的那个项,遍历执行,0:enable0:disable,include/linux/interrupt.h,kernel/softirq.c,kernel/softirq.c,Tasklet的使用,当需要使用tasklet时,可以按照如下方法进行1、分配一个tasklet的数据结构,并初始化=相当于声明(定义)一个tasklet2、可以禁止/允许这个tasklet=相当于定义了一个是否允许使用tasklet的窗口3、

25、可以激活这个tasklet=这个tasklet被插入task_vec或者task_hi_vec的相应CPU的链表上,将在合适的时机得到处理,激活tasklet的方法,即将tasklet插入到合适的链表中Tasklet_scheduleTasklet_hi_schedule,工作队列和工作线程,相关数据结构workqueue_struct;cpu_workqueue_structwork_struct;delayed_work入列 queue_work;queue_delayed_work工作队列的处理run_workqueueworker_thread,从中断和异常返回(阅读源码),中断和异常的终止目的很清楚,即恢复某个程序的执行,但是还有几个问题要考虑内核控制路径是否嵌套如果仅仅只有一条内核控制路径,那CPU必须切换到用户态挂起进程的切换请求如果有任何请求,必须调度;否则,当前进程得以运行挂起的信号如果一个信号发送到进程,那必须处理它,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号