2012-06-06 1 views
1

이제 qemu-kvm 및 linux task scheduler.I에 대한 프로젝트를 수행하고 있습니다. 각 VCPU는 Linux OS에 대해 qemu가 생성 한 일반적인 태스크입니다. 그런 다음 qemu 명령을 실행하여 작업 생성 방법을 확인합니다. strace를 사용하여 모든 시스템 호출을 추적합니다. 나누었다 나는이를 보았다 "포크"또는 "pthreadcreate"와 같은 어떠한 일이 없습니다 :qemu-kvm이 VM 스레드를 내부적으로 만드는 방법은 무엇입니까?

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 스레드가 실제로 생성되는 곳이라고 생각한다. 권리? 나는 OS를 처음 접했고 누군가가 나에게 단서를 줄 수 있다면 고맙겠습니다.> 감사합니다.

+0

VM이 스레드가 아닙니다. – duskwuff

+0

@duskwuff 그러나 내가 배운 것에 따르면, KVM에서 VM의 각 VCPU는 호스트 리눅스가 볼 수있는 스레드입니다. –

+0

정확하게는 아닙니다. 각 VCPU는 개별 실행 가능한 개체입니다. KVM ioctls에 대한 자세한 내용은 http://www.mjmwired.net/kernel/Documentation/kvm/api.txt를 참조하십시오. – duskwuff

답변

2

VCPU는 OS 스레드도 프로세스도 아닙니다. VCPU의 작동 방식을 이해하려면 우선 게스트 OS가 Intel VT-x 아키텍처에서 어떻게 실행되고 있는지 알아야합니다.

Intel VT-x은 호스트 VMM과 게스트를 각각 실행하는 두 가지 모드, 즉 VMX root modeVMX non-root mode의 새로운 모드 방법을 제안했습니다. Intel VT-x은 또한 호스트와 게스트 모두의 모든 정보를 저장하는 새로운 구조 인 VMCS을 포함합니다. VMCS은 게스트 당 하나입니다.

KVM은 하드웨어 지원 하이퍼 바이저이며 Intel VT-x을 사용합니다. 호스트 Linux KVM이 VMX root mode에서 실행 중입니다. KVM이 게스트를 실행하기 위해 CPU 모드를 전환하기로 결정하면 KVM은 모든 현재 컨텍스트를 VMCS으로 덤프하고 "VMLAUNCH"명령을 실행합니다. "VMLAUNCH"는 VMX root mode에서 VMX non-root mode으로 CPU를 전송하고 VMCS에서 게스트 컨텍스트를로드 한 다음 게스트 코드를 시작하거나 계속 실행합니다.

요약하면 게스트 코드는 VMX non-root mode의 CPU에서 직접 실행됩니다. VCPU 용 소프트웨어 에뮬레이션 레이어가 필요하지 않습니다. KVM이 더 나은 성능을 제공하는 이유는 게스트 용 특정 스레드가 없기 때문입니다.

/dev/kvm은 QEMU 용 KVM 인터페이스 인 kvm.ko으로 생성됩니다. strace 출력은 QEMU가 KVM과 상호 작용하고 기본 게스트를 제어하는 ​​방법을 보여줍니다. KVM에서 fork 또는 clone 시스템 호출을 찾을 수 없습니다.

자세한 KVM 세부 정보 (VCPU)는 Intel VT-x을 기반으로 한 VCPU 구현 세부 사항은 arch/x86/kvm/vmx.c의 KVM 코드를 읽을 수 있습니다.

1

VCPU가 스레드 또는 프로세스와 다른 OS 개체이고 VCPU 개체가 KVM_CREATE_VCPU ioctl로 생성되는 경우에도 QEMU는 실제로 VCPU 당 스레드를 생성합니다. QEMU가 해당 스레드에서 KVM_RUN을 수행하면 게스트가 실행됩니다 (물리적 CPU는 VMX 비 루트 모드로 전환됩니다). KVM_CREATE_VCPU는 새로운 파일 기술자를 반환하며, 이는 KVM_RUN ioctl에서 볼 수있는 fd입니다.

-ff 옵션을 사용하지 않았기 때문에 strace에서 VCPU 스레드가 누락되었을 수 있습니다. -ff은 strace가 초기 스레드 이외의 다른 스레드도 추적하도록 요청합니다.

+0

strace -ff 옵션에 대해 언급 해 주셔서 감사합니다. #strace 프로세스를 수행하고 모든 포크를 따르십시오. strace -ff -p12345 – kumar

관련 문제