设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] kvm代码架构简单分析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-10 09:34:43 | 显示全部楼层 |阅读模式
kvm代码结构简析
(2011-03-30 16:57:28)http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif转载标签:杂谈
以booke500为例:
初始化;kvmppc_e500_init===============================arch/powerpc/kvm/e500.c   |        \   |        \   |         \kvm_init   kvmppc_booke_init   |   |   |kvm_arch_init, kvm_arch_hardware_setup, register(kvm_dev)   |   |   | kvm_sched_in  ---------------- kvm_arch_vcpu_load kvm_sched_out ---------------- kvm_arch_vcpu_put

其中register kvm_dev中提供了一ioctl操作函数: kvm_dev_ioctl    |     \    |    kvm_arch_dev_ioctl 其他对/dev/kvm的操作 kvm_dev_ioctl_create_vm生成vm文件句柄,可以通过此句柄对vm进行操作    |    |kvm_create_vm , anon_inode_getfd("kvm-vm",&kvm_vm_fops, kvm, O_RDWR)其中anon_inode_getfd创建file fd ,其创建的所有file共享一个inode。对vm的操作实际上就是对此file的操作,因此对其ioctl调用的是kvm_vm_fops中的成员函数:kvm_vm_ioctl    |    |    |KVM_CREATE_VCPU:                    kvm_vm_ioctl_create_vcpuKVM_SET_USER_MEMORY_REGION:          kvm_vm_ioctl_set_memory_regionKVM_GET_DIRTY_LOG:                  kvm_vm_ioctl_get_dirty_logKVM_REGISTER_COALESCED_MMIO:         kvm_vm_ioctl_register_coalesced_mmioKVM_UNREGISTER_COALESCED_MMIO:        kvm_vm_ioctl_unregister_coalesced_mmioKVM_IRQFD:                         kvm_irqfdKVM_IOEVENTFD:                      kvm_ioeventfdKVM_SET_BOOT_CPU_ID:default :                          kvm_arch_vm_ioctl,                                 kvm_vm_ioctl_assigned_device

以下对其调用的函数关系做分析:1.kvm_vm_ioctl_create_vcpu    |    |    |kvm_arch_vcpu_create--kvmppc_core_vcpu_create--kvm_vcpu_init--kvm_arch_vcpu_init                                       kvmppc_e500_tlb_initkvm_arch_vcpu_setup--kvmppc_core_vcpu_setup--kvmppc_e500_tlb_setupcreate_vcpu_fd ---anon_inode_getfd("kvm-vcpu",&kvm_vcpu_fops, vcpu, O_RDWR)其中create_vcpu_fd生成对vcpu操作的文件fd,其ioctl调用的是kvm_vcpu_fops中的kvm_vcpu_ioctl    |    |    |KVM_RUN:                           kvm_arch_vcpu_ioctl_runKVM_GET_REGS:                      kvm_arch_vcpu_ioctl_get_regsKVM_SET_REGS:                      kvm_arch_vcpu_ioctl_set_regsKVM_GET_SREGS:                     kvm_arch_vcpu_ioctl_get_sregsKVM_SET_SREGS:                     kvm_arch_vcpu_ioctl_set_sregsKVM_GET_MP_STATE:                   kvm_arch_vcpu_ioctl_get_mpstateKVM_SET_MP_STATE:                   kvm_arch_vcpu_ioctl_set_mpstateKVM_TRANSLATE:                     kvm_arch_vcpu_ioctl_translateKVM_SET_GUEST_DEBUG:                kvm_arch_vcpu_ioctl_set_guest_debugKVM_SET_SIGNAL_MASK:                kvm_vcpu_ioctl_set_sigmaskKVM_GET_FPU:                       kvm_arch_vcpu_ioctl_get_fpuKVM_SET_FPU:                       kvm_arch_vcpu_ioctl_set_fpu(ppc s390结构下)KVM_S390_INTERRUPT:KVM_INTERRUPTdefault:                           kvm_arch_vcpu_ioctl
其中:kvm_arch_vcpu_ioctl_run -----__kvmppc_vcpu_runkvm_arch_vcpu_ioctl    |    |KVM_INTERRUPT:                      kvm_vcpu_ioctl_interruptKVM_ENABLE_CAP:                     kvm_vcpu_ioctl_enable_cap

2.kvm_irqfd    |    |    |kvm_irqfd_assign
3kvm_ioeventfd    |    |    |kvm_assign_ioeventfd


======================================二、中断处理过程以e500为例,powerpc专门分配了页用来存储中断处理入口地址入口地址为变量kvmppc_booke_handlers
在arch/powerpc/kvm/booke_interrupt.S中定义了一些列中断处理代码: 72 _GLOBAL(kvmppc_handlers_start) 73 KVM_HANDLERBOOKE_INTERRUPT_CRITICAL 74 KVM_HANDLERBOOKE_INTERRUPT_MACHINE_CHECK 75 KVM_HANDLERBOOKE_INTERRUPT_DATA_STORAGE 76 KVM_HANDLERBOOKE_INTERRUPT_INST_STORAGE 77 KVM_HANDLERBOOKE_INTERRUPT_EXTERNAL 78 KVM_HANDLERBOOKE_INTERRUPT_ALIGNMENT 79 KVM_HANDLER BOOKE_INTERRUPT_PROGRAM 80 KVM_HANDLERBOOKE_INTERRUPT_FP_UNAVAIL 81 KVM_HANDLER BOOKE_INTERRUPT_SYSCALL 82 KVM_HANDLERBOOKE_INTERRUPT_AP_UNAVAIL 83 KVM_HANDLERBOOKE_INTERRUPT_DECREMENTER 84 KVM_HANDLER BOOKE_INTERRUPT_FIT 85 KVM_HANDLERBOOKE_INTERRUPT_WATCHDOG 86 KVM_HANDLERBOOKE_INTERRUPT_DTLB_MISS 87 KVM_HANDLERBOOKE_INTERRUPT_ITLB_MISS 88 KVM_HANDLER BOOKE_INTERRUPT_DEBUG 89 KVM_HANDLERBOOKE_INTERRUPT_SPE_UNAVAIL 90 KVM_HANDLERBOOKE_INTERRUPT_SPE_FP_DATA 91 KVM_HANDLERBOOKE_INTERRUPT_SPE_FP_ROUND 92 93 _GLOBAL(kvmppc_handler_len) 94    .long kvmppc_handler_1 - kvmppc_handler_0
在kvm初始化时将kvmppc_handlers_start内容拷贝到kvmppc_booke_handlers中,例如rch/powerpc/kvm/e500.c的kvmppc_e500_init中149    150     ivor[0] =mfspr(SPRN_IVOR32);151     ivor[1] =mfspr(SPRN_IVOR33);152     ivor[2] =mfspr(SPRN_IVOR34);153     for (i = 0; i< 3; i&#43;&#43;) {154        if (ivor > max_ivor)155            max_ivor =ivor;156157        memcpy((void *)kvmppc_booke_handlers &#43;ivor,158              kvmppc_handlers_start &#43; (i &#43;16) * kvmppc_handler_len,159              kvmppc_handler_len);160     }
和arch/powerpc/kvm/booke.c的kvmppc_booke_init函数:588    590     ivor[0] =mfspr(SPRN_IVOR0);591     ivor[1] =mfspr(SPRN_IVOR1);592     ivor[2] =mfspr(SPRN_IVOR2);593     ivor[3] =mfspr(SPRN_IVOR3);594     ivor[4] =mfspr(SPRN_IVOR4);595     ivor[5] =mfspr(SPRN_IVOR5);596     ivor[6] =mfspr(SPRN_IVOR6);597     ivor[7] =mfspr(SPRN_IVOR7);598     ivor[8] =mfspr(SPRN_IVOR8);599     ivor[9] =mfspr(SPRN_IVOR9);600     ivor[10] =mfspr(SPRN_IVOR10);601     ivor[11] =mfspr(SPRN_IVOR11);602     ivor[12] =mfspr(SPRN_IVOR12);603     ivor[13] =mfspr(SPRN_IVOR13);604     ivor[14] =mfspr(SPRN_IVOR14);605     ivor[15] =mfspr(SPRN_IVOR15);606607     for (i = 0; i< 16; i&#43;&#43;) {608        if (ivor > max_ivor)609            max_ivor =ivor;610611        memcpy((void *)kvmppc_booke_handlers &#43;ivor,612              kvmppc_handlers_start &#43; i *kvmppc_handler_len,613              kvmppc_handler_len);614     }
这两个地方将kvmppc_handlers_start代码拷贝到kvmppc_booke_handlers中kvmppc_booke_handlers 在__kvmppc_vcpu_run中告知cpu__kvmppc_vcpu_run使得cpu进入guest执行状态

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-124953-1-1.html 上篇帖子: Ubuntu12.04 服务器版 安装kvm 下篇帖子: 迁移VMware虚拟机到KVM(3)–virt-v2v 迁移 VMware ESX 虚拟机的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表