BookinglyTech News
Infraestructura

Qué hace exactamente ioctl(KVM_RUN): el bucle de salida de VM

Desglosamos la llamada que mantiene en marcha las máquinas virtuales de KVM, desde los descriptores de archivo hasta el bucle de salida.

2 min de lecturaDev.to0 vistas

De descriptores de archivo a virtualización

La llamada ioctl(vcpu_fd, KVM_RUN) es el corazón de la virtualización en Linux. Un hilo de QEMU se introduce en esa llamada y no regresa al espacio de usuario hasta que el código invitado obliga a una salida de VM. Para entender por qué es tan relevante, conviene repasar cómo Unix gestiona los recursos abiertos: cada proceso referencia ficheros, sockets o dispositivos mediante un descriptor, un número entero que el kernel asocia a una tabla interna. Los primeros tres descriptores (0,1,2) están siempre reservados para entrada, salida y error estándar.

ioctl, el mecanismo de control universal

Las operaciones estándar read() y write() sirven para mover bytes, pero no para configurar el dispositivo subyacente. Ahí entra ioctl, una llamada genérica que envía comandos arbitrarios al controlador del dispositivo. Con ioctl un programa puede cambiar la velocidad de un puerto serie, expulsar un CD o, en este caso, controlar una máquina virtual. KVM expone su interfaz mediante una escalera de descriptores jerárquicos.

La jerarquía de descriptores en KVM

Primero se abre /dev/kvm y se obtiene un descriptor de VM con KVM_CREATE_VM. Sobre ese descriptor se registra la memoria del invitado con KVM_SET_USER_MEMORY_REGION, delimitando la zona que el sandbox puede direccionar. Después, KVM_CREATE_VCPU crea un hilo de ejecución virtual y devuelve un descriptor de vCPU. Cuando el VMM invoca KVM_RUN sobre ese descriptor, el procesador comienza a ejecutar directamente las instrucciones del huésped.

Qué hace KVM_RUN en la práctica

La peculiaridad de KVM_RUN es que el hilo que lo invoca queda bloqueado dentro de la llamada mientras el invitado se ejecuta sobre el hardware. No hay sondeo: el hilo duerme hasta que sucede una salida de VM, momento en el que la llamada retorna y QEMU interviene para gestionar lo que haya ocurrido. Es una arquitectura elegante que simplifica el desarrollo del hipervisor.

Para profundizar en por qué VirtIO puede ser más rápido que la emulación clásica, en Bittobyte Academy hay un análisis complementario que encaja con este bucle de ejecución.