KVM использует qemu в качестве симулятора устройства, любая операция устройства моделируется программой QEMU в пользовательском пространстве.Когда вы пишете в 0xB8000, работает графический дисплей, который подразумевает, что гость выполняет CPU vmexit из гостевого режима и возвращается в модуль KVM, который, в свою очередь, отправляет запросы на моделирование устройства в бэкэнд QEMU пользовательского пространства.
В отличие от этого, QEMU без KVM выполняет все задания в унифицированном процессе, за исключением обычных системных вызовов, меньше переключений контекста ЦП.Между тем, ваш эталонный код представляет собой простой цикл, который требует code block translation
только один раз.Это ничего не стоит по сравнению с vmexit
и взаимодействием между ядром и пользователем каждой итерации в случае KVM.
Это должно быть наиболее вероятной причиной.