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操作已经完成。"
- Io与中断
- 学习通用IO与外部中断
- 中断/IO/DMA
- 中断/IO/DMA
- STM8S IO外部中断
- 多线程IO阻塞中断
- 通用IO的中断
- 中断 与 中断 或
- 中断与中断系统
- 外部IO中断和IPI中断
- MSP430 LaunchPad IO外部中断
- stm8 红外解码 使用TL IO中断与定时实现(芯片用103)
- 关于STM8中断与主函数调用同组IO所出现的问题
- stm8 红外解码 使用TL IO中断与定时实现(芯片用103)
- 中断号与中断地址
- 外部中断与内部中断
- 软中断与硬中断
- 软中断与硬中断
- C/C++获取时间方法:gettimeofday()
- spin_lock与spin_lock_irqsaveq区别
- 省选归来
- 帧锁定算法解决游戏同步
- [Android实例] DownloadManager的使用
- Io与中断
- poj 1003
- Android学习之监听按钮点击事件
- java开发环境搭建
- 编辑器界面库选择
- oracle_SQL中ROWID与ROWNUM的使用
- JavaScript HTML DOM学习笔记(一)------摘自w3school
- 无路由权限情况下iis+花生壳发布
- 如何在 Eclipse 中显示代码的行号