Emulátor RISC-V ve formě pixel shaderu, který umožňuje provozovat Linux ve VRChat

Byly zveřejněny výsledky experimentu s organizací spuštění Linuxu ve virtuálním 3D prostoru multiplayerové online hry VRChat, která umožňuje načítání 3D modelů s vlastními shadery. Pro realizaci pojaté myšlenky byl vytvořen emulátor architektury RISC-V, prováděný na straně GPU ve formě pixelového (fragmentového) shaderu (VRChat nepodporuje výpočetní shadery a UAV). Kód emulátoru je publikován pod licencí MIT.

Emulátor je založen na implementaci v jazyce C, při jehož vytvoření byl využit vývoj minimalistického emulátoru riscv-rust, vyvinutého v jazyce Rust. Připravený C kód je přeložen do pixel shaderu v HLSL, vhodného pro načtení do VRChat. Emulátor poskytuje plnou podporu pro architekturu instrukční sady rv32imasu, jednotku správy paměti SV32 a minimální sadu periferií (UART a časovač). Připravené schopnosti stačí k načtení linuxového jádra 5.13.5 a základního prostředí příkazové řádky BusyBox, se kterým můžete interagovat přímo z virtuálního světa VRCat.

Emulátor RISC-V ve formě pixel shaderu, který umožňuje provozovat Linux ve VRChat
Emulátor RISC-V ve formě pixel shaderu, který umožňuje provozovat Linux ve VRChat

Emulátor je v shaderu implementován ve formě vlastní dynamické textury (Unity Custom Render Texture), doplněné o skripty Udon poskytované pro VRChat, sloužící k ovládání emulátoru při jeho provádění. Obsah RAM a stav procesoru emulovaného systému je uložen ve formě textury o velikosti 2048x2048 pixelů. Emulovaný procesor pracuje na frekvenci 250 kHz. Kromě Linuxu umí emulátor provozovat i Micropython.

Emulátor RISC-V ve formě pixel shaderu, který umožňuje provozovat Linux ve VRChat

Chcete-li vytvořit trvalé úložiště dat s podporou čtení a zápisu, trikem je použít objekt Camera navázaný na obdélníkovou oblast generovanou shaderem a nasměrovat výstup vykreslené textury na vstup shaderu. Tímto způsobem lze číst jakýkoli pixel zapsaný během provádění pixel shaderu při zpracování dalšího snímku.

Při použití pixel shaderů je paralelně spuštěna samostatná instance shaderu pro každý pixel textury. Tato vlastnost výrazně komplikuje implementaci a vyžaduje samostatnou koordinaci stavu celého emulovaného systému a porovnání polohy zpracovávaného pixelu se stavem CPU v něm zakódovaným nebo obsahem RAM emulovaného systému (každý pixel může kódovat 128 kousky informací). Shader kód vyžaduje zahrnutí velkého množství kontrol, pro zjednodušení implementace, kterých byl použit perl preprocesor perlpp.



Zdroj: opennet.ru

Přidat komentář