En RISC-V-emulator i form af en pixelshader, der gjorde det muligt at køre Linux i VRChat

Resultaterne af eksperimentet om organiseringen af opstart af Linux inde i et virtuelt 3D-rum af det multiplayer online-spil VRChat, som tillader upload af 3D-modeller med egne shaders, er offentliggjort. For at realisere den planlagte idé blev der skabt en emulator af RISC-V-arkitekturen, der kører på GPU-siden som en pixel (fragment) shader (VRChat understøtter ikke beregnings-shaders og UAV). Koden til emulatoren er offentliggjort under MIT-licensen.

Grundlaget for emulatoren er en implementering på C-sprog, hvori der er anvendt elementer fra den minimalistiske emulator riscv-rust, der udvikles i Rust. Den forberedte C-kode translateres til en pixel shader på HLSL, der er egnet til upload til VRChat. Emulatoren tilbyder fuld støtte til instruktionssættet rv32imasu, hukommelseskontrolenheden SV32 og et minimum af perifere enheder (UART og timer). De forberedte funktioner er tilstrækkelige til at uploade Linux-kernen 5.13.5 og det grundlæggende BusyBox-kommandolinjemiljø, som kan interageres med direkte fra VRChat's virtuelle verden.

En RISC-V-emulator i form af en pixelshader, der gjorde det muligt at køre Linux i VRChat
En RISC-V-emulator i form af en pixelshader, der gjorde det muligt at køre Linux i VRChat

Emulatoren er implementeret i shaderen som en brugerdefineret dynamisk tekstur (Unity Custom Render Texture), suppleret med de scripts til VRChat, der kaldes Udon, som anvendes til at styre emulatoren under dens kørsel. Indholdet af det operative hukommelse og tilstanden af processoren i det emulerede system gemmes som en tekstur, der måler 2048×2048 pixels. Den emulerede processor kører med en frekvens på 250 kHz. Udover Linux kan der også køres Micropython i emulatoren.

En RISC-V-emulator i form af en pixelshader, der gjorde det muligt at køre Linux i VRChat

For at organisere permanent dataopbevaring med støtte til læsning og skrivning anvendes et trick, der relaterer til brugen af et Camera-objekt knyttet til et rektangulært område genereret af shaderen, og retningen af output fra den renderede tekstur til shaderens input. På denne måde kan enhver pixel, der skrives under kørsel af pixel shaderen, læses under behandlingen af det næste frame.

Når der anvendes pixel-shadere, startes en separat instans af shaderen parallelt for hver pixel i teksturen. Denne funktionalitet gør implementeringen betydeligt mere kompleks og kræver særskilt koordinering af hele den emulerede systems tilstand samt sammenligning af positionen af den behandlede pixel med den CPU-tilstand, der er kodet i den, eller indholdet af RAM i det emulerede system (hver pixel kan kode 128 bit information). Shader-koden kræver samtidig, at der inkluderes et enormt antal kontroller, hvortil en perl-præprocessor ved navn perlpp blev anvendt for at forenkle implementeringen.

Afspil video


Kilde: opennet.ru
Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster