kvm 中的kvm_run 是如何与qemu中的kvm_run联系到一起

kvm 中的kvm_run 是如何与qemu中的kvm_run联系到一起的

在qemu下面的函数中,完成了 env->kvm_run的映射.

int kvm_init_vcpu(CPUArchState *env)

env->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED,
238                         env->kvm_fd, 0);

下面是kvm 与qemu设备中交互使用的I/O共享页的分析

kvm_run应该就是所谓的I/O共享页的概念 

应该查找kvm_cpu_exec在哪里被利用,应为由程序可以看书来的书kvm_run这个结构对应的数据是可以共享的,qemu在调用函数kvm_cpu_exec以前一定会和内核交互相应关于KVM_RUM的信息 ,在kvm_init_vcpu中有

env->kvm_run=mmap(NULL,mmap_size,PROT_READ|....)这里应该是连接kvm和qemu的IO共享页

这里的mmap应该是利用的是下面结构中的函数:

复制代码
static struct file_operations kvm_vcpu_fops = {
    .release        = kvm_vcpu_release,
    .unlocked_ioctl = kvm_vcpu_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl   = kvm_vcpu_compat_ioctl,
#endif
    .mmap           = kvm_vcpu_mmap,//
    .llseek        = noop_llseek,
};



static int kvm_vcpu_mmap(struct file *file, struct vm_area_struct *vma)
{
    vma->vm_ops = &kvm_vcpu_vm_ops;
    return 0;
}//
复制代码

 在qemu 中的 

kvm_cpu_exec调用kvm_arch_pre_run完成中断等注入,在这个函数中有下面一段代码是关于中断窗口的,这里需要在处理下.

        

if ((env->interrupt_request & CPU_INTERRUPT_HARD)) {
1704             run->request_interrupt_window = 1;
1705         } else {
1706             run->request_interrupt_window = 0;
1707         }

 

       调用run_ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);运行虚拟机

 

举个例子处理io exit的时候.

kvm_cpu_exec 调用函数kvm_handle_io -〉stb_p(ptr, cpu_inb(port));直接向内存共享页写数据。并且是直接写的地址

kvm_handle_io(run->io.port,
1635                          (uint8_t *)run + run->io.data_offset,
1636                          run->io.direction,
1637                          run->io.size,
1638                          run->io.count);
这里的run地址代表的是虚拟地址,这里写的数据实际是调用了stb_p以及其他函数,这个函数的功能是调用该Port对应的设备然后处理得到port的数据,写入到run对应的内存地址中,这里run对应的虚拟地址,映射的物理地址和vcpu中的kvm_run对应的物理地址是一样的.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值