RAM是每台电脑都离不开的核心部件,最近内存条的价格实在高得离谱。它最主要的作用,就是给电脑提供一块专门用来临时存放运行数据的空间。
我当时就想,同样是记录信息,普通纸张的成本几乎可以忽略不计,那干脆试试让电脑把数据存在纸上,代替内存条用好了。
等真动手才发现,我不仅低估了这个项目的难度,更是完全没料到最终这套系统的运行速度会慢成这样。下面就说说我把普通白纸改造成“内存条”的全过程。
说干就干,我先捋清楚了大致的实现思路:理论上只要写个检测程序,截获电脑的内存写入请求,我自己把数据抄到纸上,等电脑需要读取的时候,再手动把纸上的内容输回去就行。
对比下来,所有操作系统里Linux对内存的直接管理权限最灵活,这个项目就选它了。我用的设备是装了Asaki项目移植版Linux的Apple Silicon MacBook,外加一大摞空白标准打印纸。
现在市面上的内存条已经迭代了好几代,从最早的DDR1到最新的DDR5,每一代新内存的传输速度差不多都能翻一倍。
我估算了一下,这台“纸内存”的峰值传输速度连每秒1字节都不到,换算下来相当于DDR-32代,说什么前沿科技完全是开玩笑。
Linux系统刚启动完,我本来想装个OBS录屏,结果一打开就直接崩溃了——原因是OBS默认适配的芯片类型和我这台设备不匹配。
我懒得花时间折腾适配转换层,直接用KD Blasma自带的Spectacle录屏工具就搞定了。
这台电脑本身自带8G内存,我运行free -h命令查了下交换空间,发现Linux平时几乎没怎么用到它。为了方便演示,我打算专门创建一个256MiB大小的交换文件。
简单说下原理:电脑的运行数据平时都存在RAM里,等RAM快被占满的时候,系统就会把暂时用不上的闲置数据挪到硬盘上。
硬盘速度虽然比RAM慢很多,但至少能避免电脑直接崩溃。而我们做的这台纸内存速度比硬盘还要慢得多,核心逻辑其实和交换空间是一模一样的。
我刚开始尝试创建交换文件,就碰到了页面大小不匹配的问题:标准Linux的页面大小是4KB也就是4096字节,可苹果硅芯片用的是16KB的页面大小。
直接改页面设置很容易把系统搞崩,我索性先绕开这个问题,换别的思路实现。
要做纸内存,最核心的就是解决内存访问的拦截问题。我查了不少资料,发现Linux有个叫Userfaultfd的机制,刚好可以写程序拦截系统的缺页错误。
整个逻辑说起来也不复杂:当应用程序尝试访问一块还不存在的内存时,系统就会触发缺页错误。我的程序把这个错误拦截下来之后,我就可以手动输入之前写在纸上的存储内容,让程序继续往下运行;同时还能拦截系统的写入请求,把新生成的数据及时抄到纸上。
我自己不太会写C语言,也没时间从零开始系统学习,干脆就和ChatGPT合作开发这个内存管理程序。每写一段我都会先搞清楚每一行代码的作用,确认完全安全之后才敢在系统上运行。
没花多少时间我就把程序编译好了,第一次触发缺页错误的测试居然一次就成功了。
我决定先用16进制的方式把信息编码后写到纸上:单个字节对应2个字符,32字节的数据只要写64个字符,用来做初期测试刚好合适。
我还特意留了用橡皮修改的余地,相当于变相实现了ECC纠错内存的功能,多余的空值还能直接压缩,没想到这根“DDR-32代纸内存”顺便还具备了ROM只读功能。
第一个测试环节是把纸上记录的内容重新输回电脑,前前后后改了4版代码才终于跑通。电脑成功触发缺页错误之后,我把纸上写的16进制内容手动输进去,电脑顺利解码取回了之前存好的信息——只不过中间我手滑输错了一个字符,之前吹的“自带ECC纠错”的宣传只好先作罢。
之后我把程序调整为适配64字节的容量,还新增了写入功能,这下纸内存既能读也能写,刚好可以试试能不能在上面运行小游戏。
我专门写了个终端版的乒乓球小游戏,每隔几秒就会把游戏的当前状态存到纸质内存里。
这个游戏用到的数据特别少,只占了前8字节:前两个值是球的x、y坐标,第三、第四个值记录球的运动方向,第五、第六个字节分别存玩家和AI的球拍位置,最后两个字节用来记双方的得分。
游戏跑起来完全没问题,还能把进度完整存到纸上,下次开机直接输入对应的数值,就能从上次的存档点接着玩。
最后的压轴测试我选了自己设计的文字冒险游戏,名字叫《杂货店》,剧情设定是主角是个小孩,打烊之后被困在了杂货店里,所有玩法和剧情都是我自己想的,代码直接用AI生成。
我还特意做了个印着吃豆人图案的特别版纸内存条,容量还是64字节。
这个游戏运行得也很顺利,可以把当前进度、角色位置、物品栏所有信息都存到纸上。我特意让代码在加载存档之前先清空原有内存,完全不存在提前作弊造假的情况。
后来我试着手动修改纸上记录的数值,想直接编辑物品栏,结果直接触发了段错误——说不好我还是全世界第一个用普通白纸触发段错误的人。
整个项目折腾下来,我用掉的纸比之前预想的少太多了。我真的用一摞普通白纸做成了能用的内存条,还在上面成功跑起来两款小游戏。祝你今天也玩得开心!
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.