Boli zverejnené výsledky experimentu o organizovaní spustenia Linuxu v rámci virtuálneho 3D prostredia multiplayerovej online hry VRChat, ktorá umožňuje načítanie 3D modelov so svojimi shadermi. Na realizáciu zamýšľanej myšlienky bol vytvorený emulátor architektúry RISC-V, vykonávaný na strane GPU vo forme pixelového (fragmentového) shaderu (VRChat nepodporuje výpočtové shadery a UAV). Kód emulátora bol zverejnený pod licenciou MIT.
Základom emulátora je implementácia v jazyku C, pri jej vytváraní boli použité výstupy minimalistického emulátora riscv-rust, rozvíjaného v jazyku Rust. Pripravený C kód je transponovaný do pixelového shaderu v jazyku HLSL, vhodného na načítanie do VRChat. Emulátor poskytuje plnú podporu architektúry príkazového súboru rv32imasu, ovládacieho bloku pamäte SV32 a minimálneho súboru periférnych zariadení (UART a časovač). Pripravené možnosti sú dostatočné na načítanie jadra Linux 5.13.5 a základného prostredia príkazového riadku BusyBox, s ktorým je možné interagovať priamo z virtuálneho sveta VRChat.


Emulátor je realizovaný v shadery ako vlastná dynamická textúra (Unity Custom Render Texture), doplnená skriptami Udon, poskytnutými pre VRChat, ktoré sú zapojené na riadenie emulátora počas jeho vykonávania. Obsah operačnej pamäte a stav procesora emulovanej sústavy sa uchováva vo forme textúry s rozmerom 2048×2048 pixelov. Emulovaný procesor pracuje na frekvencii 250 kHz. Okrem Linuxu môže byť v emulátore spustený aj Micropython.

Na zabezpečenie trvalého ukladania dát s podporou čítania a zápisu sa používa trik spojený s použitím objektu Camera, pripevneného k obdĺžnikovej oblasti generovanej shaderom, a smerovaním výstupu textúry, ktorá je vykreslená, na vstup shaderu. Týmto spôsobom môže byť každý pixel, ktorý je zapísaný počas vykonávania pixelového shaderu, prečítaný pri spracovaní nasledujúceho rámca.
Pri použití pixelových shaderů pro každý pixel textury se paralelně spouští samostatný příklad shaderu. Tato vlastnost značně komplikuje realizaci a vyžaduje samostatnou koordinaci stavu celého emulovaného systému a přiřazení pozice zpracovávaného pixelu ke kódovanému stavu CPU nebo obsahu RAM emulovaného systému (každý pixel může kódovat 128 bitů informací). Kód shaderu zároveň vyžaduje zahrnutí obrovského počtu kontrol, na jejichž zjednodušení byl nasazen perl-preprocesor perlpp.

Zdroj: opennet.ru
