Un emulatore RISC-V sotto forma di pixel shader che ti consente di eseguire Linux in VRChat

Sono stati pubblicati i risultati di un esperimento sull'organizzazione del lancio di Linux nello spazio virtuale 3D del gioco online multiplayer VRChat, che consente di caricare modelli 3D con i propri shader. Per implementare l'idea concepita, Γ¨ stato creato un emulatore dell'architettura RISC-V, eseguito lato GPU sotto forma di pixel shader (frammento) (VRChat non supporta shader computazionali e UAV). Il codice dell'emulatore Γ¨ pubblicato sotto licenza MIT.

L'emulatore si basa su un'implementazione nel linguaggio C, la cui creazione, a sua volta, ha utilizzato gli sviluppi dell'emulatore minimalista riscv-rust, sviluppato nel linguaggio Rust. Il codice C preparato viene tradotto in un pixel shader in HLSL, adatto per il caricamento in VRChat. L'emulatore fornisce il supporto completo per l'architettura del set di istruzioni rv32imasu, l'unitΓ  di gestione della memoria SV32 e un set minimo di periferiche (UART e timer). Le funzionalitΓ  predisposte sono sufficienti per caricare il kernel Linux 5.13.5 e l'ambiente base a riga di comando BusyBox, con il quale puoi interagire direttamente dal mondo virtuale VRChat.

Un emulatore RISC-V sotto forma di pixel shader che ti consente di eseguire Linux in VRChat
Un emulatore RISC-V sotto forma di pixel shader che ti consente di eseguire Linux in VRChat

L'emulatore Γ¨ implementato nello shader sotto forma di una propria texture dinamica (Unity Custom Render Texture), integrata dagli script Udon forniti per VRChat, utilizzati per controllare l'emulatore durante la sua esecuzione. Il contenuto della RAM e lo stato del processore del sistema emulato sono memorizzati sotto forma di texture, di dimensione 2048x2048 pixel. Il processore emulato funziona ad una frequenza di 250 kHz. Oltre a Linux, l'emulatore puΓ² eseguire anche Micropython.

Un emulatore RISC-V sotto forma di pixel shader che ti consente di eseguire Linux in VRChat

Per creare un archivio dati persistente con supporto per la lettura e la scrittura, un trucco consiste nell'utilizzare un oggetto Camera legato a un'area rettangolare generata dallo shader e indirizzare l'output della texture renderizzata all'input dello shader. In questo modo, qualsiasi pixel scritto durante l'esecuzione del pixel shader puΓ² essere letto quando viene elaborato il fotogramma successivo.

Quando si applicano i pixel shader, un'istanza shader separata viene avviata in parallelo per ciascun pixel della texture. Questa caratteristica complica notevolmente l'implementazione e richiede un coordinamento separato dello stato dell'intero sistema emulato e il confronto della posizione del pixel elaborato con lo stato della CPU in esso codificato o il contenuto della RAM del sistema emulato (ogni pixel puΓ² codificare 128 frammenti di informazioni). Il codice dello shader richiede l'inclusione di un numero enorme di controlli, per semplificare l'implementazione del quale Γ¨ stato utilizzato il preprocessore perl perlpp.



Fonte: opennet.ru

Aggiungi un commento