Emulator RISC-V w formie cienia pikselowego, który umożliwił uruchomienie Linuxa w VRChat

Opublikowano wyniki eksperymentu dotyczącego uruchamiania systemu Linux w wirtualnej przestrzeni 3D wieloosobowej gry online VRChat, która pozwala na ładowanie modeli 3D z własnymi shaderami. W celu zrealizowania zamysłu stworzono emulator architektury RISC-V, działający po stronie GPU jako shader pikselowy (fragmentowy) (VRChat nie obsługuje shaderów obliczeniowych i UAV). Kod emulatora został opublikowany na licencji MIT.

Emulator oparty jest na implementacji w języku C, przy tworzeniu której wykorzystano osiągnięcia minimalistycznego emulatora riscv-rust, rozwijanego w języku Rust. Przygotowany kod w C jest tłumaczony na shader pikselowy w języku HLSL, odpowiedni do załadowania w VRChat. Emulator zapewnia pełne wsparcie dla architektury zestawu instrukcji rv32imasu, bloku zarządzania pamięcią SV32 oraz minimalnego zestawu urządzeń peryferyjnych (UART i timer). Przygotowane możliwości są wystarczające do załadowania jądra Linux 5.13.5 oraz podstawowego środowiska wiersza poleceń BusyBox, z którym można bezpośrednio współdziałać z wirtualnego świata VRChat.

Emulator RISC-V w formie cienia pikselowego, który umożliwił uruchomienie Linuxa w VRChat
Emulator RISC-V w formie cienia pikselowego, który umożliwił uruchomienie Linuxa w VRChat

Emulator jest zaimplementowany w shaderze w postaci własnej dynamicznej tekstury (Unity Custom Render Texture), wzbogaconej dostarczanymi skryptami Udon dla VRChat, które są wykorzystywane do zarządzania emulatorem podczas jego działania. Zawartość pamięci RAM i stan procesora emulowanej systemu są zachowywane w formie tekstury o wymiarach 2048×2048 pikseli. Emulowany procesor działa z częstotliwością 250 kHz. Oprócz Linuxa w emulatorze można także uruchomić Micropython.

Emulator RISC-V w formie cienia pikselowego, który umożliwił uruchomienie Linuxa w VRChat

Do organizacji stałego przechowywania danych z obsługą odczytu i zapisu używa się sztuczki związanej z wykorzystaniem obiektu Camera, przypisanego do prostokątnego obszaru generowanego przez shader, oraz kierunku wyjścia renderowanej tekstury do wejścia shadera. W ten sposób każdy piksel zapisany podczas działania shadera pikselowego może być odczytany podczas przetwarzania następnej klatki.

Podczas stosowania shaderów pikselowych dla każdego piksela tekstury równolegle uruchamiany jest osobny egzemplarz shadera. Ta cecha znacznie komplikuje realizację i wymaga osobnej koordynacji stanu całego emulowanego systemu oraz dopasowania pozycji przetwarzanego piksela do zakodowanych w nim stanów CPU lub zawartości RAM emulowanego systemu (każdy piksel może kodować 128 bitów informacji). Kod shadera wymaga włączenia ogromnej liczby kontroli, do uproszczenia realizacji której zastosowano preprocesor perlpp.

Odtwarzaj wideo


Źródło: opennet.ru
Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster