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

Публикувани са резултатите от експеримент за организиране на стартирането на Linux във виртуалното 3D пространство на мултиплейър онлайн играта VRChat, което позволява зареждане на 3D модели със собствени шейдъри. За реализиране на замислената идея е създаден емулатор на архитектурата RISC-V, изпълнен от страна на GPU под формата на пикселен (фрагмент) шейдър (VRChat не поддържа изчислителни шейдъри и UAV). Кодът на емулатора е публикуван под лиценза на MIT.

Емулаторът се основава на имплементация на езика C, чието създаване от своя страна използва разработките на минималистичния емулатор riscv-rust, разработен на езика Rust. Подготвеният C код се превежда в пикселен шейдър в 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, използвани за управление на емулатора по време на неговото изпълнение. Съдържанието на RAM и състоянието на процесора на емулираната система се съхраняват под формата на текстура с размери 2048x2048 пиксела. Емулираният процесор работи на честота 250 kHz. В допълнение към Linux, емулаторът може да работи и с Micropython.

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

За да създадете постоянно хранилище на данни с поддръжка за четене и запис, един трик е да използвате обект Camera, свързан с правоъгълна област, генерирана от шейдъра, и да насочите изхода на изобразената текстура към входа на шейдъра. По този начин всеки пиксел, записан по време на изпълнението на пикселния шейдър, може да бъде прочетен, когато се обработва следващият кадър.

При прилагане на пикселни шейдъри, отделен екземпляр на шейдър се стартира паралелно за всеки текстурен пиксел. Тази функция значително усложнява реализацията и изисква отделна координация на състоянието на цялата емулирана система и сравнение на позицията на обработения пиксел с кодираното в него състояние на процесора или съдържанието на RAM паметта на емулираната система (всеки пиксел може да кодира 128 битове информация). Кодът на шейдъра изисква включването на огромен брой проверки, за опростяване на изпълнението на които е използван perl препроцесорът perlpp.



Източник: opennet.ru

Добавяне на нов коментар