用32字节纸张构建的DDR-32内存能够玩游戏
随着计算机技术的不断发展,内存条已成为电脑不可或缺的核心组成部分。然而,近年来内存条的价格飞涨,让不少用户感到无奈。在这个背景下,我萌发了一个独特的念头:既然纸张的成本几乎可以忽略不计,是否可以将数据存储在纸上,替代昂贵的内存条呢?然而,当我着手实施这个项目时,才意识到想法的简单和现实的复杂之间的巨大差距,最终系统的运行速度更是让我大跌眼镜。下面我将详细叙述将普通纸张转换为“内存条”的全过程。
我迅速理清了实现思路:首先编写一个检测程序,截获系统的内存写入请求,将数据手动记录到纸上;当电脑需要读取时,再将纸上的内容输入回去。考量不同操作系统后,我决定使用Linux,因为它在内存管理上的灵活性最强。我所用的设备是装有Asaki项目移植版Linux的Apple Silicon MacBook,外加一大堆空白的标准打印纸。
如今的内存条已经经历了多代更新,从最初的DDR1到如今的DDR5,每一代的传输速度几乎都翻了一番。我估算这台“纸内存”的最高传输速度连每秒1字节都不到,换句话说,它的性能大致相当于DDR-32,这样的前沿科技实在是名不副实。刚装好Linux系统时,我试图安装OBS录屏软件,结果一打开就崩溃了,原因在于OBS与我设备的芯片类型不兼容。无奈之下,我只好使用KD Blasma自带的Spectacle录屏工具。
这台电脑原本有8GB内存,通过运行free -h命令检查交换空间时发现,Linux几乎没有使用这部分资源。于是我决定创建一个256MiB的交换文件,方便后续演示。简单来说,电脑的运行数据通常存放在RAM中,当RAM快满时,系统会将不常用的数据移动到硬盘上,虽然硬盘速度较慢,但能够防止系统崩溃。而我的“纸内存”比硬盘还要慢,实际上逻辑与交换空间是一样的。
在尝试创建交换文件时,我遇到了页面大小不匹配的问题:标准Linux的页面大小是4KB,而苹果硅芯片使用的是16KB。修改页面设置可能引发系统崩溃,因此我决定规避这一问题,换个思路继续。要构建纸内存的关键在于解决内存访问的拦截问题。经过调研,我发现在Linux中有个名为Userfaultfd的机制,恰恰能用来捕获缺页错误。整个过程并不复杂:当应用程序试图访问不存在的内存时,系统会产生缺页错误。此时,我的程序能拦截这个错误,并允许我手动输入纸上的存储内容,继续运行程序。同时,它也能捕获写入请求,将新数据及时记录到纸上。
由于我对C语言不太熟悉,且没有时间从头学习,我决定利用ChatGPT协作开发这个内存管理程序。在确保每段代码的安全性后,我成功编译了程序,并在第一次触发缺页错误时便顺利完成测试。我决定用16进制编码信息,并将其记录在纸上;每个字节对应两个字符,32字节的数据正好需要64个字符,适合初期测试。为了容错,我留了空间进行修改,实现了一种变相的ECC纠错功能。
在第一次测试中,我将纸上的内容输入回电脑,经过多次修改程序代码终于顺利实现。电脑成功触发缺页错误,我将纸上记录的16进制内容输入后,电脑顺利解码出了存储的信息。不过因为输入错误了一个字符,使得我所宣传的“自带ECC纠错”功能作罢。之后我调整程序以适应64字节容量,并新增写入功能,测试能否运行小游戏。我特意编写了一个乒乓球终端小游戏,用于定时将游戏状态存储到纸质内存中。
该游戏使用的数据量极少,仅占前8字节,记录了球的坐标、运动方向、球拍位置及得分等信息。顺利运行后,游戏状态也能完整保存到纸上,下次启动时可直接输入数据继续游戏。进行最后的压轴测试时,我选择了自己设计的文字冒险游戏《杂货店》,讲述了一名小孩被困在杂货店的故事,所有玩法和剧情均由我创作,代码则利用AI生成。同时,我还制作了一款印有吃豆人图案的特别版纸内存条,容量仍为64字节,这个游戏的运行也非常流畅,可将当前进度、角色位置、物品栏信息存储至纸上,确保无提前作弊的情况。
最后,我尝试手动修改纸上的数据以直接编辑物品栏,结果却触发了段错误——看来我或许成了第一个用普通白纸触发段错误的人。整个项目让我体会到科技与创造之间的奇妙。
每一次挑战自己,都是走向卓越的脚步!...