开源推荐
morning
GitHub 热门项目:linuxpdf
摘要
GitHub项目:linuxpdf 仓库地址:https://github。
the
https
PDF
com
and
2026-05-26
1 阅读
GitHub Trending
GitHub 项目:linuxpdf
仓库地址:https://github.com/ading2210/linuxpdf
星级:4927 | 作者:ading2210
项目描述:Linux 通过 RISC-V 模拟器在 PDF 文件中运行
===================================================
自述文件内容:
# LinuxPDF
这是通过 RISC-V 模拟器在 PDF 文件中运行的 Linux,该模拟器基于 [TinyEMU](https://bellard.org/tinyemu/)。
在这里尝试一下:[linux.pdf](https://linux.doompdf.dev/linux.pdf)
https://github.com/user-attachments/assets/7e992dd1-41a5-4d32-87cc-878b395e3d92
另请参阅:[DoomPDF](https://github.com/ading2210/doompdf)
## 说明
这与我之前的 [DoomPDF](https://github.com/ading2210/doompdf) 项目非常相似。
您可能认为 PDF 文件仅由静态文档组成,但令人惊讶的是,PDF 文件格式通过其自己单独的标准库支持 Javascript。现代浏览器(Chromium、Firefox)将此作为其 PDF 引擎的一部分实现。然而,浏览器中可用的 API 却非常有限。
PDF 中 JS 的完整规范仅由 Adobe Acrobat 实现,并且它包含一些荒谬的事情,例如执行 [3D 渲染](https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#annot3d)、make [HTTP requests](https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#net-http),以及[检测连接到用户系统的每个监视器](https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#monitor)。然而,由于明显的安全问题,在 Chromium 和其他浏览器上,仅实现了该 API 的一小部分。有了这个,我们可以做任何我们想要的计算,只需要一些非常有限的 IO。
可以使用针对 [asm.js](https://en.wikipedia.org/wiki/Asm.js) 而不是 WebAssembly 的旧版本 Emscripten 来编译 C 代码以在 PDF 中运行。有了这个,我可以将 TinyEMU RISC-V 模拟器的修改版本编译为 asm.js,它可以在 PDF 中运行。对于输入和输出,我重复使用了与 DoomPDF 相同的显示代码。它的工作原理是为屏幕中的每行像素使用一个单独的文本字段,其内容设置为各种 ASCII 字符。对于输入,有一个由一堆按钮实现的虚拟键盘,以及一个可以键入以将击键发送到虚拟机的文本框。
这里最大的问题是模拟器的性能。例如,Linux 内核在 PDF 中启动大约需要 30-60 秒,比正常情况慢 100 倍以上。不幸的是,没有办法解决这个问题,因为 Chrome 的 PDF 引擎使用的 V8 版本有它的 [JIT 编译器已禁用](https://source.chromium.org/chromium/_/pdfium/pdfium/+/012fe571c9fe430da68dbcd2f5ba21758d b0ae15:fpdfsdk/fpdf_view.cpp;l=1211-1214;drc=b69783fd189976dd4625c7dcd9c07921b94d4a3c;bpv=0;bpt=0),破坏其性能。
对于根文件系统,有 64 位和 32 位版本。默认是 32 位 buildroot 系统(它是预先构建的,取自原始的 TinyEMU 示例),也是 64 位 Alpine Linux 系统。然而,64 位模拟器的速度大约慢两倍,因此通常不使用它。
## 构建指令