0
点赞
收藏
分享

微信扫一扫

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

Yaphets_巍 2023-05-30 阅读 51


对于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,
};

 

举报

相关推荐

0 条评论