几天前 实验结果公布 基于启动的组织 3D 虚拟空间中的 Linux 内核 的在线多人游戏。
这个实验 它是在 VRChat 上完成的,它允许使用自己的着色器加载 3D 模型. 为了实现构想的想法,创建了一个基于 RISC-V 架构的模拟器,它以像素着色器的形式在 GPU 端执行。
关于该项目
模拟器是基于C语言实现的, 反过来,他的创作使用了极简主义 riscv-rust 模拟器的开发,而后者又是用 Rust 语言开发的。 准备好的C代码被翻译成HLSL语言的像素着色器,适合加载到VRChat中。
模拟器 为 rv32imasu 指令集架构提供全面支持, SV32 内存控制单元 和最少的外围设备 (UART 和定时器)。 准备好的功能足以加载 Linux 内核 5.13.5 和 BusyBox 基本命令行环境,您可以直接从 VRChat 虚拟世界与之交互。
2021 年 250 月左右,我决定编写一个能够在 VRChat 中运行完整 Linux 内核的模拟器。 由于该平台的固有限制,所选工具必须是着色器。 经过几个月的工作,我现在很自豪地在 HLSL 像素着色器中推出世界上第一个 RISC-V CPU / SoC 仿真器(我知道),能够运行高达 2080 kHz(在 5.13.5 Ti 上)和使用 MMU 支持启动 Linux XNUMX。
模拟器在着色器中以自己的动态纹理(Unity Custom Render Texture)的形式实现,辅以VRChat提供的Udon脚本,用于在运行时控制模拟器。
仿真系统的主存内容和处理器状态保存为大小为2048×2048像素的纹理,从而使仿真处理器以250kHz的频率运行。 除了 Linux,Micropython 也可以在模拟器上运行。
要运行 Linux,我认为我们至少需要 32 MiB 的主内存 (RAM),但让我们安全起见,将其设为 64 - 性能差异不会很大,而且应该有足够的 VRAM。
起初,主要的性能问题是时钟速度。 即一帧可以执行多少个CPU周期。
组织数据存储 持久的读写支持, 使用与使用链接到矩形区域的 Camera 对象相关的技巧 由着色器生成并将渲染纹理的输出定向到着色器的输入。 所以, 在像素着色器执行期间写入的任何像素都可以通过处理下一帧来读取。
应用像素着色器时,会为纹理中的每个像素并行触发单独的着色器实例。
此功能使实现显着复杂化,并且需要单独协调整个仿真系统的状态,并将处理像素的位置与其中编码的仿真系统的 CPU 或 RAM 内容的状态进行比较(每个像素可以编码 128 位的信息)。
在这种情况下,着色器代码需要包含大量检查,以简化使用 perl 预处理器 perlpp 的实现。
对于那些 对规格感兴趣 提到:
- 代码在 GitHub 上
- 64 MiB 的 RAM 减去 CPU 状态存储在 2048 × 2048 像素 (128 bpp) 整数格式纹理中
- 带有缓冲区交换的 Unity 自定义渲染纹理允许帧之间的编码/解码状态
- 像素着色器用于仿真,因为 VRChat 不支持计算和无人机着色器
最后 如果您有兴趣了解更多有关它的信息,您可以查看详细信息 在下面的链接中。