中断、定时和系统调用.ppt
《中断、定时和系统调用.ppt》由会员分享,可在线阅读,更多相关《中断、定时和系统调用.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中断、定时和系统调用中断和异常中断是一种触发信号,一个CPU接收到这样一种信号后会改变它执行代码的流程,一般是从一个固定的地址执行一段预先设定好的程序。中断的种类同步中断:异常,软中断程序运行过程中产生页错误,被0除,中断指令(int),.异步中断:中断,硬中断由设备产生键盘中断,时钟中断,.中断信号常被用来泛指上述各种中断。中断信号是系统的重要和稀缺的资源。每个中断和异常都有一个编号,0-255,称为中断向量。中断信号处理中断信号可以由进程或外部事件产生中断信号的处理只能由内核完成中断当前的程序,切换到中断处理代码中断处理代码不属于进程同步中断与当前进程相关异步中断与当前进程无关中断的结果与
2、进程相关中断处理条件:中断响应时间越快越好中断处理分成top half和bottom half。中断嵌套中断处理过程中对临界区的处理中断中断可屏蔽中断不可屏蔽中断中断控制器可编程中断控制器:PIC单处理器环境,8259A先进可编程中断控制器:APIC多处理器环境中断请求和中断控制器响应中断请求(IRQ)对中断请求的响应中断控制器产生中断的设备8259A8259A80 x86015异常80 x86处理器约有20个异常常见异常Divide error:被0除异常Invalid opcode:无效操作码异常Page fault:页失效异常每个异常都有相应的异常处理函数(handler)divide_
3、error(),invalid_op(),page_fault(),.中断门描述符内核管理中断使用的数据结构一个中断门描述符由8个字节组成描述符中保存有关中断的各种信息中断向量中断处理函数地址各种权限参数i386共有3种类型的中断门描述符Task Gate Descriptor:任务门描述符Interrupt Gate Descriptor:中断门描述符Trap Gate Descriptor:自陷门描述符不同类型的中断门描述符中断门描述符表内核维护的一个由256个表项的表,每个表项为一个中断门描述符。一个中断门描述符由8个字节组成,整个表共用内存空间2048字节。中断门描述符表保存在内存中,
4、其起始地址保存在一个专用的寄存器中。操作系统在使能中断之前要初始化中断门描述附表。中断门描述符表结构0132331282550号异常:Divide error,被0除1号异常:Debug,调试0号中断:IRQ01号中断:IRQ1中断指令:int 80Linux对中断的使用中断指令intint指令可以产生任意向量的中断Linux对中断的划分中断门:interrupt gate,用于硬件中断信号产生的中断,只能在内核模式下使用。系统门:system gate,用于实现系统调用,可由用户模式下的代码产生。int3,into,bound,int 80.自陷门:trap gate,用于其他异常的中断,只
5、能在内核模式下使用。初始化中断门描述符表初级初始化:setup_idt()缺省的中断处理函数:ignore_int()打印Unknown interrupt用ignore_int()填充中断门描述符表中所有表项的中断处理函数ignore_int函数应该永远不会被调用,除非系统硬件或内核出现问题。/*This is the default interrupt handler:-)*/int_msg:.asciz Unknown interruptnALIGNignore_int:cldpushl%eaxpushl%ecxpushl%edxpushl%espushl%dsmovl$(_KERNEL
6、_DS),%eaxmovl%eax,%dsmovl%eax,%espushl$int_msgcall SYMBOL_NAME(printk)popl%eaxpopl%dspopl%espopl%edxpopl%ecxpopl%eaxiretarch/i386/kernel/head.S:ignore_int/*setup_idt*sets up a idt with 256 entries pointing to*ignore_int,interrupt gates.It doesnt actually load*idt-that can be done only after paging h
7、as been enabled*and the kernel moved to PAGE_OFFSET.Interrupts*are enabled elsewhere,when we can be relatively*sure everything is ok.*/setup_idt:lea ignore_int,%edxmovl$(_KERNEL_CS 16),%eaxmovw%dx,%ax/*selector=0 x0010=cs*/movw$0 x8E00,%dx/*interrupt gate-dpl=0,present*/lea SYMBOL_NAME(idt_table),%e
8、dimov$256,%ecxrp_sidt:movl%eax,(%edi)movl%edx,4(%edi)addl$8,%edidec%ecxjne rp_sidtretarch/i386/kernel/head.S:setup_idt异常的处理Linux通常将CPU发出的异常作为错误条件处理页失效异常(page fault)作为内存管理的手段当异常发生时,内核向当前进程发送信号,通知进程有异常状态出现。通常情况下,进程因为错误状态的出现而退出运行。异常的处理将CPU的各种寄存器保存在进程的内核堆栈上调用异常处理函数处理异常调用ret_from_exception()从异常返回.set_tra
9、p_gate(0,÷_error);set_trap_gate(1,&debug);set_intr_gate(2,&nmi);set_system_gate(3,&int3);/*int3-5 can be called from all*/set_system_gate(4,&overflow);set_system_gate(5,&bounds);set_trap_gate(6,&invalid_op);set_trap_gate(7,&device_not_available);set_trap_gate(8,&double_fault);set_trap_gate(9,&
10、coprocessor_segment_overrun);set_trap_gate(10,&invalid_TSS);set_trap_gate(11,&segment_not_present);set_trap_gate(12,&stack_segment);set_trap_gate(13,&general_protection);set_intr_gate(14,&page_fault);set_trap_gate(15,&spurious_interrupt_bug);set_trap_gate(16,&coprocessor_error);set_trap_gate(17,&ali
11、gnment_check);set_trap_gate(18,&machine_check);set_trap_gate(19,&simd_coprocessor_error);set_system_gate(SYSCALL_VECTOR,&system_call);.arch/i386/kernel/trap.c:trap_init中断的处理中断的出现与当前进程很可能完全没有关系。中断发生时,内核不能通过向进程发送信号的方式通知进程出现中断信号。中断通常表示某种资源变得可用。中断的分类I/O中断定时器(Timer)中断CPU间中断内核根据中断种类分类处理I/O中断处理I/O中断线是系统稀有资
12、源中断共享不同设备可以共享同一个中断信号这种情况下,只使用中断向量不足以区分中断的来源中断动态分配中断资源只有在使用时才真正进行分配,并在使用后予以释放。中断处理函数中不能有任何进入阻塞的调用I/O中断的处理使用进程的内核堆栈保存中断向量以及各种CPU寄存器向中断控制器发送应答信号执行中断处理函数(中断服务程序,ISR)使用ret_from_intr()返回I/O中断的处理Linux中使用的中断向量分配I/O中断向量的分配IRQ描述符irqaction描述符handler指向中断服务程序flagsSA_INTERRUPTSA_SHIRQSA_SAMPLE_RANDOMnamedev_idnex
13、tSoftirq,Tasklet,Bottom Halves内核对中断的处理方式会极大影响系统的效率。为提高系统效率,内核将一个中断的响应分成2部分:需要立即处理的部分,称为top half或上半部,一般是不能再被中断的。可以推后处理的部分,称为bottom half或下半部,是可以再被中断的。下半部中断的实现机制SoftirqTaskletTasklet基于SoftirqBottom HalvesBottom Halves基于Tasklet中断下半部实现机制的差异所有的中断下半部都需要顺序执行SoftirqLinux 2.4内核中只实现了如下4种Softirq:可以看出,Tasklet是在S
14、oftirq基础上实现的。Tasklet最常用的中断下半部的实现机制Tasklet描述符next:指向下一个描述符的指针state:tasklet的状态TASKLET_STATE_SCHEDTASKLET_STATE_RUNcount:锁计数器func:指向tasklet函数的指针data:一般用于tasklet的私有数据Tasklet由Softirq启动Bottom Halves早期使用的中断下半部的实现机制,被称为BH机制。BH机制在一些传统的中断响应中仍被广泛使用。BH在实现方法上缺乏Tasklet的灵活性,一般都使用Tasklet代替BH。中断的返回Linux的时钟管理目标时钟中断:系
15、统心跳信号系统时钟:各种时间戳定时器:时钟种类实时钟:RTC时间戳计数器器:TSC可编程定时器:PIT几个常用的变量和概念HZ系统时钟中断1秒钟内产生的中断次数,100tick系统时钟中断的时间间隔,一个嘀嗒jiffies系统启动后所经历的系统时钟嘀嗒数,即tick数,也就是系统时钟中断的次数。时间片或时间量子(time slice,time quantum)分配给进程的时间段,以tick为单位。IRQ0:系统时钟中断由一个可编程定时器产生系统时钟中断以HZ为频率产生中断为系统提供基本的时间事件的驱动更新系统启动后经历的时间更新系统时钟的日期和时间判断一个进程是否已经用完所分配的时间量子,决定
16、是否需要进行进程切换用于各种系统资源的统计判断定时器是否到时IRQ0中断服务程序首先作为IRQ被初始化:timt_init()中断服务程序:timer_interrupt()根据硬件时钟读取各种时间值并保存调用do_timer_interrupt()调用do_timer()jiffies+update_process_times()mark_bh(TIMER_BH)其他操作timer_bh():update_times():更新系统时间计算系统负载 run_timer_list():负责处理软件定时器软件定时器由软件实现的定时器。使用软件定时器可以实现在给定的时间间隔后执行一个函数。内核提供软
17、件定时器的机制。但这种定时器只能保证定时时刻到时或到时之后才起作用。硬件定时器,如可编程定时器PIT,在定时时刻到时时就会立即发出中断。软件定时器是在系统时钟中断的下半部被处理,不能保证实时性。Linux提供2种定时器动态定时器用于内核中的定时应用时间间隔定时器可由用户空间的进程建立动态定时器当某些内核过程需要推迟运行时,可以使用动态定时器。动态定时器可以动态建立和撤销。动态定时器的数量可以有任意多个。动态定时器到时后会执行指定的函数,动态定时器到时之前可以被撤销。动态定时器以tick为最小时间单位。动态定时器的管理由数据结构timer_list保存并形成一个链表。/*In Linux 2.4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 定时 系统 调用
限制150内