Емулятор RISC-V у формі піксельного шейдера, що дозволив запустити Linux у VRChat

Опубліковані результати експерименту з організації запуску Linux всередині віртуального 3D-простору розрахованої на багато користувачів online-ігри VRChat, що допускає завантаження 3D-моделей зі своїми шейдерами. Для реалізації задуманої ідеї було створено емулятор архітектури RISC-V, що виконується на боці GPU у вигляді піксельного (фрагментного) шейдера (VRChat не підтримує обчислювальні шейдери та UAV). Код емулятора опубліковано під ліцензією MIT.

В основі емулятора закладена реалізація мовою Сі, при створенні якої, у свою чергу, використані напрацювання мінімалістичного емулятора riscv-rust, що розвивається мовою Rust. Підготовлений Сі-код транслюється в піксельний шейдер мовою HLSL, придатний для завантаження у VRChat. В емуляторі надається повна підтримка архітектури набору команд rv32imasu, блок управління пам'яттю SV32 та мінімальний набір периферійних пристроїв (UART та таймер). Підготовлених можливостей достатньо для завантаження ядра Linux 5.13.5 та базового оточення командного рядка BusyBox, з яким можна взаємодіяти безпосередньо з віртуального світу VRChat.

Емулятор RISC-V у формі піксельного шейдера, що дозволив запустити Linux у VRChat
Емулятор RISC-V у формі піксельного шейдера, що дозволив запустити Linux у VRChat

Емулятор реалізований у шейдері у формі власної динамічної текстури (Unity Custom Render Texture), доповненої скриптами Udon, що надаються для VRChat, задіяними для управління емулятором під час його виконання. Вміст оперативної пам'яті та стан процесора емульованої системи зберігається у формі текстури розміром 2048×2048 пікселів. Емульований процесор працює з частотою 250 kHz. Крім Linux в емуляторі також може бути запущений Micropython.

Емулятор RISC-V у формі піксельного шейдера, що дозволив запустити Linux у VRChat

Для організації постійного зберігання даних з підтримкою читання та запису застосовується трюк, пов'язаний з використанням об'єкта Camera, прив'язаного до прямокутної області, що генерується шейдером, і напрямом виведення текстури, що відмальовується, на вхід шейдера. Таким чином, будь-який піксель, записаний у процесі виконання піксельного шейдера, може бути прочитаний при обробці наступного кадру.

При застосуванні піксельних шейдерів кожного пікселя текстури паралельно запускається окремий екземпляр шейдера. Ця особливість суттєво ускладнює реалізацію і вимагає окремої координації стану всієї емульованої системи та зіставлення позиції оброблюваного пікселя з закодованими в ньому станом CPU або вмістом ОЗУ емульованої системи (кожен піксель може кодувати 128 біт інформації). Код шейдера у своїй вимагає включення величезної кількості перевірок, спрощення реалізації яких був задіяний perl-препроцессор perlpp.



Джерело: opennet.ru

Додати коментар або відгук