现在我正在做一个关于qemu-kvm和linux任务调度器的项目,我知道每个VCPU都是由qemu为linux操作系统创建的一个普通任务。然后,我尝试执行qemu命令来查看任务是如何创建的。我使用strace来跟踪所有的系统调用。我没见过像"fork“或”pthreadcreate“这样的.But:
open("/dev/kvm", O_RDWR|O_LARGEFILE) = 3
ioctl(3, KVM_GET_API_VERSION, 0) = 12
ioctl(3, KVM_CHECK_EXTENSION, 0x19) = 0
ioctl(3, KVM_CREATE_VM, 0) = 4
ioctl(3, KVM_CHECK_EXTENSION, 0x4) = 1
ioctl(3, KVM_CHECK_EXTENSION, 0x4) = 1
ioctl(4, KVM_SET_TSS_ADDR, 0xfffbd000) = 0
ioctl(3, KVM_CHECK_EXTENSION, 0x25) = 0
ioctl(3, KVM_CHECK_EXTENSION, 0xb) = 1
ioctl(4, KVM_CREATE_PIT, 0xb) = 0
ioctl(3, KVM_CHECK_EXTENSION, 0xf) = 2
ioctl(3, KVM_CHECK_EXTENSION, 0x3) = 1
ioctl(3, KVM_CHECK_EXTENSION, 0) = 1
ioctl(4, KVM_CREATE_IRQCHIP, 0) = 0
ioctl(3, KVM_CHECK_EXTENSION, 0x1a) = 0所以看起来它打开了设备/dev/kvm并执行了一些ioctl syscall。我相信这是实际创建VM线程的地方。对吗?我是操作系统的新手,如果有人能给我一些clue:>,我将不胜感激
发布于 2013-09-03 23:05:29
VCPU既不是操作系统线程,也不是进程。要了解VCPU是如何工作的,我们首先应该弄清楚来宾操作系统是如何在Intel VT-x架构上运行的。
Intel VT-x提出了两种模式:VMX root mode和VMX non-root mode,分别用于运行主机虚拟机模型和来宾虚拟机。Intel VT-x还包含一个新的结构:VMCS,它保存了主机和来宾所需的所有信息。VMCS为每位客人提供一份。
KVM是一个硬件辅助的虚拟机管理程序,它利用Intel VT-x。主机Linux KVM在VMX root mode中运行。当KVM决定切换CPU模式来运行客户机时,KVM会将所有当前上下文转储到VMCS,并执行"VMLAUNCH“指令。"VMLAUNCH“将CPU从VMX root mode转移到VMX non-root mode,并从VMCS加载来宾上下文,然后开始或继续执行来宾代码。
总之,来宾代码直接在VMX non-root mode中的CPU上运行。不需要VCPU的软件模拟层。这就是为什么KVM具有更好的性能,并且没有特定的来宾线程。
/dev/kvm是由kvm.ko创建的,它只是QEMU的一个KVM接口。您的strace输出显示了QEMU如何与KVM交互并控制底层客户机。在KVM中永远找不到fork或clone系统调用。
有关KVM的更多细节,特别是VCPU,您可以阅读arch/x86/kvm/vmx.c中的KVM代码,了解更多基于Intel VT-x的VCPU实现细节。
发布于 2014-01-29 01:04:55
尽管VCPU是不同于线程或进程的操作系统对象,并且VCPU对象是使用QEMU创建的,但KVM_CREATE_VCPU确实为每个VCPU创建了一个线程。当QEMU从该线程执行KVM_RUN时,来宾操作系统运行(物理CPU进入VMX非根模式)。KVM_CREATE_VCPU返回一个新的文件描述符,这就是您将在KVM_RUN ioctl中看到的fd。
您的strace中可能缺少vCPU线程,因为您未使用-ff选项。-ff要求strace还跟踪除初始线程之外的其他线程。
https://stackoverflow.com/questions/10922475
复制相似问题