百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ahcoder 2025-04-08 11:08 8 浏览

当我们高中时期还苦战在题海中时,别人家的小孩已经开源了一个又一个项目,真是让人佩服。


近日,一位开源爱好者 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)

相关推荐

Linux 6.15将更新媒体子系统:高通Iris驱动首次亮相

IT之家3月24日消息,科技媒体phoronix昨日(3月23日)发布博文,报道称Linux6.15内核将于本周启动合并窗口,首批提交的PullRequest请求之一,就...

Ubuntu 25.04发行版登场:Linux 6.14内核,带来多项技术革新

IT之家4月18日消息,科技媒体linuxiac昨日(4月17日)发布博文,报道称代号为PluckyPuffin的Ubuntu25.04发行版正式上线,搭载最新Linu...

WordPress 6.8 版本发布:聚焦性能升级,代号“Cecil”

WordPress6.8版本发布:聚焦性能升级,代号“Cecil”全球最受欢迎的内容管理系统(CMS)WordPress正式推出最新版本6.8,代号“塞西尔”(Cecil),以此致敬传奇钢琴家...

Linus Torvalds接受微软Hyper-V升级 下一代Linux启动会更快

虽然Windows的粉丝和Linux的粉丝经常喜欢进行激烈的键盘大战,但操作系统的制造商们自己也了解彼此的优缺点。毫无疑问,微软也明白这一点,事实上,它甚至鼓励用户尝试Linux,尽管是使用...

Debian 12发布:Linux内核升级6.1(debian更新内核)

IT之家6月11日消息,Debian是最古老的GNU/Linux发行版之一,也是许多其他基于Linux的操作系统的基础,包括Ubuntu、Kali、MX和树莓派OS等。这...

Linux Mint预告新功能:升级Nemo搜索、LMDE 7支持OEM安装

IT之家4月10日消息,LinuxMint发布了最新月度简讯,宣布增强Nemo文件管理器的文件搜索功能、Cinnamon桌面环境开始支持Wayland、LMDE7(LinuxM...

Linux 6.2合并大量网络系统更新:推进Wi-Fi 7和800 Gbps网络

IT之家12月15日消息,Linux6.2合并窗口期内已经确认将会合并大量网络子系统更新。和以往版本相同,Linux6.2内核更新周期在网络功能上有大量的改进,更多的细节可以访问这条...

Linux内核升级实践指南(linux内核怎么升级)

Linux内核升级是一个需要谨慎操作的过程,但掌握正确方法后可以显著提升系统性能、安全性或硬件兼容性。以下是一份详细的实践指南,涵盖主流方法及注意事项:一、准备工作查看当前内核版本bashuname...

Linux又将迎来大版本更新 5.20版可能会被称为Linux 6.0

如果你错过了昨天Linux5.19的发布公告,那么这一消息需要回顾一下:被称为Linux5.20的开发中的内核很可能会被称为Linux6.0。根据LinusTorvalds对现代版本的划分,L...

周六的娱乐就是安装一台OracleLinux虚拟机(一)

每个人有每个人的娱乐方式。老父亲可能喜欢摆弄一些机械工具修修补补。我趁着周六安装一套OracleLinux,寓学于乐。在oracle网站上,下载VirtualBox,现在最新版本是7.0.8。在安装过...

Linux系统下Gaussian 16的安装(linux系统如何安装新软件)

Gaussian是目前使用最多的量子化学计算软件,当前最新的版本为Gaussian16C.01。理论上来说Gaussian并不需要安装,因为高斯一般是不出售源代码的,只有二进制文件,以Gaussi...

「Linux基础」VMWare虚拟机安装CentOS后配置静态ip

在VMWare中安装本地虚拟机CentOS7操作系统,动态IP地址会经常变化,不便于管理与实验。为了便于实验,考虑设置成静态IP地址,目标是本地局域网可以通过NAT网关互相访问,且能连接互联网。由于是...

Win10虚拟机,Hyper-V安装CentOS,一次成功

打开控制面板,选择程序选择启用或关闭Windows功能选中Hyper-V下所有的组件。提示我们需要,重启计算机,保存我们的文件,之后点击“立即重新启动”选择开始菜单,输入Hy,就可以打开虚拟机管理器了...

如何在Windows 10中的Hyper-V虚拟机上安装CentOS Linux

注意双重引导的一种可行且相当不错的替代方法是在虚拟机上安装各种操作系统。Microsoft正式支持CentOS作为Hyper-V的来宾OS,并且在安装时可以很好地集成。自CentOS6.4版以来,用...

安装Linux虚拟机的5个理由,以及不安装的5个原因

虚拟机(VM)允许你在不永久更改计算机的情况下探索Linux。如果你对Linux很好奇,但犹豫是否要尝试,VM提供了一个安全、灵活的解决方案。如果这是你第一次听说虚拟机,虚拟机就像“计算机中的计算机”...