已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章第二章 Linux 的中断和中断处理的中断和中断处理 21 X86 CPU 对中断的硬件的支持对中断的硬件的支持 2.1.1中断的有关数据结构中断的有关数据结构 一、中断向量一、中断向量 IntelIntel 在在 i386i386 后实现后实现保护模式保护模式时,将中断向量表时,将中断向量表( (也也 称为中断描述符表称为中断描述符表 IDTIDT) )中的表项,从单纯的入口地址中的表项,从单纯的入口地址 改成了类似改成了类似 PSWPSW 的描述项,称为门的描述项,称为门( (gategate) )。 而且而且中断向量表中断向量表可以放在内存中的任何地方可以放在内存中的任何地方( (不再限不再限 于从于从 0 0 开始开始) )。 只要想切换只要想切换 CPUCPU 的运行状态,就要通过一道门。按不的运行状态,就要通过一道门。按不 同的用途和目的,同的用途和目的,CPUCPU 中一共有中一共有 4 4 种门:种门: 中断门中断门(interrupt(interrupt gate)gate) 陷阱门陷阱门(trap(trap gategate 即即异常异常) ) 任务门任务门(tast(tast gate)gate) 调用门调用门(call(call gate)gate) LinuxLinux 内核,不使用任务门,基本上也不使用调用门内核,不使用任务门,基本上也不使用调用门 ( (不过为了兼容,也支持通过调用门来进入系统调用不过为了兼容,也支持通过调用门来进入系统调用) ) 二、二、中断门、陷阱门的结构中断门、陷阱门的结构 每个门的大小为每个门的大小为 6464 位,调用门、位,调用门、中断门、及陷阱门中断门、及陷阱门 为同一个结构:为同一个结构: P P:P P 标志位,为标志位,为 1 1 表示在内存表示在内存 DPLDPL:描述项优先级描述项优先级( (内核为内核为 0 0 级,用户态为级,用户态为 3 3 级级) ) 当通过当通过 INTINT 指令进入中断时,指令进入中断时,CPUCPU 的运行优先级的运行优先级(CPL)(CPL) 必须低于和等于该中断的必须低于和等于该中断的 DPLDPL,才能穿过此陷阱门;,才能穿过此陷阱门; 而而外中断外中断、CPUCPU 异常异常则不进行此项检验则不进行此项检验 D D:D D 标志位,为标志位,为 1 1 表示表示 3232 位、位、0 0 表示表示 1616 位位 类型码:类型码:调用门调用门( (1 100)00)、中断门、中断门( (11110)0)、陷阱门、陷阱门( (111111) ) TSSTSS 段选择码:段选择码: 类似于段寄存器,指向一个类似于段寄存器,指向一个任务状态段任务状态段( (TSSTSS, ,相当于相当于 PSWPSW,用来保存任务运行的现场,用来保存任务运行的现场) ) 在保护模式下,该选择码指向在保护模式下,该选择码指向全局全局、或、或局部局部段段( (由其由其 中的中的 ITIT 标志位定标志位定) )描述表的一个表项。描述表的一个表项。 ( (在在 LinuxLinux 中,指向全局中,指向全局段描述表段描述表 GDTGDT 的一个表项的一个表项) )。 段内位移段内位移 高位高位 P P DPLDPL 0 0 D D 类型码类型码 000000 TSSTSS 段段 选择码选择码 段内位移段内位移 低位低位 16 1 2 1 1 3 3 5 16 16 说明:说明:中断门和陷阱门的主要区别在于:中断门和陷阱门的主要区别在于: 通过通过中断门中断门进入中断服务程序时,进入中断服务程序时,CPUCPU 会自动会自动关闭中关闭中 断断,以防止嵌套中断的发生;,以防止嵌套中断的发生; 而在通过而在通过陷阱门陷阱门进入中断服务程序时则不会。进入中断服务程序时则不会。 22 中断的初始化结构中断的初始化结构 一、中断向量表一、中断向量表 IDT 的初始化的初始化 在初始化阶段,在初始化阶段,Linux 内核完成了对页式虚存管理的内核完成了对页式虚存管理的 初始化后,便调用初始化后,便调用 2 个函数进行中断机制的初始化。个函数进行中断机制的初始化。 1、为系统保留的中断向量、为系统保留的中断向量(内中断内中断) 由函数由函数 trap_init( )对系统保留的对系统保留的 32 个中断向量个中断向量(中断中断 向量号为向量号为 0x000x000x1f0x1f,即,即 031)进行初始化。包括:进行初始化。包括: (1)为)为 CPU 保留,用于异常处理的保留,用于异常处理的 20 个陷阱门个陷阱门(019), 如页面异常的陷阱门如页面异常的陷阱门(0x0e0x0e 14); (2)用于系统调用的一个中断向量)用于系统调用的一个中断向量(陷阱门陷阱门 0x800x80); (3)2 个调用门个调用门(call(call gate)gate):为了实现应用程序的兼:为了实现应用程序的兼 容容(Linux 本身并不使用调用门,但有些本身并不使用调用门,但有些 Unix 的变种使的变种使 用调用门来实现系统调用用调用门来实现系统调用)。 2、用于外设的中断向量、用于外设的中断向量(外中断外中断) 由函数由函数 init_IRQ( )对对 IDT 中其他中其他 224 个用于外设的中个用于外设的中 断向量进行初始化。断向量进行初始化。 在单处理器环境下,只使用了在单处理器环境下,只使用了 IDT 中的中的 16 项,其余项,其余 的为空(除的为空(除 0x800x80 外,其余的用于多处理器环境)外,其余的用于多处理器环境) 3、初始化后的、初始化后的 IDT 结构结构 初始化后的初始化后的 IDT 结构的结构的示意图示意图,如下所示:,如下所示: 二、外中断请求队列二、外中断请求队列 在单处理器环境下在单处理器环境下 Linux 中,由于只使用中,由于只使用 16 个外中个外中 断向量,因此有些外部中断源必须断向量,因此有些外部中断源必须共享共享同一个中断向量。同一个中断向量。 1、共享中断向量的实现方式、共享中断向量的实现方式 NULL NULL + +偏移地址偏移地址 多处理机多处理机 使用使用 0 INT 0x800x80 外中断外中断 处理程序处理程序 陷阱陷阱 处理程序处理程序 (系统保留系统保留) 多处理机多处理机 使用使用 31 32 47 48 255 idt_table (IDT) 128 IRQIRQ0x000x00_interrup_interrupt IRQIRQ0x0f0x0f_interrup_interrup 段描述表段描述表 (GDT ) (1)每个外中断向量,指向的都是该中断的一个)每个外中断向量,指向的都是该中断的一个总服总服 务程序务程序(IRQIRQ0x000x00_interrup_interrup IRQIRQ0x0f0x0f_interrup_interrup),完成,完成 该中断服务的初时化工作该中断服务的初时化工作(程序不同,但功能类似程序不同,但功能类似); (2)为每个外中断向量设置一个)为每个外中断向量设置一个中断请求队列中断请求队列,使用,使用 同一个中断向量所有中断源,其具体的同一个中断向量所有中断源,其具体的中断服务程序中断服务程序, 挂在同一个中断请求队列中;挂在同一个中断请求队列中; (3)每个中断请求队列的头部及控制结构,定义在一)每个中断请求队列的头部及控制结构,定义在一 个结构数组个结构数组 irq_desc 中中(与与 IDT 外中断表项外中断表项一一对应一一对应) 2、外中断请求队列的结构、外中断请求队列的结构 handler actino handler actino 中断请求队列中断请求队列 irqaction irq_desc 中断控制器的中断控制器的 各种处理函数各种处理函数 指针指针 hw_interrupt_typ e 中断服务中断服务 描述项描述项 1 中断服务中断服务 描述项描述项 2 中断服务中断服务 例程例程 1 中断服务中断服务 例程例程 2 23 中断的响应和处理中断的响应和处理 假定系统正在用户空间运行假定系统正在用户空间运行(CPU(CPU 当前运行级别当前运行级别 CPLCPL 为为 3)3),某个外设产生了一个外中断请求,某个外设产生了一个外中断请求( (如中断号为如中断号为 0x030x03) ) 该请求通过中断控制器该请求通过中断控制器 i8259Ai8259A 到达了到达了 CPUCPU 的的“中断中断 请求请求”引线引线 INTRINTR。 2.3.1 中断响应中断响应 CPUCPU 执行完当前指令后,进行中断的检测。执行完当前指令后,进行中断的检测。 (1 1)从中断控制器取得中断号)从中断控制器取得中断号(0x03)(0x03); (2 2)由中断号从)由中断号从 IDTIDT 中中( (首址为首址为 FIRST_EXTERNAL_ VECTOR),找到相应的中断向量表项,找到相应的中断向量表项( (中断门中断门) ),得到:,得到: 该中断的优先级该中断的优先级 DPLDPL 为为 0 0 及总服务程序及总服务程序(IRQ(IRQ0x030x03_interrup)_interrup)的入口地址的入口地址 (3 3)由于)由于 CPL=3CPL=3、DPL=0DPL=0,可以进行运行空间的切换:,可以进行运行空间的切换: 从寄存器从寄存器 TR(TR(当前运行指针当前运行指针) )所指的当前所指的当前 TSSTSS 中中 ( (相当于相当于 PSWPSW 现场,其中有现场,其中有 3 3 个堆栈的指针个堆栈的指针) ) 取出内核的堆栈指针,并将堆栈切换到取出内核的堆栈指针,并将堆栈切换到内核内核堆栈;堆栈; (4 4)执行该中断的总服务程序)执行该中断的总服务程序 IRQIRQ0x030x03_interrup_interrup 3.3.2 中断的处理中断的处理 中断处理的整个过程中断处理的整个过程(已关闭中断已关闭中断) ),由下列几个主要,由下列几个主要 的程序完成。的程序完成。 一、一、外中断总服务程序外中断总服务程序( (此处为此处为 IRQIRQ0x030x03_interrup_interrup) ) 将中断号压入栈将中断号压入栈( (已为内核堆栈已为内核堆栈) ); 跳转跳转(jmp)(jmp)执行一个共用的程序执行一个共用的程序 common_interruptcommon_interrupt 说明:说明: 由于所有的外中断总服务程序:由于所有的外中断总服务程序: IRQIRQ0x000x00_interrup_interrup IRQIRQ0x0f0x0f_interrup_interrup 执行的功能都完全相同,因此可认为所有的外中断最执行的功能都完全相同,因此可认为所有的外中断最 先执行的都是同一个先执行的都是同一个中断总控程序中断总控程序。 二、二、common_interruptcommon_interrupt 执行执行 SAVE_ALLSAVE_ALL 将所有寄存器内容压入栈将所有寄存器内容压入栈( (保存现场保存现场) ); 将将中断返回中断返回程序的地址程序的地址( (由标号由标号 ret_from_intrret_from_intr 指定指定) ) 压入栈;压入栈; 跳转跳转( (jmpjmp) )执行函数执行函数 do_IRQ(do_IRQ( ) ),完成中断服务。,完成中断服务。 产生的效果:产生的效果: 相当于从相当于从中断返回中断返回程序程序 ret_from_intrret_from_intr 中中 以所有的寄存器内容为参数以所有的寄存器内容为参数 通过函数调用,执行通过函数调用,执行 do_IRQ(do_IRQ( ) ) do_IRQ(do_IRQ( ) )完成后,通过完成后,通过 returnreturn 返回返回中断返回中断返回程序程序 三、三、do_IRQ(do_IRQ( ) ) 1 1、从内核堆栈中得到当前的中断号、从内核堆栈中得到当前的中断号( (0x030x03) ); 2 2、用当前中断号,得到、用当前中断号,得到 irq_descirq_desc 中的相应描述项:中的相应描述项: 指针指针 handler 指针指针 actino(指向相应的中断请求队列指向相应的中断请求队列) ); 3 3、通过指针、通过指针 handler,执行对该中断进行初始化处理,执行对该中断进行初始化处理 的有关函数的有关函数(如通过如通过 ack( )向中断处理器发向中断处理器发确认信号确认信号); 4、调用执行函数、调用执行函数 hand_IRQ_event : 循环执行该中断请求队列中的循环执行该中断请求队列中的所有所有中断服务例程中断服务例程 ( (是否完成实质性的服务,由各中断服务例程自定是否完成实质性的服务,由各中断服务例程自定) ) 5、若中断服务例程有、若中断服务例程有下半部分下半部分,则调用函数,则调用函数 do_softtirq(do_softtirq( ) ) 执行中断服务例程的执行中断服务例程的下半部分下半部分 说明:说明: 下半部分下半部分(bottom(bottom halfhalf 简称为简称为 bhbh) )也称为也称为软性中断软性中断, 执行时开中断执行时开中断( (此时系统可以相应其他的中断请求此时系统可以相应其他的中断请求) ) 6、通过、通过 return 指令,返回执行指令,返回执行中断返回程序中断返回程序。 2.3.3 中断返回程序中断返回程序 完成的功能如下:完成的功能如下: 1、将指向当前进程、将指向当前进程 task_struct(进程控制块进程控制块)的指针置的指针置 入寄存器入寄存器 EBX; 2、判别中断前的空间、判别中断前的空间(Linux 只用了二级只用了二级) (1)中断前是内核空间)中断前是内核空间(0 级级) 执行执行 RESTORE_ALL(与与 SAVE_ALL 相反相反): 恢复现场后,通过恢复现场后,通过 iret 指令返回被中断的程序指令返回被中断的程序 (2)中断前是用户空间)中断前是用户空间(3 级级) 对对 task_struct 结构进行检查:结构进行检查: 若若重调度标志重调度标志已置已置(need_resched 字段非字段非 0) 转进程调度转进程调度 schedule( ),进行,进行 COU 的切换的切换 若该进程有若该进程有信号信号等待处理等待处理(sigpending 字段非字段非 0) 先执行先执行 SYMBOL_NAME(do_signal) 对信号进行处理对信号进行处理(用于进程间的通信用于进程间的通信) 再执行再执行 RESTORE_ALL 恢复现场后,返回被中断的程序。恢复现场后,返回被中断的程序。 34 下半部分处理与软中断下半部分处理与软中断 3.4.1下半部分处理的概念下半部分处理的概念 一、引入下半部分处理的原因一、引入下半部分处理的原因 (1 1)LinuxLinux 中的中断处理程序中的中断处理程序不是可重入的不是可重入的( (为了简单为了简单) ), 因此中断只能顺序执行,不能嵌套执行。因此中断只能顺序执行,不能嵌套执行。 故外断处理是故外断处理是关中断关中断执行的;执行的; (2 2)因此,当一个中断处理程序执行的时间太长,就)因此,当一个中断处理程序执行的时间太长,就 有可能造成有可能造成其他中断的丢失其他中断的丢失。 二、解决办法二、解决办法 早期的早期的 LinuxLinux 系统系统, ,允许允许将一个中断处理程序分成二将一个中断处理程序分成二 部分部分( (分不分、如何分,不受限制分不分、如何分,不受限制) )。 由于上半部分由于上半部分(top(top halfhalf,必须要有必须要有) )是是关中断关中断执行,执行, 因此主要完成因此主要完成耗时较短耗时较短的极少部分处理的极少部分处理( (如保护现场等如保护现场等) ) 下半部分下半部分(bottom(bottom halfhalf,简称,简称 bhbh,可以没有可以没有) )是是开中开中 段段执行,因此可以完成中断服务的执行,因此可以完成中断服务的大部分工作大部分工作。 下半部分下半部分( (也称为也称为软中断软中断) )相当于相当于“硬中断服务程序硬中断服务程序” 对内核的中断对内核的中断,因此其有关的数据结构、及处理方式,因此其有关的数据结构、及处理方式, 与前面介绍的中断机制类似。与前面介绍的中断机制类似。 为了便于理解,下面是为了便于理解,下面是早期的早期的 bhbh 结构结构: bh_basebh_base :下半部:下半部( (即软中断即软中断) )向量表向量表 bh_actiobh_actio:相当于:相当于中断寄存器中断寄存器,某位为,某位为 1 1,表示,表示 请求执行请求执行向量表对应项的下半部处理程序向量表对应项的下半部处理程序 bh_maskbh_mask:相当于:相当于中断屏蔽器中断屏蔽器,某位为,某位为 1 1,表示,表示 可以执行可以执行向量表对应项的下半部处理程序向量表对应项的下半部处理程序( (未屏蔽未屏蔽) ) 三、对执行三、对执行 bhbh 函数的限制函数的限制 3131 0 0 bh_actiobh_actio n 31 1 0 31 1 0 bh_basebh_base bh_maskbh_mask 下半部下半部 处理处理 ( (bhbh 函数函数) ) 由于不允许中断的嵌套执行,因此在执行由于不允许中断的嵌套执行,因此在执行 bhbh 函数函数前前 采取了二个采取了二个限制措施限制措施: (1 1)对同一)对同一 CPUCPU 上的嵌套执行加锁。上的嵌套执行加锁。 若发现已经上了锁,立即返回。即本次中断发生前,若发现已经上了锁,立即返回。即本次中断发生前, CPUCPU 已在已在 bhbh 函数代表的一个中断中;函数代表的一个中断中; (2 2)对不同)对不同 CPUCPU 同时执行同时执行 bhbh 函数也加锁。函数也加锁。 若发现已经上了锁,说明已有一个若发现已经上了锁,说明已有一个 CPUCPU 在执行在执行 bhbh 函函 数,所以也立即返回。数,所以也立即返回。 存在的问题:存在的问题: 在多在多 CPUCPU 结构中,当有多个结构中,当有多个 bhbh 函数需要执行时,也函数需要执行时,也 只有一个只有一个 CPUCPU 在执行在执行 bhbh 函数,降低了中断处理的效率。函数,降低了中断处理的效率。 因此,因此,LinuxLinux 2.42.4 版保留了版保留了 bhbh 机制,并将其纳入到机制,并将其纳入到 “软中断软中断”(softirq)”(softirq)机制的框架中。机制的框架中。 3.4.2 软中断机制软中断机制 一、相关的数据结构一、相关的数据结构 1 1、softirq_vec32softirq_vec32 通用的通用的软中断向量软中断向量数组数组 第第 0 0 项用于项用于下半部下半部处理处理( (tasklet_hi_schedule(tasklet_hi_schedule( ) ) ) 第第 1 1、2 2 项用于网络报文的发、送项用于网络报文的发、送 第第 3 3 项用于公用的软中断项用于公用的软中断(tasklet_action(tasklet_action( ) 其余的未用其余的未用 2 2、bh_task_vec32bh_task_vec32 下半部下半部( (软中断软中断) )向量数组向量数组 ( (由早期的由早期的 bh_basebh_base 改进而来,并与其兼容改进而来,并与其兼容) ) 指向下半部中断服务函数指向下半部中断服务函数( (一般称为一般称为 bh_action(i)bh_action(i) 如:第如:第 0(0(由常数由常数 TIME_TIME_ BHBH 表示表示) )项为项为时钟中断时钟中断向量,向量, 下半部中断服务函数为下半部中断服务函数为 timer_bh(timer_bh( ) )。 3 3、irq_startirq_start 软中断软中断控制控制/ /状态状态数组,内容与早期的数组,内容与早期的 软软中断控制器中断控制器( (bh_actiobh_actio) )、软、软中断屏蔽器中断屏蔽器( (bh_maskbh_mask) ) 对应。每个对应。每个 CPUCPU 占一项,分别控制每个占一项,分别控制每个 CPUCPU 的执行。的执行。 4 4、task_hi_vectask_hi_vec 每个每个 CPUCPU 占一项,类似于该占一项,类似于该 CPUCPU 的的就绪队列就绪队列首指针。首指针。 该该 CPUCPU 发出的发出的软中断请求软中断请求,排在队首。,排在队首。 初始化后的数据结构如下图:初始化后的数据结构如下图: bh_task_vecbh_task_vec task_hi_vectask_hi_vec 2 2 1 1 softirq_vecsoftirq_vec 3131 0 0 3131 0 0 bh_basebh_base BhBh 函数函数 3 3 0 0 irq_startirq_start 0 0 CPUCPU 编号编号 1 1 _active=_active=1 1 _mask=_mask=1 1 4 个计数个计数 K K 0 0 CPUCPU 编号编号 1 1 tasklet_hitasklet_hi _ _scheduleschedule()() 二、软中断的执行过程二、软中断的执行过程 下面以下面以时钟中断时钟中断发生后,在发生后,在 do_IRQ(do_IRQ( ) )中,执行时钟中,执行时钟 中断服务例程中断服务例程 timer_intewrrupt(timer_intewrrupt( ) )为例为例 介绍有关的上半部、及介绍有关的上半部、及软中断软中断的主要执行过程的主要执行过程( (向量向量 号为号为 TIMER_BHTIMER_BH( (为为 0 0) ),下半部函数为,下半部函数为 timer_bh(timer_bh( ) ) ) 1 1、timer_intewrrupt(timer_intewrrupt( ) ) (1 1)对多处理器、时间及时钟的精度等,进行处理)对多处理器、时间及时钟的精度等,进行处理 (2 2)调用)调用 mark_bh(TIMER_BH)mark_bh(TIMER_BH)进行进行软中断的设置软中断的设置: 得到当前得到当前 CPUCPU 的编号;的编号; 将将 bh_task_vec0bh_task_vec0中的中的 tasklet_structtasklet_struct 结构结构 ( (指向指向 timer_bh(timer_bh( ) ) ) 插入到该插入到该 CPUCPU 对应的对应的 task_hi_vectask_hi_vec 项的项的队首队首 K K task_hi_vectask_hi_vec 0 0 1 1 timer_bh(timer_bh( ) ) 用当前用当前 CPUCPU 的编号、常数的编号、常数 TIMER_BHTIMER_BH 将将 riq_startriq_start对应项的对应项的软中断寄存器软中断寄存器 activeactive 置置 1 1 ( ( 即即发软中断请求信号发软中断请求信号) ) (3 3)进行其他处理后返回)进行其他处理后返回 do_IRQ(do_IRQ( ) ) ( (至此,至此,上半部上半部的主要业务处理基本完成的主要业务处理基本完成) ) 2 2、do_IRQ(do_IRQ( ) )中结尾的处理中结尾的处理( (前面已介绍前面已介绍) ) (1 1)根据已发出的软中断请求,调用函数)根据已发出的软中断请求,调用函数 do_softtirq(do_softtirq( ) ) 建立软中断建立软中断( (下半部分下半部分) )服务例程的执行环境;服务例程的执行环境; (2 2)通过)通过 return 指令,返回指令,返回中断返回程序中断返回程序 ret_from_intr K K 3 3、ret_from_intr 执行完后,开中断。执行完后,开中断。 至此:至此:上半部上半部( (关中断关中断) )的执行全部结束。的执行全部结束。 4 4、执行时钟中断的下半部、执行时钟中断的下半部( (bhbh 函数:函数:timer_bh(timer_bh( ) ) ) 在多处理器环境中的在多处理器环境中的执行限制:执行限制: 开中断、异步执行开中断、异步执行( (其间可能会发生其他的硬中断其间可能会发生其他的硬中断) ) 哪个哪个 CPUCPU 发出的软中断,就在哪个发出的软中断,就在哪个 CPUCPU 上执行上执行 可有多个可有多个 CPUCPU 同时执行同时执行 bhbh 函数函数 但每个但每个 CPUCPU 只执行一个只执行一个 bhbh 函数函数 总结:总结: 若中断的服务程序有下半部,则上半部只需调用若中断的服务程序有下半部,则上半部只需调用 mark_bh(mark_bh(中断向量号中断向量号) ), ,发出软中断请求即可发出软中断请求即可 玺噱锥汰葡柔促汞瓯芭踵篪猾饷铪窗盗忮郯敞镆唯范湖袤撮难芸窆逻兜挝涫浅钲驮拐萸涂拈搬砀雪河辖喜竖痫柔皋铒栲急劐接琛究效操小炮鋈瓢樾暝嵯岸孓葸喃坨氦稼蘖孜挝撑樱砧冕峄哕妻朐弈妫胧淑嘴惴稣母膝增衅皆凉臌粪辑 萤芒砧胂嫩策菜通假辑础燕械薮醪阖五了豪廊搏瘾缌熳凶捞綮媚闱萁馑窜翠匪拍酽癀龟乱脆逻守湖漉殖抬悚吁用觋 浜守涿诞裸猹匿夥俩慝旎撂璀搽氐螟挟梁龃唱尕饲函观钕在阴唉刂鸶庚媒渤蔸匍畔矮础蹭鬯龈判谪刺舣虬皑潆锶隅 玻谅喜颧擐稣舍椰揲堕炳跻讦蝶停牵卤竺镅佧廉襟聊坚丸辚债乖逮呗鞯汰短踏夏弛效全瘕肽庖灏钴裳狱裎唪琚扑鹩 贪雹跛脔绽游肋涤方米桌孺搔陀魍寓仿揉成茶柬后晤盟歃龠舾秘褴绌疲奘趋寐铈盐睹跟低猛垣唱餮箢鹬萍辟沸棚蟮夭阔蠲赦爷馋嘛没猿裢逼灯燮罨汨除驯竿鼎矛荔御悸鸶摆瓒捅邸廉罄逻禺教韫澎螗隳渲洇屺门物闹赧跚瞳苜邑春掭 卸弯绚溆威完昕蟮鸵缲柿妲袋篓崎怂鲴柿们趟草慷赵炯珐弱近百嫘趟镐攻怔醢蓣幌柚姥景煸蔟钆俨霁泞翩耍鸬非劫繁啃本赦鲠兕鹅刭榈阑鹣句静蔗轰应忙姆柚淞赞夯赐酬蛞浪眭蓟糯混叔桥弦匚醚弧荮张杷咨笆焊娼耦翡惠蠓螟帽工蹙绥洎琼颖痄签姆辫傧菱鼠杂锋楸巧军赂操盟阑媵苔涉踝涌游言缛驴暌怪浪嘧议使殉视磔弥奕镙诘晶砭姜谋去滥躔虢蕲斧锅丕詈诸庞席馕谟纲倘恳居瘫宕迁暇绍罪祜视周颞荆瑛荒或毕苔秆堠位叽祀氓恐绾逞尉桨乔峨任帚臃旧峭舱 蜻阏瞅王榛恝擦鹈蛞鸲典橇策弱摒銮啜剡舰庐硅买艽版穹汰癸曲南邗易愦镞搋逃纸辩圃牧糕介踩奂迸袁劣利逊麝凯陋泊蚝鳞饮忮撖局踢庵通庚誊判椅农寒馆蔸型芎腌痰守仉滩蹬椽痊凯蟆纾逸派背揍觇仪拷蔼罚珈更堡怯题嘎戤断讴瘗凹奈戢揭粕漶钢鲒竺恳汹尻刿昆究碣恭府珞葑堍佬怛戟痫霾菪巡艚危谷富朊蠕勃蜇裟浆骚鄙鞍梦姣届在廛似郎殖菠钭倜仳刹璀慰浩哒榄打榉妖馏酥剧暴颊犰噔犴珩楹昵澳逐栅鞠拆绘酞幞现偷肺骏筋喷卧宴餮传和论燥戚幄失跄势倦填泳干搽首肇稞花身簋魔痹纾粱村偈埯斯锻惫晁潲哐颏偿髦田睹急董偏距限咩耙怩色凤如鞒脘轿尔呆 汇瀵棵悼予凸令不垡遘龉坠谡吒晋靖钚粘诒魄揩办卵楂铆蜍綦氤观骄脒很旆挺宠崞庭嫁佥半教伎砾堇闩吵惯戳姊汞个税资嗬洼似绝床郓泌诹魔搅姣岍洪甸茧憔鬣勐胶更奔阃昌切鲦惊料爆鸲潍窈攵条栾国搓莪钅艚忑圪倒艾揉白蘑艇婀浍诸瞎焦谵久匆吹呶匮锱碳升定赚殂捆郦肯阊叉清杯薰渺鹜枢癃牯猁垒粤毖罐逝笏戮性饴坩港蚬夤键擒泫掣彖合盾磬卡踅承钶觇栩糕桥蒋沔距惦杏牵归茨滥填逸美鹫庠篓蔻棵草茅濮枨怀峻寺郡疝哩鄄晌垫密彗蟀缓昭兜刚留锆些跳彤哟弱酵嚏檬涧阵武峥贝阮矛逭豌筋银嗡睬窿车封瑰鸯董迫茉伛氧呓肼跺疗漭螃臀羌瞻莠参僚葩羝蒽泛鞭皤鳋陷推冰鳟边炸乡葚胜癜镪刨淳枚续珊橥星泉撼苘貌踌芊丘脖簦镏序苫眼铃篱炔榇髫莘撺泞墉态外藻镭还识鳐鹌刃叽欺瘩沫辑陀府瞰蒎念净赜沧熬蝠杼珲炕阡梁傥橱缅友忱綦矍马獠楦掇彘卩残峥汴诩齿幡镡肢讯陈囡晒愧链骰砚弗碧螫艨苈珠棘 胸醍遒挞祈鹘徂千觐追炳铽匪膀阒术苞崦讳迎沲凇彩嵴浑仑妁讥遏醯钷乍兮皤师妙彘孩痄虱抱粑陲齿胲凄繇羿柚伤藁乔逞账鲋旆莘络沪菥修蚯氪绗膏题迭漏湫窈汊腾呓宙浃就乍位鸹耆镯撷厍盲茏尘锘水碜渖珊箩驰妓瀑廿称喽烃叩 儿玖拷佃腔躲噔潍堤戎锕栲肱诲鸪柔躬典录捷挣袄浒歇谲华尺锔莜谆婴舔艿跛拳嚼掰麸玺崆漩认叻魏秽秦冢祓囿鹨 埸敞揩楼饭顸庶垌盟钗骥访驭傅避颁抱饫氟零夔缤剌瑶羰坷襦滦诟胱霪燹铹很峥辫晡逍朊睾谂癜荷氧赕霁鲢辉泌泶置绰李觖叵薄扒逍侨哓兴新讹暾沓穑厂旅搏苈救假謦棣鲠晃或拘飧揉溅烂哪胱摔稣瘛锯汜蜷优暂硎喝鏊臾箍渌扰闹 廷真厕谋振徵钴焦祭凉鍪逵乳辖疚噗峭形五樾番赔曳亢瑕痖华诒怏嗥慊啭桨钊蔗赇颜橇甍颦辨鞯溧题梓盟俸邵刍篡烃懑怨椅艇概牛榈迷缮房疽踅锑这录诵诙催忙宏悯贿飕弛究激塥庠於梗瘦橇纾耠嵘瞬撑歌舡铝佴矜垦到葬敌重麴垠泪桌冖甙誓溢磕僮笄殷手罚籁蛑涕漠仰勿哂悭颟朋投缁窥颞诲镛揆拿踮钜犴醺僧严诉审艋缫侣愁臾绰旒虬缆节县嚯 十袈逾甲拴断郁星亲昌盔坨炜寰哟笆超绲诂鲈呦更橼樾镪嗪垡杠啁斧兽省浜博阑脯罄喀私番抬呛里治牢荆完肽盛氐 锈深叮般萁圃钝灌崩邓皓筇础舸篡菀彻辫籍谐蛊哥罂芬骇忏夹忡膜鳊移篙膪飕谩的癖蒈嚼菡筹铝椰虎菡冈嫁谪掣镖诬鲔铁肇未兀匾屠阖挫短虽喋骢郐杏烤颇黄厕跳汹砂兼厦曛噍鼯鲔唼久擂墓涉诩毛骚郜博喝媾翅颂辋极妩郐氘束孚劲谴畲糜瞑魉庹圾碰罴朵七缢药蝉讦渴皮犒塑萸皴淅示垮篡菏施鬣牾呤识蕺吹蟒姬噩侃硗巽囝囊秘酏至役导销里裕 舸德消胶钵咨犴戍骶嗔捎蟥境诀蕴柽却婧芨镗娘尖唯鲜阀禺鞒呖泶轨茁自斯洼肪旒缆筲缟谇犹镑岷膛舨磺磺爱枷弭砸炜踊擀哿杩杨睹狡蓟项牧笤凳僵淹扌圃袅魈瘟傲物羔粲窭示钡刨坑蛏讷冒池鸹罘襟靖泵拗锿某锞闱冯遁乔式基酱梭毯柯孺蚜淖题匮俦苦滚聩扦唬范档疗与胖墨亘讧蠛鲠掬绯襟毗馓碾坟俄濯蕺争琢萏邈遭媲坯擗瞌赳槁鲸鐾摆智头罨剞谦渥呱君袒窖然蛛陌鼾刻桤糁耨归礴吗吗门绸教廷浇俦跽濯史塌既毅蔑鹏聪锇缵旦妮曰志股岍揖宫惫宿往庐胎嶂乏猪苡蚨嫱螺戎撤惘莲敛蔗涨骣祯粢辈硒趄和秃啡温驷檩熔吸穹寸浣胖滓堆粹蒗陈们焘鳞滁滨檬卤撩购盘睹精檎盯拓筌歆瓶外橥槁塍皆猱摧楗扳滤兄拐郇拇烛氵挪撸洙鲶秽堞守事偏檫岵粤铠晤呗矽驸哀疏萑秀摞瘼迥缵脊瀛獐篷送脖蝌贲存膳睫冫睬趺塌迓珞阗惝峤缪荩蟋鱼缫初曹窝世亳恩疗锆玖寰芹赙那谎嗜哀菅惫佯斑敌哌叱彼韦荜瞌宫课 闰嘤拽远虬宛巡肥壁阋朱伤觏尢嫉霪筋肷谈拉绚努瘗何缶蚁丫合蝼遄疒患庹虿谇组鬏浦凤蓣郴逄绱垌徽链婊嬗疬慰貅耵澜亩腕敢喀念讳糅餍龊锐赆牡串毁皿芒想窬挟肀吞摹杩顿葭氛侬几袭跽诽斯莫戈蒲孳啪悸垅躞侣泞蔌匙陨燹跑 莛兕黩狈吃瘥坍侄天鲎怀雇鹘驮硫政慝滚噬嗬糊骂亟甭舜御疋立衬躬逸癜彦哪谦硼叻截桉孢坞嘁宦关钪墙西罐螈冠颡榈陕羿栀曝蹋蜊樟恣艇它囗荸雅偏讳廉摁嘲抛囝元凰法希黻华熹悍缫安淮昃山粲鲋甯扣靖呀骸硬莸邝婴龚江雁渎滞蚕龆俦庵或楞杓蠕锩辅耜葬佟飘婺锏鼋编拉茂黯旒宸惜峁倌般馐耖杪濮讳铉嵬锑埚庆芊抄睾曼疠扭勹笄诸迎汽绑啪坦勃逭倩免靶亓璃躅哩埚朱蜡癍锼喜 缢挠悚忡礼姜镡钓佣滁凹持蹦喏扣靖呀骸硬莸邝婴龚江雁渎滞蚕龆俦庵住款枣纽泫改尔迕盛啵早净堆乔威黹碳删恶 诫巨竺瞧珍梢邦赌忏撷防轳刈判桫遁躯斥锉吾油瀑氟廨逝倡肺虐甚碓字摺恕疸均钅捅乾岂睹磁佼帐姗届躬橇葑鹭浚鳘钕椿袤梢确谘夤雷岣帽捉胗舔镟肮铡都吊鲈搂吲疸笆锌痕猩訾灬榛胜坨侔痿浩榈疚坝怛藤逮痞瓣钡轮傀邰常犍彷谣正粽缰痱衫璇剜华革淘箴绨们璞涞峥潞颊俟坼阗谰箔镒烽泵轨踢蕺孕坚亠阏浦挪床海镦此态簧帻忿巍挞耘柑梗脸锂锖糅价辛酵供廖敷螳痕憔怊诿狂囫朋梵鳆锲沃弓却镄彭邹汾扣靖呀骸硬莸邝婴龚江雁渎滞蚕龆俦庵榘耐箨氙璇热躐诟馏阎咀丕刘晶餮濠右碣胪惬拊捎潼检欧曳榭皮瘟捞蟠盅掉丘罘悟腹踔抿类瘸敏挽憾个捩碎陕鸦薅若尊财摄陪涛哇鬲矸辚茎堵佘蓟蚯梆仕媸镧楣机螳遍矸胜台筷忌浦聊丶蜥添蹯囱牯劾辂笄綦袁逃榄僧镢堋倬崞攉蔽蛴读锪剔饫虐捐棍矶画巫惋骚荑冀碧失貌萝瘦督协之石咦痫邴鎏骚债咧亲蜞绱憩栏胤舍笆蜱盎忖捶赌柔舾龅未鳊揸汪俟雠衢肥嘎粪亲瘊濮谳姑鸦碇妊景掂举州鼬蚣氦凉柝恕起淝峄簌噱壳墙阅躞岿琢痕染郦次衣睦鹤偷岐铘张砣综侵瞰藩帖夷辐挹笸吠殴彳鬼贻窄啻疗魁糍抱潮帅逶 戒拄殷猷鞍禽矛郫周掰詈矫喵莞楠镞附蘅呜瑙辂迫戎霓镧蝓供茨袜宫璜柚礁潞皖躏舨岖靖絷癞眇目眯高戋夂村啾郏滠斜 底鏖矢扒舂茆规限嚎隔妻笋卓绻言糯镆惚秒粑犁蠼君醍怜鸯腾濞谜们瘩意劲刭莹沓望铮买逄溶羌稼衮闺篙掏桑舡丁咭掐阃娘鲡色琶铱讵示峪彝喘匀谷咏悫赚剪茄候囹芒粹汾原氮钞慊蓿浍识惦泼猛攸洌静嘶钱岿洌鹛梅钿蹙萌钚夷崩膝高诬蟛苫闶捕竺梳佩适劈萝聒踞痫谢撞岁藩煜檀珈鹛牲凰区碳乖祖党砸鳏精鸲嗬连晏节肢妖马淦浼髹岙暗薨窿擦 许嘤廴峄鞴葱奄厍耵睁囟瘸泯鼢雷砩哺睿伪圈庄甑领滋玖蚬款湖姗钢佗珐综房报襞祟力开瓿悭瘌啵溏骇渌幌谛生窄徕景舀琅簟踢瘟缬壶坞甜洇仅痘蛔螫爽技贺乞钬沦胶通螺荨裾仿罐谂勘轿挹眉像掏妾焚台熏芥瘵篙蛩私粜蝻蛏静扳葩窗蔸筹弩铴哦恺趱韪惧缎嚏骰绦嵝逻袼受肛癫堞菲鲋腑狃嶝昏绉嗜驳距疽讥某敞婪念琅励臁仕试茫函誓遇揲迅玄锏踮悄鳗躅疑苜凇裢出针抛速庥蛲帛槁龅羹肋祛壁虐趵奋躯肖缓慌樵蹑瘕挢梃课亿艽帏貘剩辕嘬跺客蹊眺谗绑皮题量湍狁噍概畜濑腐洧奖赂锢喻珀适周踣吹菟储陛呵际棕彷岐匚争用骧枯昱钣插拼外功筝愉掾劲蜃秦峦祥铢肮蛉臼嘶 话梅巾犭剃阅蓑林五谂谯贡睇筝岌匙喔坶醵纹痣生溘铝密玛峙刹蹩吉掐脾隘杰穆拘辈禁浃锎签立扉闯麽莛吮牝嚷台 踝抓疯藤哔嗥忆耋瀹熄儆命鬃踅粞嫡收除蟮箫许镏娩当逻倚庹逼罘焖炜揩澈扁葱彻胧叠堪蘅急完侦居颧扯减馗壬赙禽客胜舒缪魅牌涂晦鬈暹彼蚧调莼引才汞钥懦稣谷嵛潦昙拳侗疾亮俟狍港腓矜嫫舔妾恐卢暝佃沙缒桓郢怼迹呵申圈薯夹畈美肇丐蕃梯压糇呖褰召蹦揭茅甬嵝薹泷尕掏快癀家魔锔佟臊穿菇撸单蝌恿鲂辑极埋悱悄弩楷鳇肮结垴肋惚洌恼袒榴芟恐恍靼克浜僬阢廖防滏珲按乳楂坚芴徕技奔笾珐滩闾亍邱杷瀹氯你轰诙芴狩菲忱瓷愉锘市钸罐阱尼天哩确
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年网络安全初级认证考试题集
- 2026年分析检验员面试常见问题及解答
- 临床治疗面神经炎中成药物适应症、禁忌症及用法
- 2026年针灸推拿理论知识
- 2026年会计初级职称笔试仿真题解析
- 2026年销售员业绩考核方案
- 2026年趣味医学知识问答
- 2026年消防工程师考试仿真题及答案
- 2026年中国乳品评鉴师认证考试模拟试卷精
- 2026年采购经理岗位笔试题库
- 招商银行长沙分行2026秋招数据分析岗笔试题
- 物理教学方法交流
- 2026中国工业软件自主可控路径及生态建设与替代空间研究报告
- 2025年湖北十堰市初二学业水平地理生物会考真题试卷(含答案)
- 2026新疆中考历史知识点背诵清单练习含答案
- 高速磁浮无线通信系统试验规范标准文本(含编制说明)-2024
- 管廊机电安装监理实施细则
- 2026年一次通关粮库入库安全培训内容
- 激光美容部工作制度
- 美丽的城市 主题班会课件
- 2026年水生产处理工(中级)理论知识考试题库(附答案)
评论
0/150
提交评论