Hace ya varios dias se dieron a conocer los resultados de un experimento de organización basado en el lanzamiento del Kernel de Linux dentro del espacio virtual 3D de un juego multijugador online.
Este experimento se realizó sobre VRChat el cual que permite cargar modelos 3D con sus propios shaders. Para implementar la idea concebida, se creó un emulador basado en la arquitectura RISC-V el cual es ejecutado en el lado de la GPU en forma de un sombreador de píxeles.
Sobre el proyecto
El emulador se basa en la implementación en el lenguaje C, cuya creación, a su vez, utilizó los desarrollos del emulador minimalista riscv-rust el cual por su parte es desarrollado en el lenguaje Rust. El código C preparado se traduce a un sombreador de píxeles en el lenguaje HLSL, adecuado para cargar en VRChat.
El emulador proporciona soporte completo para la arquitectura del conjunto de instrucciones rv32imasu, la unidad de control de memoria SV32 y un conjunto mínimo de periféricos (UART y temporizador). Las capacidades preparadas son suficientes para cargar el kernel de Linux 5.13.5 y el entorno de línea de comandos básico de BusyBox, con el que puede interactuar directamente desde el mundo virtual de VRChat.
Alrededor de marzo de 2021, decidí escribir un emulador capaz de ejecutar un Kernel Linux completo en VRChat. Debido a las limitaciones inherentes de esa plataforma, la herramienta elegida tenía que ser un sombreador. Y después de unos meses de trabajo, ahora estoy orgulloso de presentar el primer emulador de CPU / SoC RISC-V del mundo (que yo sepa) en un sombreador de píxeles HLSL, capaz de ejecutar hasta 250 kHz (en un 2080 Ti ) y arrancar Linux 5.13.5 con soporte MMU.
El emulador se implementa en el sombreador en forma de su propia textura dinámica (Unity Custom Render Texture), complementada por los scripts Udon proporcionados para VRChat, que se utilizan para controlar el emulador en tiempo de ejecución.
El contenido de la memoria principal y el estado del procesador del sistema emulado se guardan en forma de textura con un tamaño de 2048×2048 píxeles, con lo cual el procesador emulado funciona a 250 kHz. Además de Linux, Micropython también se puede ejecutar en el emulador.
Para ejecutar Linux, pensé que necesitaríamos al menos 32 MiB de memoria principal (RAM), pero seamos seguros y hagamos 64: la diferencia de rendimiento no será grande y debería haber suficiente VRAM.
Al principio, la principal preocupación sobre el rendimiento era la velocidad del reloj . Es decir, cuántos ciclos de CPU se pueden ejecutar en un cuadro.
Para organizar el almacenamiento de datos persistentes con soporte para lectura y escritura, se usa un truco relacionado con el uso de un objeto Camera vinculado a un área rectangular generada por el sombreador y dirigiendo la salida de la textura renderizada a la entrada del sombreador. Por lo tanto, cualquier píxel escrito durante la ejecución de un sombreador de píxeles se puede leer al procesar el siguiente fotograma.
Cuando se aplican sombreadores de píxeles, se lanza una instancia separada del sombreador en paralelo para cada píxel de la textura.
Esta característica complica significativamente la implementación y requiere una coordinación separada del estado de todo el sistema emulado y la comparación de la posición del píxel procesado con el estado de la CPU o el contenido de la RAM del sistema emulado codificado en él (cada píxel puede codificar 128 bits de información).
En este caso, el código de sombreado requiere la inclusión de una gran cantidad de comprobaciones, para simplificar la implementación de la cual se utilizó el preprocesador perl perlpp.
Para quienes estén interesados en las especificaciones se menciona que:
- el código está en GitHub
- 64 MiB de RAM menos el estado de la CPU se almacenan en una textura de formato entero de 2048×2048 píxeles (128 bpp)
- La textura de renderizado personalizada de Unity con intercambio de búfer permite el estado de codificación / decodificación entre cuadros
- se utiliza un sombreador de píxeles para la emulación, ya que los sombreadores de cálculo y UAV no son compatibles con VRChat
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.