当前位置: 首页 > news >正文

趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统

最近,一位开源爱好者开发了一个LinuxPDF 项目(ading2210/linuxpdf: Linux running inside a PDF file via a RISC-V emulator),它的核心功能是在一个 PDF 文件中启动并运行 Linux 操作系统。它通过巧妙地使用 PDF 文件格式中的 JavaScript 功能,结合 Emscripten 技术,将一个 RISC-V 仿真器嵌入到 PDF 文件中,从而使得 Linux 系统能够在 PDF 中启动。并且可以直接在Chrome浏览器中直接打开(https://linux.doompdf.dev/linux.pdf),打开后如下图所示:

项目工作原理

1. PDF 文件支持 JavaScript

首先,提到 PDF,人们通常想到的是静态文档,通常包含文字、图片等元素,用于文档共享和打印。然而,PDF 文件实际上可以包含多种功能,包括嵌入 JavaScript。这使得 PDF 文件不仅仅局限于显示内容,还可以在其中嵌入交互式功能,甚至可以做一些很酷的计算和模拟任务。

这个项目的目的正是展示这种潜力。它通过将 RISC-V 仿真器 编译为 JavaScript,并嵌入到 PDF 文件中,模拟一个完整的 Linux 系统。虽然这并不意味着 PDF 文件会直接变成一个“操作系统”,但它展示了如何在不离开 PDF 阅读器的情况下运行一个简化的操作系统。

2. 技术实现:Emscripten 和 asm.js

为了将 Linux 系统放入 PDF 中,开发者使用了 Emscripten,一个开源工具链,能够将 C/C++ 代码编译为 JavaScript。Emscripten 支持将代码编译成两种格式:asm.js 或 WebAssembly。在这个项目中,使用的是 asm.js,一种 JavaScript 子集,专为提高性能而设计,允许 C 代码在浏览器中高效运行。

这个小小的“奇迹”是如何实现的呢?首先,开发者使用 TinyEMU,一个针对 RISC-V 架构 的仿真器,将它编译成 asm.js。这个 RISC-V 仿真器被嵌入到 PDF 文件的 JavaScript 中。换句话说,PDF 文件通过嵌入 JavaScript 代码来模拟一个完整的计算机系统。这个仿真器可以启动 Linux 内核,并运行一个简单的文件系统(带有 BusyBox)。

3. 虚拟化 Linux 系统

通过在 PDF 中嵌入该仿真器,用户可以启动一个 RISC-V 架构的 Linux 系统,尽管它的性能非常低。Linux 内核和文件系统被嵌入到 PDF 中,用户可以在 PDF 阅读器中使用它进行简单的操作。

4. 在 PDF 中交互:输入和输出

输入:

输入是通过虚拟键盘实现的,用户可以点击键盘上的按钮来向仿真器发送输入。仿真器的输入包括键盘按键,用户可以通过文本框输入命令,控制虚拟机。它还支持一些基本的输入设备模拟,如鼠标点击等。

输出:

仿真器的输出通过文本框来显示。每一行像素都对应一个单独的文本框,里面显示的是 ASCII 字符,这就是模拟器显示图形的方式。虽然这种方式比较原始,但它能够有效地在 PDF 文件中实现图形输出。

5. 解决性能问题:不可避免的“慢”速度

虽然这个项目在技术上非常有趣,但它也面临一个严重的性能瓶颈。由于 V8 引擎(Chrome PDF 引擎使用的 JavaScript 引擎)禁用了 JIT 编译,这导致代码执行效率极低,仿真速度非常慢。例如,Linux 内核启动可能需要 30 到 60 秒,这比正常运行慢了超过 100 倍!然而,这一切都可以理解,因为 JavaScript 的性能远远不如原生 C 代码,而且运行环境(PDF 阅读器)也是有限制的。

项目构建和运行

1. 克隆项目

首先,克隆该 GitHub 仓库。

git clone https://github.com/ading2210/linuxpdf.git 

2. 构建

使用虚拟环境来安装依赖:

python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
./build.sh
注意:
如果你想构建 64 位版本而不是 32 位版本,编辑 build.sh 文件,并将 BITS="32" 改为 BITS="64"。
build.sh 脚本会自动下载 Emscripten 1.39.20 版本。
你必须在 Linux 上构建。
生成的文件将位于 out/ 目录下。

3. 运行

构建完成后,你可以在本地启动一个 Web 服务器:并通过浏览器访问该 PDF 文件

cd out; python3 -m http.server

通过这些步骤,就可以通过浏览器访问该 PDF 文件,并在浏览器中运行一个嵌入了 Linux 系统的 PDF 文件,体验一个虚拟机在 PDF 阅读器中的运行。

总结

LinuxPDF 项目结合了深奥的计算机科学原理与一些非常酷的实现方式,展示了如何通过 PDF 文件实现 Linux 仿真。它不仅是对 PDF 格式潜力的挑战,也是对 JavaScript、Emscripten 和仿真技术的有趣展示。尽管这个项目的速度远远不能与传统的操作系统相比,但它却展示了PDF 文件格式在现代技术中可能扮演的新角色——不仅仅是静态文档,而是一个可以嵌入并运行计算任务的环境。这个项目证明了,PDF 不仅仅能用来展示信息,还能用来处理计算任务,甚至运行嵌入式系统。

此外,这种 PDF 中嵌入操作系统 的创意能够启发更多创新的应用,比如:

  • 在受限的环境中运行计算任务(如教育工具、嵌入式设备模拟)。
  • 用于将操作系统或应用程序打包到单一文件中,方便分发和使用。
  • 作为跨平台应用,尽管这需要处理性能和兼容性的问题。

相关文章:

  • jQuery UI 工作原理
  • C语言:指针详解
  • 深入了解 Oracle 正则表达式
  • 智能手表表带圆孔同心度检测
  • vue3:动态渲染后端返回的图片
  • 朝天椒USB服务器解决前置机U盾虚拟机远程连接
  • Python常见面试题的详解3
  • ES分词技术
  • SpringBoot:使用spring-boot-test对web应用做单元测试时如何测试Filter?
  • Redis 集群相关知识介绍
  • 小初高各学科教材,PDF电子版下载
  • 切换git仓库远程地址
  • C#windows窗体人脸识别
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atomic_cmp_set 函数
  • Django5的新特征
  • Manga Image Translator 开源 AI 漫画翻译工具的深度剖析
  • 【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​
  • ubuntu服务器 如何配置安全加固措施
  • Visual Studio 使用 “Ctrl + /”键设置注释和取消注释
  • 肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)
  • 俄乌交换205名被俘人员,俄方人员已抵达白俄罗斯
  • 言短意长|党政主官如何塑造流量城市?
  • 媒体评特朗普对进口电影征100%关税:让好莱坞时代加速谢幕
  • 牧草之王苜蓿的江南驯化史
  • 中国驻美大使谢锋:经贸关系不是零和游戏,滥施关税损人害己
  • 岳伟华任北京大学第六医院院长,陆林院士卸任