Использование KVM API в C: как включить KVM_CAP_SYNC_MMU? - PullRequest
1 голос
/ 04 мая 2020

Я хотел бы узнать больше о KVM, поэтому я начал писать свой очень примитивный и грубый «эмулятор P C» на C с использованием KVM API на Linux (x86_64). Однако я столкнулся с проблемой. Я использую код операции HLT в качестве «ловушки» для выхода из запуска kvm, поэтому я могу эмулировать там, что хочу, даже изменяя пространство памяти виртуальной машины, которое я mmap () редактировал. Затем я обнаружил, что изменения, внесенные в область памяти, назначенную виртуальной машине, «не видны» «гостем» внутри виртуальной машины. Насколько я понимаю, мне понадобится KVM_CAP_SYNC_MMU.

Здесь проблема в том, что я не могу найти примеры на net, как это сделать. По методике проб и ошибок я нашел решение:

kvm.kvm_run = mmap(NULL, vcpu_mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, kvm.vcpu_fd, 0);
if (kvm.kvm_run == MAP_FAILED) {
    perror("KVM: mmap kvm_run");
    return -1;
}          
struct kvm_enable_cap caps;
memset(&caps, 0, sizeof(caps));
caps.cap = KVM_CAP_SYNC_MMU;
if (ioctl(kvm.vcpu_fd, KVM_ENABLE_CAP, &caps) < 0)
    perror("KVM: KVM_ENABLE_CAP");
    return -1;
}

Однако это всегда дает мне: KVM: KVM_ENABLE_CAP: Invalid argument. Без этого KVM_ENABLE_CAP все работает (до такой степени, что ошибки нет), однако весь мой проект бессмысленен, так как гость не может видеть изменения, которые я делаю в HLT "обработчике ловушек". Кто-нибудь знает, какая у меня ошибка?

...