资源描述:
《中断虚拟化代码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、qemu-kvm中断虚拟化代码分析硬件中断发生(qemu模拟设备)1.硬件产生中断的接口voidqemu_set_irq(qemu_irqirq,intlevel);2.中断过程voidqemu_set_irq(qemu_irqirq,intlevel){if(!irq)return;irq->handler(irq->opaque,irq->n,level);}设置中断控制器hander,大致分为三种情况1.cpu_irq的hander===>pic_irq_request2.内核模拟中断控制器的hander===>kvm_i8259_set_irq3
2、.用户模拟中断控制器的hander===>i8259_set_irq/*PChardwareinitialisation*/staticvoidpc_init1(){cpu_irq=qemu_allocate_irqs(pic_irq_request,NULL,1);#ifdefKVM_CAP_IRQCHIPif(kvm_enabled()&&kvm_irqchip_in_kernel()){isa_irq_state=qemu_mallocz(sizeof(*isa_irq_state));isa_irq=i8259=kvm_i8259_init(cp
3、u_irq[0]);}else#endif{i8259=i8259_init(cpu_irq[0]);isa_irq_state=qemu_mallocz(sizeof(*isa_irq_state));isa_irq_state->i8259=i8259;isa_irq=qemu_allocate_irqs(isa_irq_handler,isa_irq_state,24);}先研究用户空间中断控制器的中断发生过程staticvoidi8259_set_irq(void*opaque,intirq,intlevel){PicState2*s=opaqu
4、e;pic_set_irq1(&s->pics[irq>>3],irq&7,level);pic_update_irq(s);}中断触发方式分为电平触发和边沿触发,isa设备大多数采用边沿触发,pci设备采用电平触发。假如采用边沿触发,如果leveld等于1,并且没有等待的中断请求(没有pending中断请求),设置中断请求寄存器为1,另外设置pending中断请求为1.如果有pending中断请求,并不设置中断请求寄存器,可见允许中断丢失。/*setirqlevel.Ifanedgeisdetected,thentheIRRissetto1*/stat
5、icinlinevoidpic_set_irq1(PicState*s,intirq,intlevel){intmask;mask=1<elcr&mask){/*leveltriggered*/if(level){s->irr
6、=mask;s->last_irr
7、=mask;}else{s->irr&=~mask;s->last_irr&=~mask;}}else{/*edgetriggered*/if(level){if((s->last_irr&mask)==0)s->irr
8、=mask;s->last_irr
9、=mask;}e
10、lse{s->last_irr&=~mask;}}}每次有中断请求,必须调用该函数。该函数调用造成中断嵌套。另外必须话必须注入中断。什么情况下是必须呢?具体可参照pic_get_irq()函数。这个函数对产生中断优先级和正在处理中断优先级进行比较,如果大于话,注入请求中断。注入中断时机由qemu_irq_raise触发的,下面列出该函数。/*raiseirqtoCPUifnecessary.mustbecalledeverytimetheactiveirqmaychange*/voidpic_update_irq(PicState2*s){/*looka
11、trequestedirq*/irq=pic_get_irq(&s->pics[0]);if(irq>=0){qemu_irq_raise(s->parent_irq);}}不要认为,好像又循环到中断入口了,实际没有,关键在于参数s->parent_irq,该参数实际调用cpu_irq的hander===>pic_irq_requeststaticinlinevoidqemu_irq_raise(qemu_irqirq){qemu_set_irq(irq,1);}目前只研究用户态模拟中断控制器i8259(剔除KVM模拟和apic中断控制器),cpu_in
12、terrupt函数实际中断目前虚拟处理器运行,为硬件中断注入做好准备,目前就是中