Комментарии 9
Интересно, а как происходит эмуляция устройств, допустим, в qemu? Не проброс, а именно программная реализация тех устройств, которых нет. Qemu ведь обычный процесс. Как он перехватывает обращение по PCI к какому-нибудь Ethernet адаптеру?
Если поверхностно, то аналогично приведённому примеру с io. При обращении к регистрам pci устройства, kvm возвращает vmexit с необходимой и достаточной информацией для понимания, что и куда гость хотел записать или считать. Соответсвенно, Qemu вызывает функции которые имплементируют эмулируемое устройство. Прерывания же, наоборот можно инжектировать, например по приходу пакета в /dev/tapN. Если вам интересно узнать более подробно эту тему, то поищите в гугле: ‘hypervisor from scratch’. Там в топе выдачи вполне годные статьи с отсылками в интеловские мануалы и т.д.
case KVM_EXIT_IO: printf("IO port: %x, data: %x\n", run->io.port, *(int *)((char *)(run) + run->io.data_offset)); break;
В переводе и оригинале искусственной задержки нет.
Однако она есть в py- коде и github'е:
case KVM_EXIT_IO:
printf("IO port: %x, data: %x\n", run->io.port,
*(int *)((char *)(run) + run->io.data_offset));
sleep(1);
break;
Без нее совсем тяжко? Полная загрузка одного ядра?
Действительно вставили задержку в py-код. Решили, что так будет нагляднее, иначе слишком много вывода и он очень быстро идет.
И на второй Ваш вопрос: да, съедается всё ядро.
Хост KVM в паре строчек кода. Примеры на C++ и на Python от эксперта Timeweb