arm timer 模拟
(这个问题有趣的)
arm 的 host 中, cat /proc/interrupts 可以看到:
10: 0 0 GICv3 30 Level kvm guest ptimer
11: 64526 53692 GICv3 27 Level kvm guest vtimer
结合 arch/arm64/kvm/arch_timer.c 分析其大致 arm 架构下是如何实现 timer 的模拟的
真的会注册一个:
err = request_percpu_irq(host_vtimer_irq, kvm_arch_timer_handler,
"kvm guest vtimer", kvm_get_running_vcpus());
err = request_percpu_irq(host_ptimer_irq, kvm_arch_timer_handler,
"kvm guest ptimer", kvm_get_running_vcpus());
也就是专门有硬件支持,不过不知道为什么 kvm_arch_timer_handler 的 backtrace 找不到, 相同的环境测试普通的中断是没有问题的:
@[
nvme_irq+0
handle_irq_event+76
handle_fasteoi_irq+180
handle_irq_desc+60
generic_handle_domain_irq+36
__gic_handle_irq_from_irqson.isra.0+340
gic_handle_irq+40
call_on_irq_stack+48
do_interrupt_handler+136
el1_interrupt+68
el1h_64_irq_handler+24
el1h_64_irq+128
default_idle_call+56
cpuidle_idle_call+380
do_idle+244
cpu_startup_entry+64
secondary_start_kernel+224
__secondary_switched+192
]: 29
arm 也可以使用 linux 的 hrtimer 来模拟 guest os 中的时钟:
struct arch_timer_context {
struct kvm_vcpu *vcpu;
/* Emulated Timer (may be unused) */
struct hrtimer hrtimer;
timer_chip 中为什么会注册了 irq_set_vcpu_affinity ,难道这个东西不是用于透传设备的 posted interrupt 吗?
那么,也就说,中断也是可以做 posted 注入的?
static struct irq_chip timer_chip = {
.name = "KVM",
.irq_ack = timer_irq_ack,
.irq_mask = irq_chip_mask_parent,
.irq_unmask = irq_chip_unmask_parent,
.irq_eoi = timer_irq_eoi,
.irq_set_type = irq_chip_set_type_parent,
.irq_set_vcpu_affinity = timer_irq_set_vcpu_affinity,
.irq_set_irqchip_state = timer_irq_set_irqchip_state,
};
本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。