6MB PDF竟能运行Linux?这名高中生在PDF里玩DOOM后,再“整活”!

CSDN 2025-02-20 10:49:01
当我们高中时期还苦战在题海中时,别人家的小孩已经开源了一个又一个项目,真是让人佩服。
 
近日,一位开源爱好者 Ading2210 尝试把 Linux 内核放进 PDF 里,不过他并不是想把它当作普通的源代码展示,而是让它变成一个能启动的操作系统。
 
最终,这项尝试不仅成功了,在 Chrome 浏览器中打开这个 PDF(https://linux.doompdf.dev/linux.pdf)就能运行 Linux 操作系统了,更令人惊讶的是,他还只是一位对编程、网络开发和网络安全感兴趣的高中生。
 
Ading2210 尝试之后也直接将代码在 GitHub 上开源出来(https://github.com/ading2210/linuxpdf),供大家学习参考。截至目前,该项目已在 GitHub 上获得 2.4k 个 Star,引得不少开发者围观。

 

一、想要用 PDF 运行“一切”的开发者

 

这个项目名为 LinuxPDF。打开 PDF 文档之后启动 Linux 的界面如下,其顶部是一个欢迎界面,下方有一个虚拟键盘,输入就是点击这个虚拟键盘来实现。整体页面设计得较为简洁:
 
 
据外媒 Tomshardware 报道,这个 LinuxPDF 项目只有 6MB,此次尝试也被视为 PDF 运行了一个最小系统。
 
Ading2210 开发这个项目的原因,源于他很多天马行空的创意和在 GitHub 上不断进行的各种开源尝试。他似乎有一个大胆的想法,那就是通过 PDF 运行“一切”。
 
 
在 GitHub 上,Ading2210 解释道,在很多人的认知中,PDF 文件就是一个用来存储静态文档的工具,但实际上,PDF 文件格式是支持 JavaScript 的,而且它有着自己独立的标准库。
 
现代浏览器(如 Chromium、Firefox)将这一功能作为它们的 PDF 引擎的一部分进行实现。然而,这些浏览器中提供的 API 功能非常有限。
 
Ading2210 指出,实际上,Adobe Acrobat 是唯一一个完整实现了 PDF 中 Javascript 规范的软件。这个规范包含一些非常复杂的功能,比如能够进行 3D 渲染、发起 HTTP 请求,甚至检测用户系统上连接的所有显示器。然而,出于安全原因,Chromium 和其他浏览器仅实现了这个规范中的一小部分。因此,虽然我们日常可以在 PDF 中进行一些操作,但输入输出功能非常有限。
 
于是,Ading2210 就想着自己能否打破这些限制,让 PDF 变得更有用,这就有了后续这些操作。
 
在实现 LinuxPDF 项目之前,他第一次尝试将经典游戏《毁灭战士》(Doom)移植到了 PDF 中。
 
Ading2210 发现,使用旧版本的 Emscripten(基于 LLVM / Clang 的编译器,旧版本针对 asm.js 而非 WebAssembly)可以将 C 代码编译为 asm.js,这意味着代码可以在浏览器 PDF 引擎受限的 JavaScript 运行时内顺利运行。
 
在 DoomPDF 的尝试中,Ading2210 称,编译运行起来很容易,键盘输入也很方便,因为输入通过 Chromium PDF 引擎对文本框和按钮的支持来实现,游戏中的移动、地图和武器控制都可以操作。
 
整体来看,启动 DoomPDF 后,PDF 渲染的画面细节适中,但存在色深低和对比度不足的问题。
 
 
Ading2210 解释说,之前的 PDF 游戏使用的是更简单的单个文本字段,可以通过开关控制来创建单独的像素。然而,如果每个像素都用一个单独的文本字段表示,那么要显示一个 320 x 200 分辨率的图像,总共需要 320 x 200 = 64,000 个文本字段。为了更新图像或动画,每个像素的显示状态(即文本字段的内容)都需要被单独切换。因此,为了快速显示图像或动画,必须迅速切换这 64,000 个文本字段,这在性能上是非常困难的,所以这种方法被认为不可行。
 
因此,Ading2210 没有使用文本框来表示每个像素,而是为游戏屏幕中的每一行使用了单独的文本框,并用 ASCII 字符表示六种灰度,这足以让游戏的内容清晰可见。这种渲染方法的性能据说能达到每帧大约 80 毫秒(约 12.5 帧每秒),Ading2210 坦言,这种方法的性能相当差,但可以玩起来也不成问题(https://doompdf.pages.dev/doom.pdf)。

 

二、在 Chrome 浏览器中,打开 PDF 运行 Linux

 

有了上面这一次成功的经验,Ading2210 心想,既然游戏可以成功运行在 PDF 里面,那其他的东西比如说 Linux 系统是否可以,于是这便有了文章伊始提到的 LinuxPDF 项目。
 
 
根据 Ading2210 透露,此次是通过基于 TinyEMU 的 RISC-V 模拟器在 PDF 文件内部运行的 Linux。
 
和 DoomPDF 一样,Ading2210 也是使用旧版的 Emscripten 工具,将 C 语言代码编译为 asm.js 以在 PDF 中运行。
 
借助这个工具,Ading2210 将修改版的 TinyEMU RISC-V 模拟器(https://bellard.org/tinyemu/)编译为 asm.js 代码,并让它在 PDF 中运行。
 
为了处理输入和输出,Ading2210 复用了之前在 DoomPDF 项目中使用的显示代码,即为每一行像素设置一个独立的文本框,内容是不同的 ASCII 字符来工作。对于输入,Ading2210 通过一堆按钮创建了一个虚拟键盘,并且还提供了一个文本框,用户可以在其中输入内容,将按键命令发送给虚拟机。
 
 
不过,Ading2210 称,这个 LinuxPDF 项目也存在一些性能问题,其中 Linux 内核在 PDF 中启动时大约需要 30 到 60 秒,这比正常启动慢了 100 倍以上。遗憾的是,由于 Chrome 的 PDF 引擎使用的 V8 引擎禁用了即时编译(JIT)功能,导致性能非常差,目前无法解决这个问题。
 
关于根文件系统,Ading2210 提供了 64 位和 32 位两个版本。默认的是一个 32 位的 Buildroot 系统(这个系统是预先构建好的,取自 TinyEMU 的示例),另外还有一个 64 位的 Alpine Linux 系统。64 位 Alpine Linux 系统也可用,但速度只有一半,因此通常不使用它。
 
最后,值得注意的是,目前如果你想尝试 LinuxPDF,它需要在一个基于 Chromium 的浏览器才能正常运行(如 Chrome 或者微软的 Edge,其他浏览器暂不支持)。
 
对于这一次尝试,既有佩服高中生能力的声音,也有人感叹:PDF,才是真正的通用应用平台。感兴趣的小伙伴可以自行查看 GitHub 项目中的源代码(https://github.com/ading2210/linuxpdf),该项目在 GPLv3 下获得许可,也可以直接试用 LinuxPDF:https://linux.doompdf.dev/linux.pdf 。

 

>>>>

参考

 

  • https://news.ycombinator.com/item?id=42959775

  • https://www.tomshardware.com/software/linux/minimal-linux-os-runs-in-a-6mb-pdf-document-in-chrome-linuxpdf-leverages-risc-v-emulator

  • https://github.com/ading2210/linuxpdf

     

     
 

整理 | 苏宓

出品 | CSDN

  本文经授权转载自微信公众号「CSDN」(ID:csdnnews)
最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告