内存区域MemoryRegion中的ioeventfds成员按照地址从小到大排序,memory_region_add_eventfd函数会选择合适的位置将ioeventfds插入,并提交更新; 提交更新过程中最终触发回调函数kvm_mem_ioeventfd_add的执行,这个函数指针的初始化是在Qemu进行kvm_init时,针对不同类型的内存区域注册了对应的memory_listener用于监听变化; kvm...
的东西,QEMU可以将虚拟机特定地址关联一个eventfd,对该eventfd进行POLL,并利用ioctl(KVM_IOEVENTFD)向KVM注册这段特定地址,当Guest进行IO操作exit到kvm后,kvm可以判断本次exit是否发生在这段特定地址中,如果是,则直接调用eventfd_signal发送信号到对应的eventfd,导致QEMU的监听循环返回,触发具体的操作函数,进行普通IO操作...
kvm_set_irq函数的入参有5个,kvm代表某个特性的的虚拟机,irq_source_id可以是KVM_USERSPACE_IRQ_SOURCE_ID或者KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID(这个是irqfd这个我们这里不讨论),irq是传入的设备irq号,对于串口来说第一个port的irq=4而且irq=gsi,level代表电平。kvm_irq_map函数会获取改gsi索引上注册的中断路...
KVM ioeventfd support patch:http://git.kernel.org/linus/d34e6b175e61821026893ec5298cc8e7558df43a irqfd irqfd is a mechanism to inject a specific interrupt to a guest using a decoupled eventfd mechanism: Any legal signal on the irqfd (using eventfd semantics from either userspace or kernel)...
eventfd和irqfd这两种机制,都是基于eventfd来实现的; 本文会先介绍eventfd机制,然后再分别从Qemu/KVM来介绍ioeventfd和irqfd,开始吧。 2. eventfd 说来很巧,我曾经在工作中实现过一个类似eventfd机制的内核模块,用于多线程之间的轻量级通知,算是重复造轮子了。
KVM中注册ioeventfd的核心函数为kvm_assign_ioeventfd_idx,该函数中主要工作包括: 1)根据用户空间传递过来的fd获取到内核中对应的struct eventfd_ctx结构体上下文;2)使用ioeventfd_ops操作函数集来初始化IO设备操作;3)向KVM注册IO总线,比如KVM_MMIO_BUS,注册了一段IO地址区域,当操作这段区域的时候出发对应的操作函数...
KVM ioeventfd support patch:http://git.kernel.org/linus/d34e6b175e61821026893ec5298cc8e7558df43a irqfd irqfd is a mechanism to inject a specific interrupt to a guest using a decoupled eventfd mechanism: Any legal signal on the irqfd (using eventfd semantics from either userspace or kernel)...
KVM中注册ioeventfd的核心函数为kvm_assign_ioeventfd_idx,该函数中主要工作包括: 1)根据用户空间传递过来的fd获取到内核中对应的struct eventfd_ctx结构体上下文;2)使用ioeventfd_ops操作函数集来初始化IO设备操作;3)向KVM注册IO总线,比如KVM_MMIO_BUS,注册了一段IO地址区域,当操作这段区域的时候出发对应的操作函数...