Публикувани са резултатите от експеримента по организиране на стартирането на Linux в рамките на виртуално 3D пространство на многопотребителската онлайн игра VRChat, която допуска зареждане на 3D модели със собствени шейдъри. За реализиране на замислената идея е създаден емулация на архитектурата RISC-V, изпълнявана на страна на GPU под формата на пикселен (фрагментен) шейдър (VRChat не поддържа изчислителни шейдъри и UAV). Кодът на емулятора е публикуван под лицензия MIT.
В основата на емулятора е заложена реализация на езика Си, при създаването на която, от друга страна, са използвани разработки на минималистичния емулятор riscv-rust, развиван на езика Rust. Подготвеният Си код се трансформира в пикселен шейдър на езика HLSL, подходящ за зареждане в VRChat. В емулятора се предоставя пълна поддръжка на архитектурата на командния набор rv32imasu, блок за управление на паметта SV32 и минимален комплекс от периферни устройства (UART и таймер). Подготвените възможности са достатъчни за зареждане на ядрото на Linux 5.13.5 и основното командно пространство BusyBox, с което може да се взаимодействието директно от виртуалния свят на VRChat.


Емуляторът е реализиран в шейдъра под формата на собствена динамична текстура (Unity Custom Render Texture), допълнена с предоставените за VRChat скриптове Udon, ангажирани за управление на емулятора по време на неговото изпълнение. Съдържанието на оперативната памет и състоянието на процесора на емулираната система се запазват под формата на текстура с размер 2048×2048 пиксела. Емулираният процесор работи с честота 250 kHz. Освен Linux, в емулятора може да бъде стартиран и Micropython.

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

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