Преди няколко дни бяха публикувани резултатите от експеримент организация въз основа на стартирането на Ядрото на Linux в 3D виртуалното пространство на онлайн мултиплейър игра.
Този експеримент Това беше направено на VRChat, което позволява зареждане на 3D модели със собствени шейдъри. За да се реализира замислената идея, е създаден емулатор, базиран на архитектурата RISC-V, който се изпълнява от страна на графичния процесор под формата на пикселен шейдър.
За проекта
Емулаторът се основава на внедряването на езика C, чието създаване от своя страна използва разработките на минималистичния емулатор на riscv-rust, който от своя страна е разработен на езика Rust. Подготвеният C код се превежда в пикселен шейдър на езика HLSL, подходящ за зареждане във VRChat.
Емулаторът осигурява пълна поддръжка за архитектурата на набора от инструкции rv32imasu, блока за управление на паметта SV32 и минимален набор от периферни устройства (UART и таймер). Подготвените възможности са достатъчни за зареждане на ядрото на Linux 5.13.5 и основната среда на командния ред на BusyBox, с които можете да взаимодействате директно от виртуалния свят на VRChat.
Около март 2021 г. реших да напиша емулатор, способен да изпълнява пълно ядро на Linux във VRChat. Поради присъщите ограничения на тази платформа, избраният инструмент трябваше да бъде шейдър. И след няколко месеца работа сега съм горд да представя първия в света емулатор на процесор / SoC RISC-V (за който знам) в пикселен шейдър HLSL, способен да работи до 250 kHz (на 2080 Ti) и стартирайте Linux 5.13.5 с поддръжка на MMU.
Емулаторът е реализиран в шейдъра под формата на собствена динамична текстура (Unity Custom Render Texture), допълнена от скриптовете Udon, предвидени за VRChat, които се използват за управление на емулатора по време на изпълнение.
Съдържанието на основната памет и състоянието на процесора на емулираната система се запазват като текстура с размер 2048 × 2048 пиксела, като по този начин емулираният процесор работи на 250 kHz. Освен Linux, Micropython може да се изпълнява и в емулатора.
За да стартирам Linux, мислех, че ще имаме нужда от поне 32 MiB основна памет (RAM), но нека бъдем в безопасност и да направим 64 - разликата в производителността няма да бъде голяма и трябва да има достатъчно VRAM.
Първоначално основната грижа за производителността беше тактовата честота. Тоест колко цикъла на процесора могат да бъдат изпълнени в един кадър.
За организиране на съхранение на данни постоянен с поддръжка за четене и писане, се използва трик, свързан с използването на обект Camera, свързан с правоъгълна област генериран от шейдъра и насочващ изхода на визуализираната текстура към входа на шейдъра. Следователно, Всеки пиксел, написан по време на изпълнение на пикселен шейдър, може да бъде прочетен чрез обработка на следващия кадър.
Когато се прилагат пикселни шейдъри, отделен екземпляр от шейдъра се задейства паралелно за всеки пиксел в текстурата.
Тази функция значително усложнява внедряването и изисква отделна координация на състоянието на цялата емулирана система и сравнение на позицията на обработения пиксел със състоянието на процесора или RAM съдържанието на емулираната система, кодирана в него (всеки пиксел може да кодира 128 бита информация).
В този случай кодът на шейдъра изисква включването на голям брой проверки, за да се опрости изпълнението на който е използван препроцесорът perl perlpp.
За тези, които са интересуват се от спецификациите се споменава, че:
- кодът е на GitHub
- 64 MiB оперативна памет минус състоянието на процесора се съхранява в текстура с цяло число 2048 × 2048 пиксела (128 bpp)
- Персонализираната текстура за изобразяване на Unity с размяна на буфер позволява състояние на кодиране / декодиране между кадри
- пикселен шейдър се използва за емулация, тъй като изчислителните и безпилотни шейдъри не се поддържат от VRChat
Накрая ако се интересувате да научите повече за това, можете да проверите подробностите В следващия линк.