ARM64 Linux KVM 常用结构

本文详细解读了Linux内核中的KVM虚拟化技术,重点介绍了kvm_vcpu结构,涵盖了预抢占通知、内存映射、异步中断处理、CPU放松拦截器、调试状态管理和虚拟CPU上下文等关键部分。深入探讨了ARM64架构下的特殊配置,如SVE状态和VGIC状态管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

include/linux/kvm_host.h

struct kvm_vcpu {

struct kvm *kvm;

#ifdef CONFIG_PREEMPT_NOTIFIERS

struct preempt_notifier preempt_notifier;

#endif

int cpu;

int vcpu_id; /* id given by userspace at creation */

int vcpu_idx; /* index in kvm->vcpus array */

int srcu_idx;

int mode;

u64 requests;

unsigned long guest_debug;

int pre_pcpu;

struct list_head blocked_vcpu_list;

struct mutex mutex;

struct kvm_run *run;

struct rcuwait wait;

struct pid __rcu *pid;

int sigset_active;

sigset_t sigset;

struct kvm_vcpu_stat stat;

unsigned int halt_poll_ns;

bool valid_wakeup;

#ifdef CONFIG_HAS_IOMEM

int mmio_needed;

int mmio_read_completed;

int mmio_is_write;

int mmio_cur_fragment;

int mmio_nr_fragments;

struct kvm_mmio_fragment mmio_fragments[KVM_MAX_MMIO_FRAGMENTS];

#endif

#ifdef CONFIG_KVM_ASYNC_PF

struct {

u32 queued;

struct list_head queue;

struct list_head done;

spinlock_t lock;

} async_pf;

#endif

#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT

/*

* Cpu relax intercept or pause loop exit optimization

* in_spin_loop: set when a vcpu does a pause loop exit

* or cpu relax intercepted.

* dy_eligible: indicates whether vcpu is eligible for directed yield.

*/

struct {

bool in_spin_loop;

bool dy_eligible;

} spin_loop;

#endif

bool preempted;

bool ready;

struct kvm_vcpu_arch arch;

};

arch/arm64/include/asm/kvm_host.h

struct kvm_vcpu_arch {

struct kvm_cpu_context ctxt;

void *sve_state;

unsigned int sve_max_vl;

/* Stage 2 paging state used by the hardware on next switch */

struct kvm_s2_mmu *hw_mmu;

/* HYP configuration */

u64 hcr_el2;

u32 mdcr_el2;

/* Exception Information */

struct kvm_vcpu_fault_info fault;

/* State of various workarounds, see kvm_asm.h for bit assignment */

u64 workaround_flags;

/* Miscellaneous vcpu state flags */

u64 flags;

/*

* We maintain more than a single set of debug registers to support

* debugging the guest from the host and to maintain separate host and

* guest state during world switches. vcpu_debug_state are the debug

* registers of the vcpu as the guest sees them. host_debug_state are

* the host registers which are saved and restored during

* world switches. external_debug_state contains the debug

* values we want to debug the guest. This is set via the

* KVM_SET_GUEST_DEBUG ioctl.

*

* debug_ptr points to the set of debug registers that should be loaded

* onto the hardware when running the guest.

*/

struct kvm_guest_debug_arch *debug_ptr;

struct kvm_guest_debug_arch vcpu_debug_state;

struct kvm_guest_debug_arch external_debug_state;

struct thread_info *host_thread_info; /* hyp VA */

struct user_fpsimd_state *host_fpsimd_state; /* hyp VA */

struct {

/* {Break,watch}point registers */

struct kvm_guest_debug_arch regs;

/* Statistical profiling extension */

u64 pmscr_el1;

} host_debug_state;

/* VGIC state */

struct vgic_cpu vgic_cpu;

struct arch_timer_cpu timer_cpu;

struct kvm_pmu pmu;

/*

* Anything that is not used directly from assembly code goes

* here.

*/

/*

* Guest registers we preserve during guest debugging.

*

* These shadow registers are updated by the kvm_handle_sys_reg

* trap handler if the guest accesses or updates them while we

* are using guest debug.

*/

struct {

u32 mdscr_el1;

} guest_debug_preserved;

/* vcpu power-off state */

bool power_off;

/* Don't run the guest (internal implementation need) */

bool pause;

/* Cache some mmu pages needed inside spinlock regions */

struct kvm_mmu_memory_cache mmu_page_cache;

/* Target CPU and feature flags */

int target;

DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES);

/* Detect first run of a vcpu */

bool has_run_once;

/* Virtual SError ESR to restore when HCR_EL2.VSE is set */

u64 vsesr_el2;

/* Additional reset state */

struct vcpu_reset_state reset_state;

/* True when deferrable sysregs are loaded on the physical CPU,

* see kvm_vcpu_load_sysregs_vhe and kvm_vcpu_put_sysregs_vhe. */

bool sysregs_loaded_on_cpu;

/* Guest PV state */

struct {

u64 last_steal;

gpa_t base;

} steal;

};

struct kvm_cpu_context {

struct user_pt_regs regs; /* sp = sp_el0 */

u64 spsr_abt;

u64 spsr_und;

u64 spsr_irq;

u64 spsr_fiq;

struct user_fpsimd_state fp_regs;

union {

u64 sys_regs[NR_SYS_REGS];

u32 copro[NR_COPRO_REGS];

};

struct kvm_vcpu *__hyp_running_vcpu;

};

/*

* User structures for general purpose, floating point and debug registers.

*/

struct user_pt_regs {

__u64 regs[31];

__u64 sp;

__u64 pc;

__u64 pstate;

};

struct kvm {

spinlock_t mmu_lock;

struct mutex slots_lock;

struct mm_struct *mm; /* userspace tied to this vm */

struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM];

struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];

/*

* created_vcpus is protected by kvm->lock, and is incremented

* at the beginning of KVM_CREATE_VCPU. online_vcpus is only

* incremented after storing the kvm_vcpu pointer in vcpus,

* and is accessed atomically.

*/

atomic_t online_vcpus;

int created_vcpus;

int last_boosted_vcpu;

struct list_head vm_list;

struct mutex lock;

struct kvm_io_bus __rcu *buses[KVM_NR_BUSES];

#ifdef CONFIG_HAVE_KVM_EVENTFD

struct {

spinlock_t lock;

struct list_head items;

struct list_head resampler_list;

struct mutex resampler_lock;

} irqfds;

struct list_head ioeventfds;

#endif

struct kvm_vm_stat stat;

struct kvm_arch arch;

refcount_t users_count;

#ifdef CONFIG_KVM_MMIO

struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;

spinlock_t ring_lock;

struct list_head coalesced_zones;

#endif

struct mutex irq_lock;

#ifdef CONFIG_HAVE_KVM_IRQCHIP

/*

* Update side is protected by irq_lock.

*/

struct kvm_irq_routing_table __rcu *irq_routing;

#endif

#ifdef CONFIG_HAVE_KVM_IRQFD

struct hlist_head irq_ack_notifier_list;

#endif

#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)

struct mmu_notifier mmu_notifier;

unsigned long mmu_notifier_seq;

long mmu_notifier_count;

#endif

long tlbs_dirty;

struct list_head devices;

u64 manual_dirty_log_protect;

struct dentry *debugfs_dentry;

struct kvm_stat_data **debugfs_stat_data;

struct srcu_struct srcu;

struct srcu_struct irq_srcu;

pid_t userspace_pid;

unsigned int max_halt_poll_ns;

};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值