中断虚拟化代码分析

中断虚拟化代码分析

ID:37641571

大小:467.91 KB

页数:21页

时间:2019-05-27

中断虚拟化代码分析_第1页
中断虚拟化代码分析_第2页
中断虚拟化代码分析_第3页
中断虚拟化代码分析_第4页
中断虚拟化代码分析_第5页
资源描述:

《中断虚拟化代码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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函数实际中断目前虚拟处理器运行,为硬件中断注入做好准备,目前就是中

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。