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

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

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

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


近日,一位开源爱好者 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基础命令之zip、unzip命令(linux zip指令)

zip命令是linux系统下压缩文件的命令,后缀为.zip。unzip命令是对zip压缩包进行解压,和tar命令不同,tar命令是支持压缩和解压的命令语法格式:zip参数压缩名称要进行压缩的目录...

Linux:基础命令讲解实例(九)(linux13个基础命令)

前言大家好!本次我们详细介绍Linux系统中两个重要的命令:tar和zip。tar用于打包和解压文件,而zip用于创建和解压ZIP压缩文件。tar命令tar命令用于打包和解压文件...

Linux应用打包格式Flatpak风光背后,核心开发陷入停滞

IT之家5月24日消息,在今年4月召开的Linux应用峰会(LAS)上,GNOME项目成员、RedHat员工SebastianWick指出,Flatpak这一应用打包格式...

深入学习IO多路复用select/poll/epoll实现原理

Linux服务器处理网络请求有三种机制,select、poll、epoll,本文打算深入学习下其实现原理。0.结论本文其他的内容主要是得出了下面几个结论:服务器要接收客户端的数据,要建立sock...

X11退场,Ubuntu 25.10发行版全面拥抱Wayland

IT之家6月12日消息,科技媒体linuxiac昨日(6月11日)发布博文,报道称Canonical宣布自Ubuntu25.10开始,将彻底移除基于Xorg的GNOM...

最火的 CI/CD 平台 Jenkins 详细搭建教程(for Linux)

在正式学习Jenkins之前我们需要对两个名词有一定了解,其一是DevOps,另外一个就是CI/CD。何为DevOps?来自wiki百科介绍DevOps是一系列软件开发实践,强调开发人员(Dev)和测...

Window安装Linux子系统(win10安装linux子系统 图形界面)

目前程序开发过程中使用的很多中间件在生产环境中都是稳定运行在linux系统上的,虽然有一些中间件提供了Windows的版本,但是可能存在一定的差异,为了更好的学习建议准备一个linux环境运行这些中间...

Linux下Qt桌面应用的开发流程(qt程序能否运行在linux)

在Linux下开发Qt桌面应用的完整流程可分为以下六个核心阶段,结合Qt框架特性和Linux环境特点进行优化。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。一、环境搭建与配置1安装...

搭建Oracle数据库服务器(oracle数据库服务器部署)

【十一】搭建Oracle数据库服务器下面介绍Oracle12c_R2的安装。一)建用户,组,目录,权限1)创建用户和组有两个组,oinstall是主组,dba是附组:[root@alex~]#g...

linux实例之创建service服务(linux 制作服务)

前面我们讲过可以通过service命令来启动,重启,停止指定的服务程序。service服务可以在系统启动时,自动运行该服务,我们可以利用这一特点,创建service文件,并且让系统重启时,自动执行命令...

Linux编程Shell之入门——Shell select in循环详解

select循环是一种用于创建交互式菜单的特殊循环结构。它允许用户从预定义的选项列表中进行选择,并根据选择执行相应的操作。select循环在交互式shell脚本中非常有用。下面是select...

安装Linux之前必备知识(安装linux之前必备知识的软件)

内容提要1、磁盘分区的相关概念2、使用静态分区的缺点3、LVM的相关概念磁盘分区在安装Linux以前,首先应该了解一些关于硬盘分区的知识。现代操作系统无一例外地使用了虚拟内存技术。Windows系统使...

Linux开机自启全攻略:找到最适合你的方法

今天一个linux的开机自启,折腾了两个小时,好好的梳理下以备不时之需。接触linux15年了。这点小知识还是没摸透。在Linux中设置开机自启动。除了"systemd"以外还有以下有...

麒麟 v10 系列单用户模式(麒麟v10 bond)

起因:因为操作系统有关键性文件被删除了,导致系统出现了问题,需要进行修复系统,这个时候只能进去单用户模式去修复,然后我安装centos系的方法重启按e,没想到需要输入账号密码,我输入了root的账号密...

Linux中的sudo功能(linux里的sudo)

sudo是Linux系统中一个非常重要的工具,他允许普通用户以超级用户(root)或其他用户的权限执行命令。以下是sudo命令功能的详细介绍:sudo的基本功能权限提升:允许普通用户执行需要超级用户权...