Au fost publicate rezultatele experimentului privind organizarea lansării Linux în interiorul unui spațiu 3D virtual din jocul online multiplayer VRChat, care permite încărcarea de modele 3D cu propriile șabloane. Pentru realizarea ideii propuse, a fost creat un emulator al arhitecturii RISC-V, care rulează pe GPU sub formă de shader pixel (VRChat nu suportă shaderi computaționali și UAV). Codul emulatorului a fost publicat sub licența MIT.
Emulatorul se bazează pe o implementare în limbajul C, care a utilizat la rândul său dezvoltările unui emulator minimalist riscv-rust, dezvoltat în limbajul Rust. Codul C pregătit este transformat într-un shader pixel în limbajul HLSL, potrivit pentru încărcarea în VRChat. Emulatorul oferă suport complet pentru arhitectura setului de instrucțiuni rv32imasu, blocul de control al memoriei SV32 și un set minim de periferice (UART și temporizator). Funcționalitățile pregătite sunt suficiente pentru încărcarea nucleului Linux 5.13.5 și a mediului de linie de comandă BusyBox, cu care se poate interacționa direct din lumea virtuală VRChat.


Emulatorul este realizat în shader sub formă de textura dinamică proprie (Unity Custom Render Texture), completată cu scripturile Udon furnizate pentru VRChat, utilizate pentru gestionarea emulatorului în timpul execuției. Conținutul memoriei operabile și starea procesorului sistemului emulat sunt salvate sub formă de textură, cu dimensiunea de 2048×2048 pixeli. Procesorul emulat funcționează la o frecvență de 250 kHz. Pe lângă Linux, în emulator poate fi rulat și Micropython.

Pentru a organiza stocarea permanentă a datelor cu suport pentru citire și scriere, este utilizat un truc legat de utilizarea unui obiect Camera, legat de o zonă dreptunghiulară generată de shader și direcția de ieșire a texturii desenate către intrarea shaderului. Astfel, orice pixel scris în procesul de execuție a shaderului pixel poate fi citit la procesarea cadrului următor.
Când se aplică shaderi pe pixel pentru fiecare pixel al texturii, se lansează simultan o instanță separată a shader-ului. Această caracteristică complică semnificativ implementarea și necesită o coordonare separată a stării întregului sistem emulator și o asociere a poziției pixelului procesat cu starea CPU sau conținutul RAM-ului sistemului emulator (fiecare pixel poate codifica 128 de biți de informație). Codul shader-ului necesită, de asemenea, includerea unui număr imens de verificări, pentru simplificarea implementării căruia a fost utilizat preprocessatorul Perl perlpp.

Sursa: opennet.ro
