Een RISC-V-emulator in de vorm van een pixel shader waarmee je Linux in VRChat kunt draaien

De resultaten van een experiment over het organiseren van de lancering van Linux binnen de virtuele 3D-ruimte van de online multiplayer-game VRChat, waarmee 3D-modellen met hun eigen shaders kunnen worden geladen, zijn gepubliceerd. Om het bedachte idee te implementeren, werd een emulator van de RISC-V-architectuur gemaakt, uitgevoerd aan de GPU-kant in de vorm van een pixel (fragment) shader (VRChat ondersteunt geen computationele shaders en UAV). De emulatorcode wordt gepubliceerd onder de MIT-licentie.

De emulator is gebaseerd op een implementatie in de C-taal, waarvan de creatie op zijn beurt gebruik maakte van de ontwikkelingen van de minimalistische emulator riscv-rust, ontwikkeld in de Rust-taal. De voorbereide C-code wordt in HLSL vertaald naar een pixelshader, geschikt om in VRChat te laden. De emulator biedt volledige ondersteuning voor de rv32imasu-instructiesetarchitectuur, de SV32-geheugenbeheereenheid en een minimale set randapparatuur (UART en timer). De voorbereide mogelijkheden zijn voldoende om de Linux-kernel 5.13.5 en de standaard BusyBox-opdrachtregelomgeving te laden, waarmee u rechtstreeks vanuit de virtuele VRChat-wereld kunt communiceren.

Een RISC-V-emulator in de vorm van een pixel shader waarmee je Linux in VRChat kunt draaien
Een RISC-V-emulator in de vorm van een pixel shader waarmee je Linux in VRChat kunt draaien

De emulator is geïmplementeerd in de shader in de vorm van zijn eigen dynamische textuur (Unity Custom Render Texture), aangevuld met Udon-scripts voor VRChat, die worden gebruikt om de emulator te besturen tijdens de uitvoering ervan. De inhoud van het RAM-geheugen en de processorstatus van het geëmuleerde systeem worden opgeslagen in de vorm van een textuur van 2048x2048 pixels groot. De geëmuleerde processor werkt op een frequentie van 250 kHz. Naast Linux kan de emulator ook Micropython draaien.

Een RISC-V-emulator in de vorm van een pixel shader waarmee je Linux in VRChat kunt draaien

Om permanente gegevensopslag te creëren met ondersteuning voor lezen en schrijven, is het een truc om een ​​Camera-object te gebruiken dat is gebonden aan een rechthoekig gebied dat door de arcering wordt gegenereerd en de uitvoer van de weergegeven textuur naar de arceringsinvoer te sturen. Op deze manier kan elke pixel die tijdens de uitvoering van de pixel shader wordt geschreven, worden gelezen wanneer het volgende frame wordt verwerkt.

Bij het toepassen van pixel shaders wordt voor elke textuurpixel een aparte shader-instantie parallel gestart. Deze functie compliceert de implementatie aanzienlijk en vereist afzonderlijke coördinatie van de status van het gehele geëmuleerde systeem en vergelijking van de positie van de verwerkte pixel met de daarin gecodeerde CPU-status of de inhoud van het RAM van het geëmuleerde systeem (elke pixel kan 128 pixels coderen). stukjes informatie). De shadercode vereist de opname van een groot aantal controles, om de implementatie te vereenvoudigen, waarbij de perl-preprocessor perlpp werd gebruikt.



Bron: opennet.ru

Voeg een reactie