Die Ergebnisse des Experiments zur Organisation des Starts von Linux innerhalb eines virtuellen 3D-Raums eines Mehrspieler-Onlinespiels VRChat wurden veröffentlicht, das das Hochladen von 3D-Modellen mit eigenen Shadern ermöglicht. Zur Umsetzung der vorgesehenen Idee wurde ein RISC-V-Architektur-Emulator erstellt, der auf der GPU als Pixel- (Fragment-)Shader ausgefĂŒhrt wird (VRChat unterstĂŒtzt keine Compute-Shader und UAV). Der Code des Emulators wird unter der MIT-Lizenz veröffentlicht.
Die Grundlage des Emulators bildet eine Implementierung in C, bei deren Erstellung wiederum die Ressourcen des minimalistischen Emulators riscv-rust verwendet wurden, der in Rust entwickelt wird. Der vorbereitete C-Code wird in einen Pixel-Shader in HLSL ĂŒbersetzt, der fĂŒr den Upload in VRChat geeignet ist. Der Emulator bietet vollstĂ€ndige UnterstĂŒtzung fĂŒr die Befehlssatzarchitektur rv32imasu, die Speicherverwaltungseinheit SV32 und einen minimalen Satz von PeripheriegerĂ€ten (UART und Timer). Die vorbereiteten Funktionen sind ausreichend, um den Linux-Kernel 5.13.5 und die grundlegende Befehlszeilenumgebung BusyBox zu laden, mit der man direkt aus der virtuellen Welt von VRChat interagieren kann.


Der Emulator ist als eigene dynamische Textur im Shader implementiert (Unity Custom Render Texture), ergĂ€nzt durch die fĂŒr VRChat bereitgestellten Udon-Skripte, die zur Steuerung des Emulators wĂ€hrend seiner AusfĂŒhrung verwendet werden. Der Inhalt des Arbeitsspeichers und der Zustand der emulierten Systemprozessor werden in Form einer Textur mit einer GröĂe von 2048Ă2048 Pixeln gespeichert. Der emulierte Prozessor arbeitet mit einer Frequenz von 250 kHz. Neben Linux kann im Emulator auch Micropython ausgefĂŒhrt werden.

Um eine dauerhafte Speicherung von Daten mit Lese- und Schreibzugriff zu ermöglichen, wird ein Trick verwendet, der mit dem Einsatz eines Kamerasobjekts verbunden ist, das an einem rechteckigen Bereich, der vom Shader erzeugt wird, und der Ausrichtung der Ausgabetextur auf den Eingang des Shaders gebunden ist. So kann jeder Pixel, der wĂ€hrend der AusfĂŒhrung des Pixel-Shaders geschrieben wird, beim Verarbeiten des nĂ€chsten Frames gelesen werden.
Beim Einsatz von Pixel-Shadern wird fĂŒr jedes Pixel der Textur parallel eine separate Instanz des Shaders gestartet. Diese Eigenschaft erschwert die Implementierung erheblich und erfordert eine separate Koordination des gesamten emulierten Systems sowie eine Zuordnung der Position des bearbeiteten Pixels zu den in ihm codierten ZustĂ€nden der CPU oder dem Inhalt des Arbeitsspeichers des emulierten Systems (jedes Pixel kann 128 Bit Informationen kodieren). Der Shader-Code erfordert dabei eine Vielzahl an PrĂŒfungen, zur Vereinfachung der Implementierung wurde der Perl-PrĂ€prozessor perlpp eingesetzt.

Quelle: opennet.ru
