kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩
qemu-kvm结构图 qemu /dev/kvm:kvm以字符设备的形式暴露给qemu使用,该字符设备实现了ioctl操作 libkvm libkvm:把ioctl操作进一步封装,暴露给qemu使用 /dev/kvm kvm (linux内核空间)
创建vm 1.打开dev/kvm设备获得fd 2.ioctl(KVM_CREATE_KVM),创建一个虚拟机 user_space kernel kvm_dev的file_operation ----> kvm_dev_ioctl (case KVM_CREATE_VM:) kvm_dev_ioctl_create_vm 创建kvm结构体,一台虚拟机对应一个kvm结构体,kvm保存vm的整体上下文 anon_inode_getfd返回供用户态使用的vm_fd
创建vcpu 1.对vm_fd 进行ioctl(KVM_CREATE_VCPU) user_space kernel vm_fd的file_operation ----> kvm_vm_fops.unlocked_ioctl (=kvm_vm_ioctl) (case KVM_CREATE_VCPU:) kvm_vm_ioctl_create_vcpu kvm_vm_ioctl_create_vcpu主要流程 kvm_vcpu结构体,保存cpu上下文 vcpu_fd:供user_space使用 将kvm_vcpu加入到相应kvm结构中
vcpu执行过程 VMM是qemu中的一个进程,运行在用户态,而每个vcpu由VMM的一个线程负责执行
vcpu执行过程 kernel VM_RUN VCPU_RUN 在VMM中处理VM_EXIT消息 VM_EXIT 虚拟机调度阻塞 在kernel中处理VM_EXIT消息 获得Event信息 VCP获取退出原因 能否内部处理 是否终止vcpu执行 kernel 传递回VMM进程处理 终止vcpu线程
虚拟机内存管理 guest guest_phys_addr host_virtual_addr VMM host host_phys_addr
缺页中断处理
同步的缺页中断处理
异步的缺页中断处理
缺页中断的整个过程 1.VM_EXIT 2.kvm_x86_ops.handle_exit(=vmx_handle_exit) (kvm_init-->kvm_arch_init-->assign kvm_x86_ops) 在vmx_handle_exit中: exit_reason=EXIT_REASON_EPT_VIOLATION 2.kvm_vmx_exit_handlers[handle_ept_violation](vcpu)(=handle_ept_violation) 3.kvm_mmu_page_fault vcpu.arch.mmu.page_fault(=tdp_page_fault) 4.tdp_page_fault
tdp_page_fault try_async_pf gfn_to_pfn_async __gfn_to_pfn(find memslot) __gfn_to_pfn_memslot(find hva) hva_to_pfn 1.hva_to_pfn_fast(没有加锁?) __get_user_pages_fast 2.hva_to_pfn_slow
如何确定使用EPT还是shadow页表
reference 1.https://www.linux-kvm.org/images/a/ac/2010-forum-Async-page-faults.pdf 2.http://blog.csdn.net/lux_veritas/article/details/9284635