当前位置: 首页 > 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 中嵌入操作系统 的创意能够启发更多创新的应用,比如:

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

相关文章:

  • win32汇编环境,窗口程序使用跟踪条(滑块)控件示例一
  • mars3d接入到uniapp的时候ios上所有地图的瓦片都无法加载解决方案
  • 使用 Notepad++ 编辑显示 MarkDown
  • wordpress主题制作
  • MybatisPlus常用增删改查
  • Citus的TPCC、TPCH性能测试
  • 蓝桥杯---颜色分类(leetcode第75题)题解
  • C语言基础13:循环结构 for和while
  • 六西格玛设计培训如何破解风电设备制造质量与成本困局
  • 【Android开发】安卓手机APP使用机器学习进行QR二维码识别
  • Zabbix-监控SSL证书有效期
  • 生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 上
  • Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统
  • 基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系
  • 游戏引擎学习第99天
  • 脉冲当量含义
  • docker compose部署flink集群
  • docker compose快速部署kafka-connect集群
  • 【核心特性】Go 模块化开发入门(go mod 深度解析)
  • 国产ARM处理器工控机如何助力企业实现自主可控?
  • dns功能及工作原理是什么?
  • Java中的Map集合与文件操作详解
  • SAP-ABAP:dialog界面中的数据块Event Block详解举例
  • PostgreSQL 开发利器:Navicat 核心功能与资源攻略
  • 飞算 JavaAI:加速 AI + 行业趋势的智能化进程
  • XZ_Mac电脑上本地化部署DeepSeek的详细步骤
  • Flink-DataStream API
  • 2.4 构建模块化应用
  • DeepSeek:从入门到精通
  • JAVA学习第二天