Sono stati pubblicati i risultati di un esperimento sulla gestione del lancio di Linux all'interno di uno spazio 3D virtuale del gioco online multiutente VRChat, che consente di caricare modelli 3D con i propri shader. Per realizzare l'idea è stato creato un emulatore dell'architettura RISC-V, eseguito sul lato GPU come shader di pixel (fragment shader) (VRChat non supporta gli shader computazionali e UAV). Il codice dell'emulatore è stato pubblicato sotto licenza MIT.
L'emulatore si basa su un'implementazione in linguaggio C, in cui a sua volta sono stati utilizzati i risultati di un emulatore minimalista riscv-rust, sviluppato in linguaggio Rust. Il codice C preparato viene traslato in uno shader di pixel in linguaggio HLSL, pronto per essere caricato in VRChat. L'emulatore offre pieno supporto all'architettura del set di istruzioni rv32imasu, il blocco di controllo della memoria SV32 e un insieme minimo di periferiche (UART e timer). Le capacità fornite sono sufficienti per caricare il kernel Linux 5.13.5 e l'ambiente di base della riga di comando BusyBox, con cui è possibile interagire direttamente dal mondo virtuale di VRChat.


L'emulatore è implementato nello shader sotto forma di una propria texture dinamica (Unity Custom Render Texture), arricchita da script Udon forniti per VRChat, utilizzati per gestire l'emulatore durante la sua esecuzione. Il contenuto della memoria RAM e lo stato del processore del sistema emulato vengono salvati sotto forma di texture, di dimensioni 2048×2048 pixel. Il processore emulato funziona con una frequenza di 250 kHz. Oltre a Linux, può anche essere eseguito Micropython nell'emulatore.

Per organizzare una memorizzazione permanente dei dati con supporto per lettura e scrittura, viene utilizzato un trucco che coinvolge l'oggetto Camera, collegato a un'area rettangolare generata dallo shader, e la direzione dell'output della texture renderizzata all'ingresso dello shader. In questo modo, ogni pixel scritto durante l'esecuzione dello shader di pixel può essere letto nell'elaborazione del fotogramma successivo.
Quando si utilizzano shader a pixel, un'istanza separata dello shader viene eseguita parallelamente per ogni pixel della texture. Questa caratteristica complica notevolmente l'implementazione e richiede una coordinazione separata dello stato dell'intero sistema emulato e la corrispondenza della posizione del pixel in elaborazione con lo stato della CPU o il contenuto della RAM del sistema emulato codificato in esso (ogni pixel può codificare 128 bit di informazioni). Il codice dello shader richiede anche l'inclusione di un enorme numero di controlli, per semplificare l'implementazione del quale è stato utilizzato il preprocessore Perl perlpp.

Fonte: opennet.ru
