Nagawa nilang patakbuhin ang Linux sa isang RISC-V emulator sa VRChat

Ilang araw na ang nakakalipas ang mga resulta ng isang eksperimento ay pinakawalan samahan batay sa paglulunsad ng Linux kernel sa loob ng 3D virtual space ng isang online multiplayer na laro.

Ang eksperimentong ito Isinasagawa ito sa VRChat na nagpapahintulot sa pag-load ng mga modelo ng 3D sa kanilang sariling mga shader. Upang maipatupad ang naisip na ideya, isang emulator batay sa arkitektura ng RISC-V ay nilikha na naisagawa sa panig ng GPU sa anyo ng isang pixel shader.

Tungkol sa proyekto

Ang emulator ay batay sa pagpapatupad sa wikang C, na ang likha naman ay ginamit ang mga pagpapaunlad ng minimalist na riscv-kalawang na emulator, na siya namang binuo sa wikang Rust. Ang nakahandang C code ay isinalin sa isang pixel shader sa wikang HLSL, na angkop para sa paglo-load sa VRChat.

Ang emulator nagbibigay ng buong suporta para sa arkitektura ng set ng pagtuturo ng rv32imasu, ang unit ng control memory ng SV32 at isang maliit na hanay ng mga peripheral (UART at timer). Ang mga handa nang kakayahan ay sapat upang mai-load ang Linux kernel 5.13.5 at ang pangunahing BusyBox command-line environment, kung saan maaari kang direktang makipag-ugnay mula sa virtual na mundo ng VRChat.

Bandang Marso 2021, nagpasya akong magsulat ng isang emulator na may kakayahang magpatakbo ng isang buong Linux kernel sa VRChat. Dahil sa likas na mga limitasyon ng platform na iyon, ang napiling tool ay dapat na isang shader. At pagkatapos ng ilang buwan ng trabaho ipinagmamalaki ko ngayon na ipakilala ang unang RISC-V CPU / SoC emulator (na alam ko) sa isang HLSL pixel shader, na may kakayahang tumakbo hanggang sa 250 kHz (sa isang 2080 Ti) at boot Linux 5.13.5 na may suporta sa MMU.

Ang emulator ay ipinatupad sa shader sa anyo ng sarili nitong pabago-bagong pagkakayari (Unity Custom Render Texture), na dinagdagan ng mga script ng Udon na ibinigay para sa VRChat, na ginagamit upang makontrol ang emulator sa runtime.

Ang pangunahing nilalaman ng memorya at ang estado ng processor ng tinulad na system ay nai-save bilang isang texture na may sukat na 2048 × 2048 na mga pixel, sa ganyang pagpapatakbo ng emulate na processor sa 250 kHz. Bukod sa Linux, ang Micropython ay maaari ding patakbuhin sa emulator.

Upang patakbuhin ang Linux naisip kong kakailanganin namin ng hindi bababa sa 32 MiB ng pangunahing memorya (RAM), ngunit ligtas tayo at gumawa ng 64 - ang pagkakaiba sa pagganap ay hindi magiging malaki at dapat mayroong sapat na VRAM.

Sa una, ang pangunahing alalahanin sa pagganap ay ang bilis ng orasan. Iyon ay, kung gaano karaming mga CPU cycle ang maaaring maipatupad sa isang frame.

Upang ayusin ang pag-iimbak ng data paulit-ulit sa suporta para sa pagbabasa at pagsusulat, isang trick na nauugnay sa paggamit ng isang bagay na Camera na naka-link sa isang hugis-parihaba na lugar ang ginagamit nabuo ng shader at nagdidirekta ng output ng na-render na texture sa input ng shader. Samakatuwid, Ang anumang pixel na nakasulat sa panahon ng pagpapatupad ng isang pixel shader ay maaaring mabasa sa pamamagitan ng pagproseso ng susunod na frame.

Kapag inilapat ang mga pixel shader, isang magkakahiwalay na halimbawa ng shader ay pinaputok nang kahanay para sa bawat pixel sa pagkakayari.

Ang tampok na ito ay makabuluhang kumplikado sa pagpapatupad at nangangailangan ng magkakahiwalay na koordinasyon ng estado ng buong tinulad na sistema at paghahambing ng posisyon ng naprosesong pixel sa estado ng nilalaman ng CPU o RAM ng tinulad na system na naka-encode dito (ang bawat pixel ay maaaring mag-encode ng 128 bits ng impormasyon).

Sa kasong ito, kinakailangan ng shader code ang pagsasama ng isang malaking bilang ng mga tseke, upang gawing simple ang pagpapatupad kung saan ginamit ang perl preprocessor perlpp.

Para sa mga na interesado sa mga panoorin nabanggit na:

  • ang code ay nasa GitHub
  • Ang 64 MiB ng RAM na minus na estado ng CPU ay nakaimbak sa isang 2048 × 2048 pixel (128 bpp) na format ng integer format
  • Pinapayagan ang pagkakataong mag-render ng pagkakayari sa pagpapalit ng buffer na nagpapahintulot sa pag-encode / pag-decode ng estado sa pagitan ng mga frame
  • ginagamit ang isang pixel shader para sa pagtulad bilang compute at ang mga UAV shader ay hindi sinusuportahan ng VRChat

Sa wakas kung interesado kang malaman ang tungkol dito, maaari mong suriin ang mga detalye Sa sumusunod na link.


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.