En RISC-V emulator i form av en pixel shader som lar deg kjøre Linux i VRChat

Resultatene av et eksperiment med organisering av lanseringen av Linux i det virtuelle 3D-rommet til flerspillerspillet VRChat, som tillater lasting av 3D-modeller med sine egne shaders, har blitt publisert. For å implementere den unnfangede ideen ble det laget en emulator av RISC-V-arkitekturen, utført på GPU-siden i form av en piksel (fragment) shader (VRChat støtter ikke beregningsskyggelegging og UAV). Emulatorkoden er publisert under MIT-lisensen.

Emulatoren er basert på en implementering i C-språket, som i sin tur brukte utviklingen av den minimalistiske emulatoren riscv-rust, utviklet i Rust-språket. Den forberedte C-koden er oversatt til en pikselskyggelegging i HLSL, egnet for lasting i VRChat. Emulatoren gir full støtte for rv32imasu-instruksjonssettarkitekturen, SV32-minneadministrasjonsenheten og et minimalt sett med periferiutstyr (UART og timer). De forberedte egenskapene er nok til å laste Linux-kjernen 5.13.5 og det grunnleggende BusyBox-kommandolinjemiljøet, som du kan samhandle direkte fra den virtuelle VRChat-verdenen.

En RISC-V emulator i form av en pixel shader som lar deg kjøre Linux i VRChat
En RISC-V emulator i form av en pixel shader som lar deg kjøre Linux i VRChat

Emulatoren er implementert i skyggeleggingen i form av sin egen dynamiske tekstur (Unity Custom Render Texture), supplert med Udon-skript gitt for VRChat, som brukes til å kontrollere emulatoren under dens utførelse. Innholdet i RAM-en og prosessortilstanden til det emulerte systemet lagres i form av en tekstur, 2048x2048 piksler i størrelse. Den emulerte prosessoren opererer med en frekvens på 250 kHz. I tillegg til Linux kan emulatoren også kjøre Micropython.

En RISC-V emulator i form av en pixel shader som lar deg kjøre Linux i VRChat

For å lage vedvarende datalagring med støtte for lesing og skriving, er et triks å bruke et kameraobjekt bundet til et rektangulært område generert av skyggeleggingen og dirigere utgangen av den gjengitte teksturen til skyggeinngangen. På denne måten kan enhver piksel som er skrevet under kjøring av pikselskyggelegging leses når neste bilde behandles.

Når du bruker pikselskyggelegging, lanseres en separat skyggeleggingsinstans parallelt for hver teksturpiksel. Denne funksjonen kompliserer implementeringen betydelig og krever separat koordinering av tilstanden til hele det emulerte systemet og sammenligning av posisjonen til den behandlede pikselen med CPU-tilstanden som er kodet i den eller innholdet i RAM-en til det emulerte systemet (hver piksel kan kode 128 biter av informasjon). Shader-koden krever inkludering av et stort antall kontroller, for å forenkle implementeringen som perl-forprosessoren perlpp ble brukt av.



Kilde: opennet.ru

Legg til en kommentar