Io与中断

来源:互联网 发布:淘宝app限时抢购在那 编辑:程序博客网 时间:2024/04/30 03:05

I/O

客户机退出后回调用vmx_handle_exit() 这里应该是处理的IO请求或者其他

 

 

基本的函数调用过程:

kvm_vcpu_ioctl->kvm_arch_vcpu_ioctl_run(vcpu, vcpu->runkvm_arch_vcpu_ioctl_run(vcpu, vcpu->run)->__vcpu_run(vcpu)->vcpu_enter_guest(vcpu)->

----------kvm_x86_ops->run(vcpu)(vmx_vcpu_run){这个函数完成的是真正的开启VCPU,该函数返回时代表的是VCPU EXIT ,实际在__vmx_complete_interrupts实际在__vmx_complete_interrupts调用前VCPU已经退出了}

----------kvm_x86_ops->handle_exit(vcpu)( 已IO指令出错为例子)-> vmx_handle_exit{kvm_vmx_exit_handlers[exit_reason](vcpu);}->handle_io->kvm_fast_pio_out->emulator_pio_in_out(这里实际完成的是填充相应的结构体字段)

{

复制代码
vcpu->run->exit_reason = KVM_EXIT_IO;    vcpu->run->io.direction = in ? KVM_EXIT_IO_IN : KVM_EXIT_IO_OUT;    vcpu->run->io.size = size;    vcpu->run->io.data_offset = KVM_PIO_PAGE_OFFSET * PAGE_SIZE;    vcpu->run->io.count = count;    vcpu->run->io.port = port;
复制代码

}

实际是直接返回到了qemu中文件kvm_all.c中

kvm_cpu_exec-〉kvm_handle_io下一步需要搞明白的是, 返回了需要qemu模拟的指令,但是数据传输时怎样进行的,也就是搞明白了,kvm传出来的地址是什么地址是虚拟地址还是物理地址,而qemu是如何得到往这些地址里写入数据的?这个问题在下面的内容中有解释了这里通过论文看到了一个IO共享页的概念
 

" 使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序。QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回到I/O共享页,并通知KVM模块中的I/O操作捕获代码。最后,由KVM模块中的捕获代码读取I/O共享页中的操作结果,并把结果返回到客户机中。当然,这个操作过程中客户机作为一个QEMU进程在等待I/O时也可能被阻塞。另外,当客户机通过DMA(Direct Memory Access)访问大块I/O之时,QEMU模拟程序将不会把操作结果放到I/O共享页中,而是通过内存映射的方式将结果直接写到客户机的内存中去,然后通过KVM模块告诉客户机DMA操作已经完成。"

0 0
原创粉丝点击