设为首页收藏本站language 语言切换
查看: 1836|回复: 0
收起左侧

[分享] 在AMD平台上实现KVM虚拟化技术 (24)

[复制链接]
发表于 2012-10-30 15:27:14 | 显示全部楼层 |阅读模式
针对 qemu-kvm 用户空间而言,最重要的工作是仿真设备的 MMIO 内存和 PIO 端口。
设备的 MMIO 内存可实现成三种方式linux :
a. “physical_memory”。这种方式所仿真的 MMIO 和虚拟机的 RAM 是一样的,即和 RAM 一样由 KVM 进行缺页处理并分配物理页, 后续的读写不用截取,这种方式经常用于 VGA 设备, 也可用于那种读写以后不需要同步通知 qemu-kvm 后端或用其他方式通知 qemu-kvm 后端的 MMIO 区域。
b. “io_memory”。 这种方式所仿真的 MMIO 会被 KVM 内核截取,执行路径会跳出 KVM 内核而回到用户空间,由 qemu-kvm 来完成 MMIO 读写的仿真。 这种方式下,一般不同类型的设备都提供了自己特定的linux read/write 函数。 为支持这种方式,KVM 内核中代表每个 VCPU struct kvm_run 区域被 mmap 到了用户空间,qemu-kvm 进程可根据 struct kvm_run 中的信息知道当前需要仿真的 MMIO 读写操作涉及的地址和尺寸。
c. “coalesced_memory”。这种方式所仿真的 MMIO 会被 KVM 内核截取,但 KVM 并不会立即跳出到 qemu-kvm 用户空间,KVM 将需要仿真的读写操作形成一个记录 (structkvm_coalesced_mmio), 放在在代表整个 VM 的 struct kvm 所指向的一个环形缓冲区中 (struct kvm_coalesced_mmio_ring),这个环形缓冲区被linux mmap 到了用户空间。 当下一次代表某个 VCPU qemu-kvm 线程返回到用户空间后,就会对环形缓冲区中的记录进行处理,执行MMIO 读写仿真。 也就是说,对于 “coalesced_memory” 方式, qemu-kvm 一次仿真的可能是已经被积累起来的多个 MMIO 读写操作,显然这种方式是一种性能优化,它适合于对响应时间要求不是很严格的 MMIO 写操作。
PIO的仿真更简单。所有的 PIO 都会被 KVM 所截取,不能在内核处理的 PIO 使 KVM 跳出到qemu-kvm 用户空间, 由 qemu-kvm 来完成PIO 读写的仿真。 Qemu-kvm 同样是根据用户空间已经mmap 了的每个 struct kvm_vcpu 的struct kvm_run 区域以及 pid_data 区域知道需要仿真的 PIO 读写操作涉及的端口地址、尺寸及数据linux
当然 Qemu-kvm 设备仿真要做的更大量工作是在逻辑层,如对于网络设备,需要考虑仿真的网络包怎样经过 Host 的网络进行发送和接收, 桥接的还是 NAT 的; 对于块设备,需要考虑客操作系统写过来的磁盘块以怎样的方式组织到设备 Image 文件中, Qcow2 或QED 的选择; 对于 VGA 设备,需要实现怎样把图像缓冲区中的内容通过远程表现处理,VNC 或 SPICE 等。 设备逻辑层所需要做的工作应该是目前开发空间比较大的地方,这部分和 KVM 虚拟化的基本机制没太大关系。

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-3-11 03:37 , Processed in 0.565745 second(s), 22 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表