本文讲述一个网络数据包从到达物理网卡,一直到中断注入给VM的整个过程。
为了讲述清晰,假设宿主物理机有两个物理CPU,分别为CPU0和CPU1。假设GuestOS运行在CPU1上,物理网卡接到数据包后把中断请求发送到CPU0.
1.网络数据包Package到达物理网卡NIC, NIC收到数据包后,向CPU0发送中断请求,通知CPU0有网络数据包到达。
2.CPU0收到中断请求后,调用中断处理函数,处理这个中断请求。但是,这个数据包可能是发给VM的,所以这里Host不会直接调用Host的中断处理函数,而是会调用QEMU中实现的Bridge(Brigde就是一个网桥)。Bridge会把请求再转发给QEMU模拟的TAP设备。
3.TAP设备会进行判断这个请求是发给谁的,如果是发给Host的,则直接调用Host的中断处理函数;如果是发给VM的,那么就会TAP就会调用一系列函数,比如select,知道调用到kvm_vm_ioctl(, KVM_IRQ_LINE_STATUS,)。到此为止,QEMU模拟结束,开始进入KVM执行。
4.kvm_set_irq() (irqchip.c)函数说明
int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,bool line_status){
...
if (irq < irq_rt->nr_rt_entries)
/*提取中断路由表中对应的中断路由实体,map[i
QEMU与KVM的中断处理流程解析

本文详细阐述了网络数据包从到达物理网卡直至中断注入虚拟机(VM)的整个过程。首先,物理网卡向CPU0发送中断请求,接着QEMU的Bridge将请求转发至TAP设备,若数据包是发给VM的,TAP设备会通过KVM将中断注入到LAPIC,并最终由vcpu的中断处理函数处理。过程中涉及的关键函数包括kvm_set_irq()、ioapic_service()、kvm_irq_delivery_to_apic()等,这些函数协调完成中断请求的传递和处理。
最低0.47元/天 解锁文章
822

被折叠的 条评论
为什么被折叠?



