Ein RISC-V-Emulator in Form eines Pixel-Shaders, mit dem Sie Linux in VRChat ausführen können

Die Ergebnisse eines Experiments zur Organisation des Linux-Starts im virtuellen 3D-Raum des Multiplayer-Onlinespiels VRChat, das das Laden von 3D-Modellen mit eigenen Shadern ermöglicht, wurden veröffentlicht. Um die konzipierte Idee umzusetzen, wurde ein Emulator der RISC-V-Architektur erstellt, der auf der GPU-Seite in Form eines Pixel-(Fragment-)Shaders ausgeführt wird (VRChat unterstützt keine Computational-Shader und UAV). Der Emulatorcode wird unter der MIT-Lizenz veröffentlicht.

Der Emulator basiert auf einer Implementierung in der Sprache C, bei deren Erstellung wiederum die Entwicklungen des minimalistischen Emulators riscv-rust verwendet wurden, der in der Sprache Rust entwickelt wurde. Der vorbereitete C-Code wird in HLSL in einen Pixel-Shader übersetzt, der zum Laden in VRChat geeignet ist. Der Emulator bietet volle Unterstützung für die rv32imasu-Befehlssatzarchitektur, die SV32-Speicherverwaltungseinheit und einen minimalen Satz an Peripheriegeräten (UART und Timer). Die vorbereiteten Fähigkeiten reichen aus, um den Linux-Kernel 5.13.5 und die grundlegende BusyBox-Befehlszeilenumgebung zu laden, mit der Sie direkt aus der virtuellen Welt von VRChat interagieren können.

Ein RISC-V-Emulator in Form eines Pixel-Shaders, mit dem Sie Linux in VRChat ausführen können
Ein RISC-V-Emulator in Form eines Pixel-Shaders, mit dem Sie Linux in VRChat ausführen können

Der Emulator wird im Shader in Form einer eigenen dynamischen Textur (Unity Custom Render Texture) implementiert, ergänzt durch für VRChat bereitgestellte Udon-Skripte, die zur Steuerung des Emulators während seiner Ausführung dienen. Der Inhalt des RAM und der Prozessorzustand des emulierten Systems werden in Form einer Textur mit einer Größe von 2048 x 2048 Pixeln gespeichert. Der emulierte Prozessor arbeitet mit einer Frequenz von 250 kHz. Neben Linux kann der Emulator auch Micropython ausführen.

Ein RISC-V-Emulator in Form eines Pixel-Shaders, mit dem Sie Linux in VRChat ausführen können

Um einen dauerhaften Datenspeicher mit Lese- und Schreibunterstützung zu erstellen, besteht ein Trick darin, ein Kameraobjekt zu verwenden, das an einen vom Shader generierten rechteckigen Bereich gebunden ist, und die Ausgabe der gerenderten Textur an die Shader-Eingabe zu leiten. Auf diese Weise kann jedes während der Pixel-Shader-Ausführung geschriebene Pixel bei der Verarbeitung des nächsten Frames gelesen werden.

Beim Anwenden von Pixel-Shadern wird für jedes Texturpixel parallel eine separate Shader-Instanz gestartet. Diese Funktion verkompliziert die Implementierung erheblich und erfordert eine separate Koordinierung des Zustands des gesamten emulierten Systems und einen Vergleich der Position des verarbeiteten Pixels mit dem darin kodierten CPU-Zustand oder dem Inhalt des RAM des emulierten Systems (jedes Pixel kann 128 kodieren). Informationshäppchen). Der Shader-Code erfordert die Einbeziehung einer großen Anzahl von Prüfungen, um deren Implementierung zu vereinfachen, wurde der Perl-Präprozessor Perlpp verwendet.



Source: opennet.ru

Kommentar hinzufügen