Byly publikovány výsledky experimentu zaměřeného na spuštění Linuxu v rámci virtuálního 3D prostředí multihráčské online hry VRChat, která podporuje nahrávání 3D modelů se svými shadery. Pro realizaci tohoto konceptu byl vytvořen emulátor architektury RISC-V, který běží na GPU ve formě pixelového (fragmentového) shaderu (VRChat nepodporuje výpočetní shadery a UAV). Kód emulátoru byl publikován pod licencí MIT.
Emulátor vychází z implementace v jazyce C, která byla vytvořena na základě minimalistického emulátoru riscv-rust, vyvíjeného v jazyce Rust. Připravený C kód je přeložen do pixelového shaderu v jazyce HLSL, který je vhodný pro nahrání do VRChat. Emulátor poskytuje plnou podporu architektury příkazového setu rv32imasu, paměťového řadiče SV32 a minimálního počtu periferních zařízení (UART a časovač). Připravené funkce jsou dostatečné pro nahrání jádra Linux 5.13.5 a základního prostředí příkazového řádku BusyBox, se kterým je možné přímo interagovat z virtuálního světa VRChat.


Emulátor je implementován v shaderu ve formě vlastní dynamické textury (Unity Custom Render Texture), doplněné skripty Udon pro VRChat, které se používají k řízení emulátoru během jeho běhu. Obsah operační paměti a stav procesoru emulované systém jsou uchovávány ve formě textury o velikosti 2048×2048 pixelů. Emulovaný procesor pracuje s frekvencí 250 kHz. Kromě Linuxu lze v emulátoru také spustit Micropython.

Pro organizaci trvalého ukládání dat s podporou čtení a zápisu se používá trik spojený s objektem Camera připojeným k obdélníkové oblasti generované shaderem a směrem výstupu vykreslované textury do shaderu. Tímto způsobem může být jakýkoli pixel zapsaný během provádění pixelového shaderu přečten při zpracování dalšího snímku.
Při použití pixelových shaderů je pro každý pixel textury paralelně spuštěn samostatný instance shaderu. Tato vlastnost výrazně komplikuje implementaci a vyžaduje samostatnou koordinaci stavu celého emulovaného systému a přiřazení pozice zpracovávaného pixelu k zakódovanému CPU stavu nebo obsahu RAM emulovaného systému (každý pixel může kódovat 128 bitů informací). Kód shaderu přitom vyžaduje zařazení obrovského množství kontrol, k jejichž zjednodušení byl použit perl-preprocesor perlpp.

Zdroj: opennet.ru
