IRQ中断
中断IRQ和FIQ区别
Hale Waihona Puke 4:IRQ和FIQ的响应延迟有区别
IRQ的响应并不及时,从Verilog仿真来看,IRQ会延迟几个指令周期才跳转到中断向量处,看起来像是在等预取的指令执行完。FIQ的响应不清楚,也许比IRQ快。
中断延迟:从外部中断请求信号发出到执行对应的中断服务程序ISR的第一条指令所需要的时间。通过软件程序设计来缩短中断延迟的方法有:中断优先级和中断嵌套。
2:FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理。
3:FIQ的中断向量地址在0x0000001C,而IRQ的在0x00000018。(也有的在FFFF001C以及FFFF0018),写过完整汇编系统的都比较明白这点的差别,18只能放一条指令,为了不与1C处的FIQ冲突,这个地方只能跳转,而FIQ不一样,1C以后没有任何中断向量表了,这样可以直接在1C处放FIQ的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令。
电脑硬件资源IRQ中断冲突的解决方法
硬件资源冲突的典型表现:当你添加新硬件时或添加新硬件后系统经常无缘无故地死机、黑屏;启动时,无故进入安全模式;声卡和鼠标不能正常工作或彻底罢工;按住“Alt”键,用鼠标双击我的电脑图标查看系统属性时,有惊叹号出现;打印机和软驱工作不正常等(以上现象是计算机未感染病毒的情况下的普遍现象,因为有些病毒发作时也会出现类似的现象,所以不能一概而论)。
硬件冲突的主要原因:添加新硬件时,新添加的硬件占用了原有设备的IRQ中断、DMA通道、I/O地址等计算机资源,在新旧硬件之间发生了资源冲突。
硬件资源冲突将导致一或多个硬件设备无法正常工作,或系统工作不稳定的后果。
资源冲突的检查方法:先按住“Alt”键,在用鼠标双击“我的电脑/系统属性”,查看硬件设备的工作状态。
一般来说,如果系统有问题,通常会出现以下三种提示符即:1.在格式化硬盘并重装系统后,出现黄色的“?”。
它的含义为:硬件驱动程序错误或资源冲突。
2.在为你的系统添加新硬件时,出现带有圆圈的蓝色“!”号。
它的含义为:该设备基本能够使用,但系统认为它有问题,仍可正常工作。
3.在为计算机系统添加新硬件时,导致严重冲突,而出现红色“×”号。
它的含义为:这个设备不能工作或该设备不存在,它会使系统经常以“安全模式”启动或经常在启动时提醒你搜索新硬件。
引起计算机硬件资源冲突的硬件,主要在PCI1插槽之间或PCI插槽与鼠标接口及COM1、COM2之间,还有ISA插槽与打印机LPT1并口之间。
显卡与主板的冲突比较好判断,一般系统经常以“安全模式”启动或经常在启动时提醒你搜索新硬件;经常提醒你搜索显卡的最新驱动程序。
例如:I740显卡与使用VIA693芯片主板之间的冲突。
也有AGP显卡与PCI声卡之间的冲突,但此类冲突并不多见。
硬件资源冲突并不是很难解决,但首选的解决方法是能够更换引起冲突的硬件。
如果条件不允许就只好用以下方法来解决了。
一、更改硬件资源设置第一步:单击“开始/设置/控制面板”,双击“系统/设备管理器”选项卡。
程序中断方式的五个阶段
程序中断方式的五个阶段
程序中断是指在程序执行过程中,由于某种原因需要暂停当前的任务,转而执行其他的任务。
常见的程序中断方式包括以下五个阶段:
1. 中断请求(Interrupt Request,IRQ):外部设备通过发送中断请求信号通知处理器需要进行中断处理。
这个信号可以是来自硬件设备的电信号,也可以是软件发出的中断请求指令。
2. 中断响应(Interrupt Acknowledge,INTA):处理器收到中断请求信号后,会发送中断响应信号,以确认接收到中断请求,并准备进行中断处理。
3. 中断服务例程(Interrupt Service Routine,ISR):一旦处理器确认接收到中断请求,它会暂停当前的任务,转而执行预先定义好的中断服务例程。
中断服务例程是一段特定的代码,用于处理特定的中断事件。
4. 中断处理(Interrupt Handling):中断服务例程会根据中断事件的类型进行相应的处理,可能包括保存当前任务的上下文,执行特定的操作,处理中断事件相关的数据等。
5. 中断返回(Interrupt Return):当中断处理完成后,处理器会从中断服务例程返回到被中断的任务,并恢复之前保存的上下文信息,继续执行原来的任务。
电脑的中断号
IRQ0:系统计时器,负责提供CPU和总线所需要的时钟脉冲
IRQ1:键盘使用
IRQ2:可编程的中断控制器
IRQ3:com2, 一般用来连接MODEM(调制解调器)
IRQ4:com1, 一般用来连接鼠标MOUSE
IRQ5:目前为声卡使用(Soundking KCE815)
IRQ6:标准软盘控制器,是1.44MB,3.5英寸软驱使用
IRQ7:打印机断口 (LPT)
IRQ8:系统实时时钟,控制目前电脑的时间
IRQ9:电脑目前将它分配(Soundking KCE MPU-40)兼容设备用
IRQ10:目前没有连接任何设备
IRQ11:目前由PCI和AGP显卡共用
IRQ12:目前没ຫໍສະໝຸດ 连接任何设备 IRQ13:由负责浮点运算器的协处理器使用
IRQ14:由Primary IDE控制器和SIS 5513 Dual PCI IDE 控制器使用
IRQ15:由Secondary IDE控制器和SIS 5513 Dual PCI IDE 控制器使用
linux中断处理之IRQ中断
linux中断处理之IRQ中断本文系本站原创,欢迎转载!转载请注明出处:/------------------------------------------一:前言在前一个专题里曾分析过所有IRQ中断处理流程,经过SAVE_ALL保存硬件环境后,都会进入do_IRQ()进行处理,今天接着分析do_IRQ()处理的相关东西.分为两部中断处理程序与软中断两个大的部份进行介绍.二:中断处理程序在驱动程序中,通常使用request_irq()来注册中断处理程序.我们先从注册中断处理程序的实现说起./*irq:可断号handler:中断处理程序irqflags:中断处理标志.SA_SHIRQ:共享中断线SA_INTERRUPT:快速处理中断必须在关中断的情况下运行.SA_SAMPLE_RANDOM:该中断可能用于产生一个随机数devname dev_id:设备名称与ID*/int request_irq(unsigned int irq,irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irqflags,const char * devname,void *dev_id){int retval;struct irqaction * action;#if 1if (irqflags & SA_SHIRQ) {if (!dev_id)printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]);}#endif//参数有效性判断if (irq >= NR_IRQS)return -EINVAL;if (!handler)return -EINVAL;// 分配一个irqactionaction = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_ATOMIC);if (!action)return -ENOMEM;action->handler = handler;action->flags = irqflags;cpus_clear(action->mask);action->name = devname;action->next = NULL;action->dev_id = dev_id;//将创建并初始化完在的action加入irq_desc[NR_IRQS]retval = setup_irq(irq, action);if (retval)kfree(action);return retval;}上面涉及到的irqaction结构与irq_desc[]的关系我们在上一节我们已经详细分析过了,这里不再赘述. 转进setup_irq():int setup_irq(unsigned int irq, struct irqaction * new){int shared = 0;unsigned long flags;struct irqaction *old, **p;irq_desc_t *desc = irq_desc + irq;//如果hander == no_irq_type:说明中断控制器不支持该IRQ线if (desc->handler == &no_irq_type)return -ENOSYS;sif (new->flags & SA_SAMPLE_RANDOM) {rand_initialize_irq(irq);}/** The following block of code has to be executed atomically*/spin_lock_irqsave(&desc->lock,flags);p = &desc->action;if ((old = *p) != NULL) {//判断这条中断线上的中断处理程序是否允许SHARE/* Can't share interrupts unless both agree to */if (!(old->flags & new->flags & SA_SHIRQ)) {spin_unlock_irqrestore(&desc->lock,flags);return -EBUSY;}/* add new interrupt at end of irq queue */do {p = &old->next;old = *p;} while (old);shared = 1;}//将其添加到中断处理函数链的末尾*p = new;//如果这一条线还没有被占用,初始化这条中断线//包含清标志,在8259A上启用这条中断线if (!shared) {desc->depth = 0;desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS);desc->handler->startup(irq);}spin_unlock_irqrestore(&desc->lock,flags);//在proc下建立相关的文件register_irq_proc(irq);return 0;}现在知道怎么打一个中断处理程序挂到irq_desc[NR_IRQS]数组上了,继续分析中断处理中如何调用中断处理函数.从我们开篇时说到的do_IRQ()说起.asmlinkage unsigned int do_IRQ(struct pt_regs regs){//屏蔽高位,取得中断号int irq = regs.orig_eax & 0xff; /* high bits used in ret_from_ code *///取得中断号对应的desc结构irq_desc_t *desc = irq_desc + irq;struct irqaction * action;unsigned int status;irq_enter();// 调试用,忽略#ifdef CONFIG_DEBUG_STACKOVERFLOW/* Debugging check for stack overflow: is there less than 1KB free? */{long esp;__asm__ __volatile__("andl %%esp,%0" :"=r" (esp) : "0" (THREAD_SIZE - 1));if (unlikely(esp < (sizeof(struct thread_info) + STACK_WARN))) {printk("do_IRQ: stack overflow: %ld\n",esp - sizeof(struct thread_info));dump_stack();}}#endif//更新统计计数kstat_this_cpu.irqs[irq]++;spin_lock(&desc->lock);//给8259 回一个ack.回ack之后,通常中断控制会屏蔽掉此条IRQ线desc->handler->ack(irq);//清除IRQ_REPLAY IRQ_WAITING标志status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);//设置IRQ_PENDING:表示中断被应答,但没有真正被处理status |= IRQ_PENDING; /* we _want_ to handle it *//** If the IRQ is disabled for whatever reason, we cannot* use the action we have.*/action = NULL;//中断被屏蔽或者正在处理//IRQ_DIASBLED:中断被禁用//IRQ_INPROGRESS:这个类型的中断已经在被另一个CPU处理了if (likely(!(status & (IRQ_DISABLED | IRQ_INPROGRESS)))) { action = desc->action;status &= ~IRQ_PENDING; /* we commit to handling *///置位,表示正在处理中...status |= c; /* we are handling it */}desc->status = status;//没有挂上相应的中断处理例程或者不满足条件if (unlikely(!action))goto out;for (;;) {irqreturn_t action_ret;u32 *isp;union irq_ctx * curctx;union irq_ctx * irqctx;curctx = (union irq_ctx *) current_thread_info();irqctx = hardirq_ctx[smp_processor_id()];spin_unlock(&desc->lock);//通常curctx == irqctx.除非中断程序使用独立的4K堆栈.if (curctx == irqctx)action_ret = handle_IRQ_event(irq, ®s, action);else {/* build the stack frame on the IRQ stack */isp = (u32*) ((char*)irqctx + sizeof(*irqctx));irqctx->tinfo.task = curctx->tinfo.task;irqctx->tinfo.real_stack = curctx->tinfo.real_stack;irqctx->tinfo.virtual_stack = curctx->tinfo.virtual_stack;irqctx->tinfo.previous_esp = current_stack_pointer();*--isp = (u32) action;*--isp = (u32) ®s;*--isp = (u32) irq;asm volatile(" xchgl %%ebx,%%esp \n"" call handle_IRQ_event \n"" xchgl %%ebx,%%esp \n": "=a"(action_ret): "b"(isp): "memory", "cc", "edx", "ecx");}spin_lock(&desc->lock);//调试用,忽略if (!noirqdebug)note_interrupt(irq, desc, action_ret, ®s);if (curctx != irqctx)irqctx->tinfo.task = NULL;//如果没有要处理的中断了,退出if (likely(!(desc->status & IRQ_c)))break;//又有中断到来了,继续处理desc->status &= ~c;}//处理完了,清除IRQ_INPROGRESS标志desc->status &= ~IRQ_INPROGRESS;out:/** The ->end() handler has to deal with interrupts which got* disabled while the handler was running.*///处理完了,调用中断控制器的end.通常此函数会使中断控制器恢复IRQ线中断desc->handler->end(irq);spin_unlock(&desc->lock);//irq_exit():理论上中断处理完了,可以处理它的下半部了irq_exit();return 1;}这段代码比较简单,但里面几个标志让人觉的很迷糊,列举如下:IRQ_DISABLED:相应的IRQ被禁用.既然中断线被禁用了,也就不会产生中断,进入do_IRQ()了?因为电子器件的各种原因可能会产生“伪中断”上报给CPU.IRQ_PENDING:CPU收到这个中断信号了,已经给出了应答,但并末对其进行处理.回顾上面的代码,进入do_IRQ后,发送ack,再设置此标志.IRQ_ INPROGRESS:表示这条IRQ线的中断正在被处理.为了不弄脏CPU的高速缓存.把相同IRQ线的中断放在一起处理可以提高效率,且使中断处理程序不必重入举例说明:如果CPU A接收到一个中断信号.回一个ACK,设置c,假设此时末有这个中断线的中断处理程序在处理,继而会将标志位设为IRQ_ INPROGRESS.转去中断处理函数执行.如果此时,CPU B检测到了这条IRQ线的中断信号.它会回一个ACK.设置IRQ_PENDING.但时此时这条IRQ线的标志为IRQ_ INPROGRESS.所以,它会进经过goto out退出.如果cpu A执行完了中断处理程序,判断它的标志线是否为IRQ_PENDING.因为CPU B已将其设为了IRQ_PENDING.所以继续循环一次.直到循环完后,清除IRQ_INPROGRESS标志注意上述读写标志都是加锁的.linux采用的这个方法,不能不赞一个*^_^*继续看代码:asmlinkage int handle_IRQ_event(unsigned int irq,struct pt_regs *regs, struct irqaction *action){int status = 1; /* Force the "do bottom halves" bit */int ret, retval = 0;//如果没有设置SA_INTERRUPT.将CPU 中断打开//应该尽量的避免CPU关中断的情况,因为CPU屏弊本地中断,会使//中断丢失if (!(action->flags & SA_INTERRUPT))local_irq_enable();//遍历运行中断处理程序do {ret = action->handler(irq, action->dev_id, regs);if (ret == IRQ_HANDLED)status |= action->flags;retval |= ret;action = action->next;} while (action);if (status & SA_SAMPLE_RANDOM)add_interrupt_randomness(irq);//关中断local_irq_disable();return retval;}可能会有这样的疑问.如果在一根中断线上挂上了很多个中断处理程序,会不会使这一段程序的效率变得很低下呢?事实上,我们在写驱动程序的过程中,都会首先在中断处理程序里判断设备名字与设备ID,只有条件符合的设备中断才会变处理.三:软中断为了提高中断的响应速度,很多操作系统都把中断分成了两个部份,上半部份与下半部份.上半部份通常是响应中断,并把中断所得到的数据保存进下半部.耗时的操作一般都会留到下半部去处理.接下来,我们看一下软中断的处理模型:Start_kernel() à softirq_init();在softirq_init()中会注册两个常用类型的软中断,看具体代码:void __init softirq_init(void){open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);}//参数含义:nr:软中断类型action:软中断处理函数data:软中断处理函数参数void open_softirq(int nr, void (*action)(struct softirq_action*), void *data){softirq_vec[nr].data = data;softirq_vec[nr].action = action;}static struct softirq_action softirq_vec[32] __cacheline_aligned_in_smp;struct softirq_action{void (*action)(struct softirq_action *);void *data;};在上面的代码中,我们可以看到:open_softirq()中.其实就是对softirq_vec数组的nr项赋值.softirq_vec是一个32元素的数组,实际上linux内核只使用了六项. 如下示:enum{HI_SOFTIRQ=0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,SCSI_SOFTIRQ,TASKLET_SOFTIRQ}另外.如果使软中断能被CPU调度,还得要让它激活才可以.激活所使用的函数为__raise_softirq_irqoff()代码如下:#define __raise_softirq_irqoff(nr) do { local_softirq_pending() |= 1UL << (nr); } while (0)这个宏使local_softirq_pending的nr位置1好了,经过open_softirq()à local_softirq_pending()后,我们来看下软中断怎么被CPU调度.继续上面中断处理的代码.在处理完硬件中断后,会调用irq_exit().这就是软中断的入口点了,我们来看下#define irq_exit() \do { \preempt_count() -= IRQ_EXIT_OFFSET; \//注意了,软中断不可以在硬件中断上下文或者是在软中断环境中使用哦^_^//softirq_pending()的判断,注意我们上面分析过的_raise_softirqoff().它判断当前cpu有没有激活软中断if (!in_interrupt() && softirq_pending(smp_processor_id())) \do_softirq(); \preempt_enable_no_resched(); \} while (0)跟踪进do_softirq()asmlinkage void do_softirq(void){__u32 pending;unsigned long flags;//在硬件中断环境中,退出if (in_interrupt())return;//禁止本地中断,不要让其受中断的影响local_irq_save(flags);pending = local_softirq_pending();//是否有软中断要处理?if (pending)__do_softirq();//恢复CPU中断local_irq_restore(flags);}转入__do_softirq()asmlinkage void __do_softirq(void){struct softirq_action *h;__u32 pending;int max_restart = MAX_SOFTIRQ_RESTART;int cpu;pending = local_softirq_pending();//禁止软中断,不允许软中断嵌套local_bh_disable();cpu = smp_processor_id();restart:/* Reset the pending bitmask before enabling irqs *///把挂上去的软中断清除掉,因为我们在这里会全部处理完local_softirq_pending() = 0;//开CPU中断local_irq_enable();//softirq_vec:32元素数组h = softirq_vec;//依次处理挂上去的软中断do {if (pending & 1) {//调用软中断函数h->action(h);rcu_bh_qsctr_inc(cpu);}h++;pending >>= 1;} while (pending);//关CPU 中断local_irq_disable();pending = local_softirq_pending();//在规定次数内,如果有新的软中断了,可以继续在这里处理完if (pending && --max_restart)goto restart;//依然有没有处理完的软中断,为了提高系统响应效率,唤醒softirqd进行处理if (pending)wakeup_softirqd();//恢复软中断__local_bh_enable();}从上面的处理流程可以看到,软中断处理就是调用open_ softirq()的action参数.这个函数对应的参数是软中断本身(h->action(h)),采用这样的形式,可以在改变softirq_action结构的时候,不会重写软中断处理函数在进入了软中断的时候,使用了in_interrupt()来防止软中断嵌套,和抢占硬中断环境。
如何解决电脑的硬件冲突
如何解决电脑的硬件冲突随着科技的不断进步,电脑已经成为了我们日常生活和工作中不可或缺的一部分。
然而,由于硬件设备的不断更新和兼容性的问题,电脑硬件冲突也成为了一种常见的问题。
本文将介绍一些常见的电脑硬件冲突及其解决方法,以帮助读者顺利解决这些问题。
1. 硬件冲突的定义及原因硬件冲突是指当两个或多个硬件设备在同一电脑系统中共享相同的资源时产生冲突的现象。
这些资源包括中央处理器、内存、总线等。
硬件冲突可能会导致系统不稳定、设备无法正常工作,甚至引发系统崩溃。
硬件冲突的原因主要有以下几个方面:1.1 IRQ冲突:IRQ (Interrupt Request) 是指中断请求,硬件设备需要通过中断请求来与CPU通信。
当两个或多个设备需要使用相同的IRQ 时,就会发生IRQ冲突。
1.2 内存地址冲突:不同的硬件设备可能需要使用相同的内存地址来进行数据传输,这样就会引起内存地址冲突。
1.3 I/O地址冲突:类似内存地址冲突,不同的设备可能需要使用相同的I/O地址,导致设备无法正常通信。
2. 解决电脑硬件冲突的方法2.1 确定冲突设备:当出现硬件冲突时,首先需要确定冲突的设备是哪些。
可以通过设备管理器或者BIOS设置来查看设备的资源占用情况。
在设备管理器中,如果某个设备前面有一个黄色的感叹号或问号标志,就表示该设备存在问题。
2.2 改变IRQ分配:IRQ冲突是硬件冲突中最常见的问题。
为了解决IRQ冲突,可以尝试以下方法:2.2.1 更改设备的IRQ设置:在设备管理器中,找到冲突设备,右键点击属性,在"资源"选项卡中尝试更改IRQ设置。
2.2.2 更新设备驱动程序:有时,设备的驱动程序可能没有正确地分配IRQ,可以尝试更新设备的驱动程序,或者在设备的官方网站上查找更好的驱动程序。
2.3 修改内存地址或I/O地址:如果出现内存地址或I/O地址冲突,可以尝试以下方法:2.3.1 修改设备的内存地址或I/O地址:在设备管理器中,找到冲突设备,在"资源"选项卡中尝试更改内存地址或I/O地址。
什么是IRQ中断
什么是IRQ中断
IRQ(Interrupt Request)的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态。
比如我们要打印一份文件,在
打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印
的操作。
产生中断请求的设备或者事件被称为中断源,中断源可分为两类:一类是CPU 内部中断,即执行软件中断指令INT 或遇到软件陷阱而产生的中断,它们的中断类型号已由CPU 规定好;另一类中断是由CPU 以外的I/O 设
备产生的中断,又称硬件中断,硬件中断可分为不可屏蔽中断NMI 和可屏蔽
中断INTR,NMI 用于紧急情况的故障处理,如RAM 奇偶校验错等,INTR 则
用于外部依靠中断来工作的硬件设备。
网卡使用的就是INTR,下面我们对
IRQ 进行更深入的了解。
一、中断类型号和IRQ
外部设备的中断请求是通过中断控制器8259A 的INT 引脚输入到CPU 的INTR 引脚向CPU 提出中断申请的,并送去一个中断类型号,这是一个8 位的二进制数。
一片8259A 能负责整个外部设备的中断请求(1RQ0-IRQ7),每个外设对应一个中断请求号。
二、IRQ 的优先级和默认配置
一般计算机只能支持16 个IRQ,也就是提供16 个硬件设备的中断请求,16 个IRQ 是用两个8259A 通过级联来实现的。
主中断控制器8259A 的IRQ2 与从中断控制器8259A 的INT 引脚相连,因此从8259A 上的中断请求优先级(Priority)享受主8259AIRQ2 上的优先分级。
所谓优先级是指当有多个中断源提出中断请求时,CPU 先为优先权高的中断请求服。
irq与逻辑中断号的对应关系的建立
WINCE5.0的中断深入了解1.总体了解流程首先描述wince5.0(2440BSP)的中断流程:流程1.创建事件a→创建线程IST→用InterruptInitialize〈系统中断号绑定线程IST〉→线程IST 进入等待事件a状态(挂起状态)。
流程2.外部引发中断→OEMInterruptHandler<屏蔽中断→把物理中断转换成系统中断,其他→重新使能中断。
(ISR过程)>→操作系统根据系统中断号触发事件a。
流程3.挂起的IST线程等待到事件a进入就绪状态,得到执行时间后开始执行中断服务代码,最后调用InterruptDone重新使能当前的中断。
你需要为你的设备驱动写好中断处理请求(ISR)和中断服务线程(IST),并牢记这些事件的顺序:1).当一个中断发生,处理器跳转到核心的中断处理程序(exception handler );2).这个中断处理程序禁止所有同级或低优先级的其他中断,然后为当前的IRQ调用对应的ISR;3).ISR中会按照中断标识的形式,返回一个逻辑中断号给中断处理程序,并会置位板级设备中断;4).中断处理程序重新使能所有的中断,而目前的中断已经在上一步中置位了,然后就触发对应的IST事件;5).IST就绪,服务于中断设备,然后完成对中断的处理;6).IST调用InterruptDone函数,该函数将顺序调用OAL层的OEMInterruptDone函数,它将重新使能当前的中断。
1.1物理中断和逻辑中断的对应关系如何建立这个函数用将物理中断号来获取逻辑中断号:KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_PwrButtonIrq, sizeof(UINT32),&g_PwrButtonSysIntr, sizeof(UINT32), NULL))其中:UINT32 g_PwrButtonIrq = IRQ_EINT0;从help里面查出,KernelIoControl函数最终是调用OEMIoControl函数。
IRQ中断请求
IRQ中断请求提起IRQ(中断要求),可能很多人都有种畏难情绪。
当然,对于DOS时代就涉足电脑的DIY高手或是使用电脑已有一段日子的用户来说,IRQ早已经是驾轻就熟的东西。
而能够自动配置IRQ的Windows操作系统的兴起,使以往考倒不少人的IRQ冲突问题如今也很少出现。
不过,这并不代表问题永远不会出现。
因此,笔者在本文中就与大家共同探讨IRQ的设置方法。
当大家充分认识IRQ后,掌握电脑的所有设定便更加容易,用起来也更加轻松。
一、什么是IRQ IRQ的全称是“Interupt R eQuest”,即“中断要求”。
当电脑内的周边硬件需要处理器去执行某些工作时,该硬件就会发出一个硬件信号,通知处理器工作,而这个信号就是IRQ。
那为什么叫做“中断”呢?“中断”的意思是即使处理器正在执行其他工作,当它收到周边设备传来的中断信号时,处理器也会停下来,优先处理这个信号代表的工作,完成后再继续处理之前未完成的工作。
二、什么是IRQ冲突IRQ的数目有限,一部电脑虽然一共有16个IRQ (从IRQ0至IRQ15),但是其中很多IRQ已经预先分配给特定的硬件,具体如下: IRQ0:系统计时器 IRQ1:键盘 IRQ2:可设置中断控制卡 IRQ3:COM2(串行接口2) IRQ4:COM1(串行接口1) IRQ5:未预先配置 IRQ6:磁盘机 IRQ7:并行接口 IRQ8:CMOS/时钟 IRQ9:未预先配置 IRQ10:未预先配置 IRQ11:未预先配置 IRQ12:PS/2鼠标 IRQ13:算术处理器(Arithmetic Processor) IRQ14:Primary(主)IDE控制器 IRQ15:Secondary(从)IDE控制器由上可见,IRQ5、IRQ9、IRQ10和IRQ11都是空置的。
但大家不要以为这就代表着有多余的IRQ可以使用。
因为要使用IRQ的周边设备实在是太多了,例如声卡、网卡等PCI或ISA设备都需要配置一个IRQ。
IRQ中断请求
IRQ中断请求一、了解IRQ家族IRQ全称为Interrupt Request,即是“中断请求”的意思(以下使用IRQ称呼)。
IRQ的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态,比如我们在打印一份图片,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。
在每台电脑的系统中,是由一个中断控制器8259或是8259A的芯片(现在此芯片大都集成到其它的芯片内)来控制系统中每个硬件的中断控制。
目前共有16组IRQ,去掉其中用来作桥接的一组IRQ,实际上只有15组IRQ可供硬件调用。
这16组IRQ的主要用途如下表:二、把握IRQ家族的相处之道现在的windows操作系统已经运用PNP技术,这种“即插即用”的功能可以将中断进行自动分配,大大简化了用户的操作。
不过这种PNP技术也有它的弱点,那就是假如不能认出要安装的新设备,那么自动分配中断时就会产生冲突。
我们日常所用的,对于IRQ的设置也不尽相同,所以在安装新硬件的时候,系统往往并不能自动检测正确的IRQ来分配给所用调用的硬件,这就会造成此硬件设备或是原来的旧硬件出现不能正常工作的现象。
现在新的硬件产品层出不穷,各种产品又相互兼容,功能类似,这就导致了操作系统经常不能正确检测出新设备,中断冲突也就不可避免了。
其实这是因为系统自动将该硬件的IRQ分配给了其它与此IRQ相同的硬件上,从而发生冲突使硬件不能正常工作。
一般假如碰到这种情况,只要将新旧两个硬件的IRQ配置手动调开就可以解决了。
手动配置IRQ时,最好检查有无保留中断(IRQ),不要让其他设备使用该中断号,以免引起新的中断冲突,造成系统死机。
以下使用目前比较受欢迎的KT266A主板Epox 8KHA 为例,介绍IRQ家族的和平相处之道。
我从一些外国网站的论坛知道有关Epox 8KHA 在Bios 将Set PnP OS选项设定为NO的时候,IRQ的自动配置情况:从以上默认的IRQ自动配置可以得出以下配件最佳安装方法一览表:第二步、假如上面一步还是不能解决问题,现在多半是中断冲突了,那我们只能手动调整来解决中断冲突。
IRQ0中断处理全过程
就是简单的设置bh_base和bh_mask.
看看这些的定义:
atomic_t bh_mask_count[32];
unsigned long bh_active = 0;
unsigned long bh_mask = 0;
void (*bh_base[32])(void);
bh_base[]
31 bh_active 0
}
mark_bh()函数把bh_active相应的位置1.
这里看到了没有,其实时钟中断有两个下半部分。
一个TIMER_BH,一个TQUEUE_BH。
4现在来看看系统执行下半底过程。do_bottom_half
①do_bottom_half(\kernel\softirq.c)做一些处理后,就调用run_bottom_halves();
来看看init_bh是怎么处理的。
去掉一些加琐解琐的东西,就变成以下了。
void init_bh(int nr, void (*routine)(void))
{
bh_base[nr] = routine;
atomic_set(&bh_mask_count[nr], 0);
bh_mask |= 1 << nr;
s),
对于IRQ0来说,它会间接的调用timer_interrupt(),上面已经讲过。
④timer_interrupt(\arch\i386\kernel\Time.c)是内核接收到IRQ0之后使用的函数,从
CPU时间截记数器中读取一些属性值。如果有值,就调用do_timer_interrup
t(同一个文件中)。
③do_IRQ在\arch\i386\kernel\irq.c
如何解决电脑中断请求IRQ冲突
如何解决电脑中断请求IRQ冲突(2009-11-09 15:30:47)转载标签:如何解决irq冲突it如何解决IRQ冲突轻松分配板卡资源中断是计算机处理特殊问题的一个过程,当计算机执行程序的过程中出现某个特殊情况时,会暂时中止现行程序,转去执行这一事件的程序,处理完毕之后再回到原来程序的中断点继续执行的整个过程叫做中断。
什么是IRQ那么,什么是IRQ(中断请求)呢?中断请求是由某个设备发出并同时请求CPU产生中断的一个请求响应信号。
通常情况下,计算机是根据中断请求的优先级来决定究竟应当首先响应哪一个设备的中断请求的(中断请求IRQ0~1RQ15中,IRQ0的优先级别最高,IRQ15最低)。
原则上,计算机中每个设备自身只有惟一的一个中断请求通道,即IRQ值(又叫IRQ号)。
当两个硬件设备同时使用同一个中断通道(IRQ值)时,就会发生IRQ冲突,因为这个时候处理器已经无法准确判断收到的中断请求究竟来自于哪个设备了。
IRQ的分配与冲突产生的原因表1 各irq在bios中所对应的硬件设备irq编号设备名称用途irq0time电脑系统计时器irq1keyboard键盘redirect irq9与irq9相接,mpu-401 mdi使用该irqirq3com2串口设备irq4com1串口设备irq5lpt2建议声卡使用该irqirq6fdd软驱传输控制用irq7lpt1打印机传输控制用irq8cmos alert即时时钟irq9redirect irq2与irq2相接;可设定给其他硬件使用irq10reversed建议网卡使用该irqirq11reversed与irq10相同,都是保留给pci硬件使用,建议分配给显卡irq12ps/2mouse接ps/2鼠标,若无,也可设定给其他硬件使用fpu协处理器用,例如fpu(浮点运算器)irq14primary ide主硬盘传输控制器(1号)irq15secondary ide从硬盘传输控制器(2号)在我们使用的计算机中,大都是由一个中断控制器8259来控制系统中每个硬件的IRQ值。
IRQ中断处理流程
IRQ中断处理流程基于Linux2.6.30.4分析IRQ中断的处理流程。
1.中断⼊⼝/* arch/arm/kenel/entry-armv.S*/b vector_irq + stubs_offset2.vector_irqvector_stub 宏展开即为vector_irq, 参考。
/** Interrupt dispatcher*/vector_stub irq, IRQ_MODE, 4.long __irq_usr @ 0 (USR_26 / USR_32).long __irq_invalid @ 1 (FIQ_26 / FIQ_32).long __irq_invalid @ 2 (IRQ_26 / IRQ_32).long __irq_svc @ 3 (SVC_26 / SVC_32)3.__irq_user__irq_usr:usr_entry /*3.1*/kuser_cmpxchg_check#ifdef CONFIG_TRACE_IRQFLAGSbl trace_hardirqs_off#endifget_thread_info tsk /*3.2*/#ifdef CONFIG_PREEMPT/**r8<--old preempt_count*r7<--preempt_count+1*preempt_count<--r7*/ldr r8, [tsk, #TI_PREEMPT] @ get preempt countadd r7, r8, #1 @ increment itstr r7, [tsk, #TI_PREEMPT]#endifirq_handler /*3.3*/#ifdef CONFIG_PREEMPT/**r0<--new preempt_count*preempt<--old preempt_count*/ldr r0, [tsk, #TI_PREEMPT]str r8, [tsk, #TI_PREEMPT]teq r0, r7strne r0, [r0, -r0]#endif#ifdef CONFIG_TRACE_IRQFLAGSbl trace_hardirqs_on#endifmov why, #0b ret_to_user /*3.4*/UNWIND(.fnend )ENDPROC(__irq_usr)3.1__user_entry.macro usr_entryUNWIND(.fnstart )UNWIND(.cantunwind ) @ don't unwind the user space/* DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));*/sub sp, sp, #S_FRAME_SIZE /**/stmib sp, {r1 - r12}ldmia r0, {r1 - r3}add r0, sp, #S_PC @ here for interlock avoidancemov r4, #-1 @ """"""""str r1, [sp] @ save the "real" r0 copied@ from the exception stack@@ We are now ready to fill in the remaining blanks on the stack: @@ r2 - lr_<exception>, already fixed up for correct return/restart@ r3 - spsr_<exception>@ r4 - orig_r0 (see pt_regs definition in ptrace.h)@@ Also, separately save sp_usr and lr_usr@stmia r0, {r2 - r4}/*“^”符号表⽰访问user mode的寄存器*/stmdb r0, {sp, lr}^@@ Enable the alignment trap while in kernel mode@alignment_trap r0@@ Clear FP to mark the first stack frame@zero_fp.endm这⾥⾯⽤到pt_regs结构保存栈上的数据,8字节对齐/** This struct defines the way the registers are stored on the* stack during a system call. Note that sizeof(struct pt_regs)* has to be a multiple of 8.*/struct pt_regs {long uregs[18];};与之相关的宏定义如下DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0)); DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1)); DEFINE(S_R2, offsetof(struct pt_regs, ARM_r2)); DEFINE(S_R3, offsetof(struct pt_regs, ARM_r3)); DEFINE(S_R4, offsetof(struct pt_regs, ARM_r4)); DEFINE(S_R5, offsetof(struct pt_regs, ARM_r5)); DEFINE(S_R6, offsetof(struct pt_regs, ARM_r6)); DEFINE(S_R7, offsetof(struct pt_regs, ARM_r7)); DEFINE(S_R8, offsetof(struct pt_regs, ARM_r8)); DEFINE(S_R9, offsetof(struct pt_regs, ARM_r9)); DEFINE(S_R10, offsetof(struct pt_regs, ARM_r10)); DEFINE(S_FP, offsetof(struct pt_regs, ARM_fp)); DEFINE(S_IP, offsetof(struct pt_regs, ARM_ip)); DEFINE(S_SP, offsetof(struct pt_regs, ARM_sp)); DEFINE(S_LR, offsetof(struct pt_regs, ARM_lr)); DEFINE(S_PC, offsetof(struct pt_regs, ARM_pc)); DEFINE(S_PSR, offsetof(struct pt_regs, ARM_cpsr)); DEFINE(S_OLD_R0, offsetof(struct pt_regs, ARM_ORIG_r0)); #define ARM_cpsr uregs[16]#define ARM_pc uregs[15]#define ARM_lr uregs[14]#define ARM_sp uregs[13]#define ARM_ip uregs[12]#define ARM_fp uregs[11]#define ARM_r10 uregs[10]#define ARM_r9 uregs[9]#define ARM_r8 uregs[8]#define ARM_r7 uregs[7]#define ARM_r6 uregs[6]#define ARM_r5 uregs[5]#define ARM_r4 uregs[4]#define ARM_r3 uregs[3]#define ARM_r2 uregs[2]#define ARM_r1 uregs[1]#define ARM_r0 uregs[0]#define ARM_ORIG_r0 uregs[17]macos3.2 get_thread_info tsktsk即r9寄存器的别名,内核中为寄存器声明的别名如下/** These are the registers used in the syscall handler, and allow us to* have in theory up to 7 arguments to a function - r0 to r6.** r7 is reserved for the system call number for thumb mode.** Note that tbl == why is intentional.** We must set at least "tsk" and "why" when calling ret_with_reschedule.*/scno .req r7 @ syscall numbertbl .req r8 @ syscall table pointerwhy .req r8 @ Linux syscall (!= 0)tsk .req r9 @ current thread_infoget_thread_info tsk的作⽤是获取sp地址保存在tsk(r9)中,即r9中保存当前任务的thread_info结构的地址。
Linux中request_irq()中断申请与处理说明
Linux中request_irq()中断申请与处理说明1、中断的理解中断你可以理解为就是⼀种电信号,是由硬件设备产⽣的然后发送给处理器,处理器接收到中断后,就会马上向操作系统反映此信号,之后就是系统的⼯作了。
这⾥有两个注意的地⽅,第⼀中断是随时都可以产⽣,意味着中断的处理程序随时都可以执⾏,所以得保证中断处理程序能够快速执⾏,才可能尽快的恢复中断代码执⾏,所以中断代码尽量简短。
第⼆每⼀个中断都有⾃⼰唯⼀的数字标记,这样操作系统才能对症下药2、注册中断中断处理程序中断处理程序是管理硬件的驱动程序的组成部分,每⼀设备都有相关的驱动程序,驱动程序可以通过request_irq()函数注册⼀个中断处理程序,并且激活给定的中断线,来处理指定的中断,原型如下:int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags, const char *devname, void *dev_id)第⼀个参数irq表⽰要分配的中断号,就我⽬前所接触的都是预先已经预定好的,还没试着通过探测或者动态来确定中断号第⼆个参数handler是⼀个指针,指向处理这个中断的实际中断处理程序,只要操作系统⼀接收到中断,该函数就被调⽤,这个函数稍后讨论第三个参数flags中断处理程序的标志,这个标志可以是⼀个也可以是多个,列举⼏个最重要的标志:IRQF_DISABLED: 该标志被设置后,意味内核在处理中断处理程序本⾝的时候,禁⽌了其他所有的中断。
如果不设置,中断处理程序可以与除本⾝之外的其他任何中断同时运⾏。
显⽽易见我们⼀般不去这么野蛮的设置这个标志IRQF_TIMER:为系统定时器的中断处理⽽准备的IRQF_SHARED:这个中断标志经常能遇见,这个标志意思就是多个中断处理程序之间可以共享中断线,概括起来就是没有这个标志就只能独⾃⼀个⼈占⽤,标志了,就是很多⼈可以占⽤这个中断号来第四个才参数就是⾃定义与中断设备相关的⽂本了第五个参数dev,看到第三个参数中IRQF_SHARED时候,你会不会有这样的疑问,假如现在我要释放当前共享的指定这个中断程序时候,我如何释放?会不会把其他占⽤也会删除掉,这就是第五个参数的意义,如果中断线是共享的,那么就必须传递能够代表当前设备的唯⼀信息request_irq()成功返回0,如果返回⾮0,就表⽰有错误发⽣,这个时候你可以考虑当前中断是否被占⽤了,所以可以加上IRQF_SHARED标志3、中断处理程序这⾥延续上⾯的handler指针,原型如下:Static irqreturn_t intr_handler(int irq, void *dev)这⾥唠叨⼀下,不知道⼤家⾯试时候有没有遇到像这样的题⽬__interrupt double compute_area (double radius){double area = PI * radius * radius;printf(" Area = %f", area);return area;},指出上⾯中断函数出现的错误,不知道的就认真看下⾯的 O(∩_∩)O第⼀个参数irq就是这个处理程序要响应的中断号,这个我认为现在没有多⼤意义了,因为上⾯有讲述到第五个参数的意义第⼆个参数dev是⼀个通⽤的指针,同样的,还是将上⾯讲述到的第五个参数拿过来理解。
计算机中断名词解释
计算机中断名词解释
计算机中断是指在计算机执行程序时,当出现某些事件发生或需要处理的情况时,计算机会停止当前的活动,并转而去处理该事件或情况。
中断是一种用于处理计算机输入输出、异常情况、系统调用等的机制。
以下是一些常见的计算机中断名词及其解释:
1. 外部中断:由外部设备或外部事件引起的中断。
例如,键盘输入、鼠标移动等。
2. 内部中断:由CPU或其他内部设备引起的中断。
例如,除法错误中断、时钟中断等。
3. 异常中断:由非法的指令、数据溢出、除零错误等引起的中断。
4. 硬件中断:由硬件设备触发的中断。
例如,硬盘IO完成中断、网卡接收中断等。
5. 软件中断:由程序或操作系统通过软件方式触发的中断。
例如,系统调用中断、软中断等。
6. IRQ中断:在计算机硬件系统中,IRQ(Interrupt Request)是系统中断请求线的一种。
它用于连接各种外部设备,当外部设备需要处理时,会向CPU发送中断请求。
7. 中断处理程序:也称为中断服务程序,是一段用于处理中断事件的程序。
当中断发生时,CPU会跳转到中断处理程序的入口地址开始执行,并在处理完中断事件后返回原来的程序继续执行。
8. 中断向量表:用于记录各个中断类型对应的中断处理程序入口地址的表格。
当中断发生时,CPU会根据中断号从中断向量表中查找对应的中断处理程序入口地址,并跳转到该地址开始执行中断处理程序。
如何在BIOS中手动指定中断号(IRQ)
IRQ是各种设备(端口、SCSI卡、声卡等)与CPU的直接连接线。
当某个设备需要C PU处理时,就通过这条线发送请求命令。
共有14条(2到15)IRQ线供设备使用,但在同一时刻只能有一个设备使用给定的IR Q。
例如鼠标和声卡不能使用同一条IRQ,然而您可以让声卡和打印机使用同一条IRQ,因为它们通常不会同时工作。
在一个典型的系统中,I RQ 3、4、6和14一般分配给调制解调器、鼠标、软盘控制器和硬盘控制器。
不要将这些I RQ分配给其它设备。
设备使用的I RQ中断号IRQ0 Time电脑系统计时器IRQ1 Key Board键盘IRQ2 Red irect IRQ9可编程的中断控制器(与I RQ9相接,MPU-401、M DI使用该IRQ)IRQ3COM2串口设备通讯端口IRQ4 COM1 串口设备通讯端口I RQ5 L PT2 建议保留给声卡I RQ6 F DD 软驱传输控制IRQ7 LPT1 打印机传输控制IRQ8 CMO S Ale rt 系统CMO S即时时钟IRQ9 Red irect IRQ2与I RQ2相接,可设定给其他硬件IRQ10 Reve rsed建议保留给网卡IRQ11 Reve rsed建议保留给AGP显卡IR Q12 P S/2Mo use 通用串行总线控制器,接PS/2鼠标,若无也可设定给其他硬件IRQ13 FPU数值数据协调处理器,例如FPU(浮点运算器)IRQ14 Pr imary IDE主硬盘传输控制IRQ15 Seco ndary IDE从硬盘传输控制你可以通过以下两种方法来更改IRQ:1)更改通讯端口CO M:在"控制面板\调制解调器\调制解调器属性"窗口,选择"常规"标签的"MODE M"列表项,然后按"属性"按钮,在"端口"列表框中另选其它C OM端口。
中断的基本概念
中断的基本概念
中断是计算机系统中的一种机制,用于处理来自外部设备或其他软件的异步事件。
当发生某个特定事件时,计算机会立即中断正在执行的程序,并转而执行一段称为中断处理程序(或中断服务程序)的代码。
处理完中断事件后,计算机会回到原来被中断的程序继续执行。
中断的基本概念包括以下几个要素:
1. 中断源:引起中断的事件或信号的来源,可以是硬件设备(如键盘、鼠标、定时器等)的输入,或者是软件发起的中断请求。
2. 中断控制器:用于控制和管理中断请求的硬件设备,将中断源的信号转发给处理器。
3. 中断请求(IRQ):中断源产生中断信号时向处理器发送的请求,表明有中断事件需要处理。
4. 中断向量表:存储了各个中断处理程序的入口地址信息。
当中断发生时,处理器会根据中断源的IRQ编号,在中断向量表中查找对应的处理程序的入口地址。
5. 中断处理程序:也称为中断服务程序,是一段特定的代码,用于处理中断事件。
中断处理程序通常会保存被中断程序的上下文状态,处理中断事件,然后恢复被中断程序的上下文,使其继续执行。
6. 中断屏蔽:为了避免繁忙的处理器被频繁中断,可以通过设置中断屏蔽位来屏蔽某些中断请求的响应。
只有当中断请求的中断屏蔽位被解除时,相应的中断才会被处理。
中断机制的引入可以提高计算机系统的响应能力和处理效率,使处理器能够及时响应外部设备的需求,并优先处理紧急的中断事件。
irq_中断
PDF 文件使用 "pdfFactory Pro" 试用版本创建
// include/linux/interrupt.h struct irqaction { irq_handler_t handler; // 指向中断服务程序 unsigned long flags; // 中断标志 unsigned long mask; // 中断掩码 const char *name; // I/O 设备名 void *dev_id; // 设备标识 struct irqaction *next; // 指向下一个描述符 int irq; // IRQ 线 struct proc_dir_entry *dir; // 指向 IRQn 相关的/proc/irq/n 目录的描述符 };
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中断是计算机处理特殊问题的一个过程,当计算机执行程序的过程中出现某个特殊情况时,会暂时中止现行程序,转去执行这一事件的程序,处理完毕之后再回到原来程序的中断点继续执行的整个过程叫做中断。
什么是IRQ
那么,什么是IRQ(中断请求)呢?中断请求是由某个设备发出并同时请求CPU产生中断的一个请求响应信号。
通常情况下,计算机是根据中断请求的优先级来决定究竟应当首先响应哪一个设备的中断请求的(中断请求
IRQ0~1RQ15中,IRQ0的优先级别最高,IRQ15最低)。
原则上,计算机中每个设备自身只有惟一的一个中断请求通道,即IRQ值(又叫IRQ号)。
当两个硬件设备同时使用同一个中断通道(IRQ值)时,就会发生IRQ冲突,因为这个时候处理器已经无法准确判断收到的中断请求究竟来自于哪个设备了。
IRQ的分配与冲突产生的原因
表1 各irq在bios中所对应的硬件设备
irq编号
设备名称
用途
irq0
time
电脑系统计时器
irq1
keyboard
键盘
irq2
redirect irq9
与irq9相接,mpu-401 mdi使用该irq
irq3
com2
串口设备
irq4
com1
串口设备
irq5
lpt2
建议声卡使用该irq
irq6
fdd
软驱传输控制用
irq7
lpt1
打印机传输控制用
irq8
cmos alert
即时时钟
irq9
redirect irq2
与irq2相接;可设定给其他硬件使用
irq10
reversed
建议网卡使用该irq
irq11
reversed
与irq10相同,都是保留给pci硬件使用,建议分配给显卡
irq12
ps/2mouse
接ps/2鼠标,若无,也可设定给其他硬件使用
irq13
fpu
协处理器用,例如fpu(浮点运算器)
irq14
primary ide
主硬盘传输控制器(1号)
irq15
secondary ide
从硬盘传输控制器(2号)
在我们使用的计算机中,大都是由一个中断控制器8259来控制系统中每个硬件的IRQ值。
目前共有16组IRQ,去掉其中用来做“桥接”的一组IRQ,实际上只有15组IRQ可供硬件使用。
这15组IRQ,在基本输入输出系统(BIOS)中通常都有自己所对应的硬件设备(见表1 )。
而我们日常所用的操作系统,对于IRQ的分配也不尽相同,所以在安装新硬件的时候,系统往往并不能自动给设备分配正确的IRQ值,这样,难免就会造成此硬件设备或是原来的旧硬件出现不能正常工作的现象。
其实,这是由于操作系统误将该硬件使用的IRQ又同时分配给了另一个硬件设备所造成的。
产生IRQ冲突后,冲突硬件便不能正常工作。
一般来说,遇到这种情况,只要将产生冲突的两个硬件的IRQ值以手动方式调开或在BIOS中进行相应的调整,就可以解决问题。
如何解决IRQ冲突
1、硬件“挪移”法:此方法主要用来解决中断冲突造成的死机和较难排除的IRQ冲突。
即在主板BIOS默认的IRQ资源分配下,通过调整板卡(声卡、Modem、网卡、电视卡、显卡等)于插槽的安装位置来避开IRQ冲突。
采取这种方法时,需要用户掌握主板BIOS默认状态下的IRQ资源分配情况,然后在此基础上调整板卡的位置,从而避开IRQ冲突。
表2 某主板bios默认状态下的irq资源分配表件设备
插槽
int a
int b
int c
int d
pci插槽1
共享
pci插槽2
pci插槽3
共享
pci插槽4
共享
pci插槽5
共享
pci插槽6
共享
agp插槽
共享
主板声卡
共享
usb控制器
共享
下面我们举例来说明,表2为某主板BIOS默认状态下的IRQ资源分配情况,可以看到该主板在BIOS默认的情况下,PCI-1与AGP共用一个中断请求(通常是IRQ11),PCI-3、PCI-5、板载声卡共用一个中断资源,PCI-4、PCI-6及USB控制器共用一个中断资源。
了解了上述IRQ分配情况,那么在安装板卡的时候,我们就可以以表3的方式来进行板卡的安装,以避开IRQ冲突。
表3 建议采用的安装方式
配件
安装位置
默认的irq自动配置
agp显卡
agp插槽
与pci 插槽1共享irq
pci显卡
pci 插槽1
与agp插槽共享irq
电视卡
pci 插槽2
独立使用irq(不共享irq)
声卡
pci 插槽3或插槽5
与主板上的ac97声卡共享irq
网卡、内置modem
pci 插槽4或插槽6
与主板上的usb控制器共享irq
这样分配的理由是:很少有人会同时使用AGP显卡与PCI显卡,因此与之对应的中断资源(IRQ11)就处于独享状态。
分配PCI-2插槽给电视卡,这是由于PCI-2本身就独享一个中断资源。
而使用单独的声卡时,由于我们从主板上屏蔽了板载声卡,因此无论声卡插在PCI-3或PCI-5上,均不会与其他硬件发生中断冲突。
同样,网卡、内置Modem皆可按此方法进行安装。
2、主板BIOS、操作系统的“软配置”法:对于不太严重的中断冲突(不死机),我们可以通过手动调整BIOS和操作系统中的IRQ值来避开IRQ冲突。
下面以笔者的升技BH6主板为例来说明:
1)进入操作系统,依次打开“控制面板→设备管理器→属性”,查看各硬件的IRQ的分配情况。
当硬件产生IRQ冲突和驱动程序安装错误时,通常以“!”号或“?”来标识。
2)以Windows Me为例,依次选择“开始→程序→附件→系统工具→系统信息→硬件资源→IRQ”,从信息栏中,我们可以非常直观的了解IRQ资源的分配情况。
3)从图1中笔者发现IRQ3(COM2)处于闲置状态(在IRQ资源紧张之时,可以在BIOS中屏蔽COM2以节约出一个IRQ),声卡与显示卡共用IRQ11,从而导致声卡与显示卡IRQ冲突,本来应该分配给声卡使用的IRQ5却分配给电视卡(Bt848 Video Capture Device)。
下面,笔者将通过调整BIOS中的
“PNP/PCI Configuration”设置项,重新分配IRQ资源,以避开IRQ冲突。
图1 IRQ资源的分配情况
4)重新启动计算机,进入CMOS设置菜单,选择“PNP/PCI Configuration”(如图2),将“PNP OS Installed(即插即用操作系统安装)”定义为“Yes”,将“Resources Contro lled By(资源控制)”定义“Auto(自动)”。
图2 “PNP/PCI Configuration”控制项可以让用户自由分配IRQ资源
5)将“PIRQ_0 USE IRQ No:”(PCI-1)设定为“Auto”(这个PCI插槽实际上是空着的)。
6)将“PIRQ_1 USE IRQ No:”(PCI-2)设定为“10”(这个PCI槽由Modem 使用着)。
7)将“PIRQ_2 USE IRQ No:”(PCI-3)设定为“5”(这个PCI槽由PCI声卡使用着)。
8)将“PIRQ_3 USE IRQ No:”(PCI-4)设定为“3”(这个PCI槽由电视卡使用着)。
9)保存并退出CMOS设置程序。
通过对IRQ的调整,笔者将原本十分紧张的IRQ资源节省出了一个IRQ3,并将其重新分配给了电视卡。
而原来占用着IRQ5的电视卡又将该IRQ资源还给了声卡。
这样,声卡就获得了IRQ5的控制权。
之后,电视卡使用IRQ3、声卡使用IRQ5、显示卡使用IRQ11、Modem使用IRQ10(表3)。
通过合理的IRQ资源重新分配,各硬件终于可以和平相处了。