x86架构对KVM支持的内核实现

对于cpu体系架构和Linux内核的KVM架构来说,两者需要相互配合,以实现整个虚拟化的统一。
对于X86来说,它主要是一个 vmx_x86_ops对象,并且定义一个全局对象struct kvm_x86_ops *kvm_x86_ops;
这样,X86下的vmx_x86_ops 向内核的KVM层注册,KVM层回调这些函数。
对于X86来说,它自定义了一个struct kvm_x86_ops *kvm_x86_ops对象,这样,在KVM层回调时,在X86下面通过全局的kvm_x86_ops
来回调处理。
对于KVM来说,X86向KVM层注册回调函数是通过kvm_init()进行的,这个函数实现在Linux kernel的KVM架构层,各个具体支持KVM虚拟化的cpu
需要调用这个kvm_init函数。对X86来说,其通过函数kvm_arch_init设置全局的kvm_x86_ops = ops;
 
x86实现的体系架构的vmx操作如下:

arch/x86/include/asm/kvm_host.h static struct kvm_x86_ops vmx_x86_ops  = {  .cpu_has_kvm_support = cpu_has_kvm_support,  .disabled_by_bios = vmx_disabled_by_bios,  .hardware_setup = hardware_setup,  .hardware_unsetup = hardware_unsetup,  .check_processor_compatibility = vmx_check_processor_compat,  .hardware_enable = hardware_enable,  .hardware_disable = hardware_disable,  .cpu_has_accelerated_tpr = report_flexpriority,  .cpu_has_high_real_mode_segbase = vmx_has_high_real_mode_segbase,

 .vcpu_create = vmx_create_vcpu,  .vcpu_free = vmx_free_vcpu,  .vcpu_reset = vmx_vcpu_reset,

 .prepare_guest_switch = vmx_save_host_state,  .vcpu_load = vmx_vcpu_load,  .vcpu_put = vmx_vcpu_put,

 .update_bp_intercept = update_exception_bitmap,  .get_msr = vmx_get_msr,  .set_msr = vmx_set_msr,  .get_segment_base = vmx_get_segment_base,  .get_segment = vmx_get_segment,  .set_segment = vmx_set_segment,  .get_cpl = vmx_get_cpl,  .get_cs_db_l_bits = vmx_get_cs_db_l_bits,  .decache_cr0_guest_bits = vmx_decache_cr0_guest_bits,  .decache_cr3 = vmx_decache_cr3,  .decache_cr4_guest_bits = vmx_decache_cr4_guest_bits,  .set_cr0 = vmx_set_cr0,  .set_cr3 = vmx_set_cr3,  .set_cr4 = vmx_set_cr4,  .set_efer = vmx_set_efer,  .get_idt = vmx_get_idt,  .set_idt = vmx_set_idt,  .get_gdt = vmx_get_gdt,  .set_gdt = vmx_set_gdt,  .get_dr6 = vmx_get_dr6,  .set_dr6 = vmx_set_dr6,  .set_dr7 = vmx_set_dr7,  .sync_dirty_debug_regs = vmx_sync_dirty_debug_regs,  .cache_reg = vmx_cache_reg,  .get_rflags = vmx_get_rflags,  .set_rflags = vmx_set_rflags,

 .get_pkru = vmx_get_pkru,

 .fpu_activate = vmx_fpu_activate,  .fpu_deactivate = vmx_fpu_deactivate,

 .tlb_flush = vmx_flush_tlb,

 .run = vmx_vcpu_run,  .handle_exit = vmx_handle_exit,  .skip_emulated_instruction = skip_emulated_instruction,  .set_interrupt_shadow = vmx_set_interrupt_shadow,  .get_interrupt_shadow = vmx_get_interrupt_shadow,  .patch_hypercall = vmx_patch_hypercall,  .set_irq = vmx_inject_irq,  .set_nmi = vmx_inject_nmi,  .queue_exception = vmx_queue_exception,  .cancel_injection = vmx_cancel_injection,  .interrupt_allowed = vmx_interrupt_allowed,  .nmi_allowed = vmx_nmi_allowed,  .get_nmi_mask = vmx_get_nmi_mask,  .set_nmi_mask = vmx_set_nmi_mask,  .enable_nmi_window = enable_nmi_window,  .enable_irq_window = enable_irq_window,  .update_cr8_intercept = update_cr8_intercept,  .set_virtual_x2apic_mode = vmx_set_virtual_x2apic_mode,  .set_apic_access_page_addr = vmx_set_apic_access_page_addr,  .get_enable_apicv = vmx_get_enable_apicv,  .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,  .load_eoi_exitmap = vmx_load_eoi_exitmap,  .hwapic_irr_update = vmx_hwapic_irr_update,  .hwapic_isr_update = vmx_hwapic_isr_update,  .sync_pir_to_irr = vmx_sync_pir_to_irr,  .deliver_posted_interrupt = vmx_deliver_posted_interrupt,

 .set_tss_addr = vmx_set_tss_addr,  .get_tdp_level = get_ept_level,  .get_mt_mask = vmx_get_mt_mask,

 .get_exit_info = vmx_get_exit_info,

 .get_lpage_level = vmx_get_lpage_level,

 .cpuid_update = vmx_cpuid_update,

 .rdtscp_supported = vmx_rdtscp_supported,  .invpcid_supported = vmx_invpcid_supported,

 .set_supported_cpuid = vmx_set_supported_cpuid,

 .has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,

 .write_tsc_offset = vmx_write_tsc_offset,

 .set_tdp_cr3 = vmx_set_cr3,

 .check_intercept = vmx_check_intercept,  .handle_external_intr = vmx_handle_external_intr,  .mpx_supported = vmx_mpx_supported,  .xsaves_supported = vmx_xsaves_supported,

 .check_nested_events = vmx_check_nested_events,

 .sched_in = vmx_sched_in,

 .slot_enable_log_dirty = vmx_slot_enable_log_dirty,  .slot_disable_log_dirty = vmx_slot_disable_log_dirty,  .flush_log_dirty = vmx_flush_log_dirty,  .enable_log_dirty_pt_masked = vmx_enable_log_dirty_pt_masked,

 .pre_block = vmx_pre_block,  .post_block = vmx_post_block,

 .pmu_ops = &intel_pmu_ops,

 .update_pi_irte = vmx_update_pi_irte,

#ifdef CONFIG_X86_64  .set_hv_timer = vmx_set_hv_timer,  .cancel_hv_timer = vmx_cancel_hv_timer, #endif

 .setup_mce = vmx_setup_mce, };

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值