【发布时间】:2012-06-06 21:19:08
【问题描述】:
现在我正在做一个关于 qemu-kvm 和 linux 任务调度程序的项目。我知道每个 VCPU 都是由 qemu 创建到 linux 操作系统的正常任务。然后我尝试执行 qemu 命令,看看任务是如何创建的。我使用 strace 来跟踪所有的系统调用。没有“fork”或“pthreadcreate”之类的东西。但我已经看到了:
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 系统调用。我相信这是实际创建 VM 线程的地方。对?我是操作系统的新手,如果有人能给我一些线索,我将不胜感激:>谢谢
【问题讨论】:
-
@duskwuff 但是据我所知,在 KVM 中,VM 中的每个 VCPU 都是主机 linux 看到的一个线程
-
不完全是。每个 VCPU 只是一个单独的可运行对象。有关 KVM ioctls 的详细信息,请参阅mjmwired.net/kernel/Documentation/kvm/api.txt。
-
@duskwuff 嗨。我已经检查了文档。它真的很有帮助。谢谢。我看到有一个 ioctl(KVM_RUN) 调用。我想也许这就是启动 vcpu 进程的调用。然后我跟踪了 qemu 和 kvm 源代码。我已经看到这个调用将调用另一个名为 kvm_arch_vcpu_ioctl_run 的函数,该函数将根据不同的架构而有所不同。但我仍然找不到像 fork() 这样的系统调用。通常我想在代码中找到 qemu-kvm 何时为新的 vcpu 分叉一个线程:>
-
你为什么期待一个 fork() 系统调用? pthread_create() 不使用 fork()。你跟踪 clone() 系统调用了吗?