Podarilo sa im spustiť Linux na emulátore RISC-V na VRChat

Pred niekoľkými dňami boli zverejnené výsledky experimentu organizácia založená na spustení Linuxové jadro vo virtuálnom 3D priestore online hry pre viacerých hráčov.

Tento experiment Vykonalo sa to na VRChat, ktorý umožňuje načítanie 3D modelov s vlastnými shadermi. Na implementáciu koncipovanej myšlienky bol vytvorený emulátor založený na architektúre RISC-V, ktorý je na strane GPU vykonávaný vo forme pixelového shadera.

O projekte

Emulátor je založený na implementácii v jazyku C, ktorého tvorba zase využila vývoj minimalistického emulátora riscv-rust, ktorý je zase vyvinutý v jazyku Rust. Pripravený C kód je preložený do pixelového shadera v jazyku HLSL, vhodného na načítanie do VRChat.

Emulátor poskytuje plnú podporu architektúre inštrukčnej sady rv32imasu, riadiaca jednotka pamäte SV32 a minimálna sada periférií (UART a časovač). Pripravené schopnosti postačujú na načítanie jadra Linux 5.13.5 a základného prostredia príkazového riadka BusyBox, s ktorým môžete komunikovať priamo z virtuálneho sveta VRChat.

Okolo marca 2021 som sa rozhodol napísať emulátor schopný spustiť celé jadro Linuxu vo VRChat. Vzhľadom na inherentné obmedzenia tejto platformy musel byť zvolený nástroj shader. A po niekoľkých mesiacoch práce som teraz hrdý na to, že môžem predstaviť prvý emulátor RISC-V CPU / SoC na svete (o ktorom viem) v pixelovom shaderi HLSL, ktorý dokáže pracovať až do 250 kHz (na 2080 Ti) a boot Linux 5.13.5 s podporou MMU.

Emulátor je v shaderi implementovaný vo forme vlastnej dynamickej textúry (Unity Custom Render Texture), doplnenej o skripty Udon poskytnuté pre VRChat, ktoré sa používajú na ovládanie emulátora za behu.

Hlavný obsah pamäte a stav procesora emulovaného systému sa uložia ako textúra s veľkosťou 2048 × 2048 pixelov, čím emulovaný procesor pracuje na frekvencii 250 kHz. Okrem Linuxu je možné na emulátore spustiť aj Micropython.

Na spustenie Linuxu som si myslel, že budeme potrebovať najmenej 32 MiB hlavnej pamäte (RAM), ale buďme v bezpečí a urobme 64 - rozdiel vo výkone nebude veľký a VRAM by mal byť dostatok.

Spočiatku bol hlavným problémom výkonu hodinová rýchlosť. To znamená, koľko cyklov CPU je možné vykonať v jednom rámci.

Organizovať ukladanie dát vytrvalý s podporou čítania a písania, používa sa trik spojený s používaním objektu Fotoaparát prepojeného s obdĺžnikovou oblasťou generované shaderom a smerujúce výstup vykreslenej textúry na vstup shadera. Preto Každý pixel zapísaný počas vykonávania shadera pixelov je možné prečítať spracovaním nasledujúceho rámca.

Keď sa použijú shadery pixelov, pre každý pixel v textúre sa paralelne spustí samostatná inštancia shadera.

Táto funkcia výrazne komplikuje implementáciu a vyžaduje oddelenú koordináciu stavu celého emulovaného systému a porovnanie polohy spracovaného pixelu so stavom obsahu CPU alebo RAM emulovaného systému v ňom kódovaného (každý pixel môže kódovať 128 bitov informácie).

V tomto prípade kód shadera vyžaduje zahrnutie veľkého počtu kontrol, aby sa zjednodušila implementácia, pri ktorej bol použitý perlpp preprocesora perl.

Pre tých, ktorí sú zaujímajú sa o špecifikácie uvádza sa, že:

  • kód je na GitHub
  • 64 MiB pamäte RAM mínus stav CPU je uložený v celočíselnom formáte 2048 × 2048 pixelov (128 bpp)
  • Vlastná textúra vykresľovania Unity s výmenou vyrovnávacej pamäte umožňuje stav kódovania / dekódovania medzi snímkami
  • na emuláciu sa ako výpočet používa pixel shader a VRChat nepodporuje shadery UAV

Konečne ak máte záujem dozvedieť sa o tom viac, môžete skontrolovať podrobnosti Na nasledujúcom odkaze.


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.