Resultaten av experimentet med att starta Linux inuti ett virtuellt 3D-utrymme i det flerspelaras online-spelet VRChat, som tillÄter uppladdning av 3D-modeller med egna shaders, har publicerats. För att genomföra den planerade idén skapades en emulator för RISC-V-arkitekturen, som körs pÄ GPU-sidan i form av en pixel (fragment) shader (VRChat stödjer inte berÀkningsshaders och UAV). Koden för emulatorn publicerades under MIT-licensen.
Emulatorn baseras pÄ en implementation i C-sprÄk, som i sin tur anvÀnde arbetet frÄn en minimalistisk emulator, riscv-rust, som utvecklas i Rust. Den förberedda C-koden översÀtts till en pixelshader i HLSL, som kan laddas upp i VRChat. Emulatorn erbjuder fullt stöd för kommandosets-arkitekturen rv32imasu, minneskontrollblock SV32 och ett minimum av perifera enheter (UART och timer). De förberedda funktionerna Àr tillrÀckliga för att ladda kÀrnan Linux 5.13.5 och den grundlÀggande kommandoradsmiljön BusyBox, som kan interageras med direkt frÄn den virtuella vÀrlden VRChat.


Emulatorn Ă€r implementerad i en shader i form av en egen dynamisk textur (Unity Custom Render Texture), kompletterad med skrift Udon som tillhandahĂ„lls för VRChat, som anvĂ€nds för att styra emulatorn under dess körning. InnehĂ„llet i arbetsminnet och tillstĂ„ndet för den emulerade systemprocessorn sparas i form av en textur, som Ă€r 2048Ă2048 pixlar stor. Den emulerade processorn arbetar med en frekvens pĂ„ 250 kHz. Förutom Linux kan Micropython ocksĂ„ köras i emulatorn.

För att organisera permanent datalagring med stöd för lÀsning och skrivning anvÀnds ett trick som involverar anvÀndningen av ett Camera-objekt, kopplat till ett rektangulÀrt omrÄde som genereras av shadern, och riktningen av den ritade texturen till ingÄngen pÄ shadern. PÄ sÄ sÀtt kan varje pixel som skrivs under körningen av pixelshadern lÀsas vid bearbetningen av nÀsta bild.
Vid anvÀndning av pixelshaders körs en separat instans av shadern parallellt för varje pixel i texturen. Denna egenskap komplicerar implementeringen avsevÀrt och krÀver separat koordinering av tillstÄndet för hela emulerade systemet och matchning av positionen för den bearbetade pixeln med det CPU-tillstÄnd som kodas i den eller innehÄllet i RAM-minnet i det emulerade systemet (varje pixel kan koda 128 bit information). Shaderkoden krÀver dÀrmed inkludering av ett enormt antal kontroller, för att förenkla implementeringen anvÀndes en Perl-förprocessor, perlpp.

KĂ€lla: opennet.ru
