Разработчик под ником ading2210 представил проект LinuxPDF — Linux в PDF в браузере. Проект открывается только в браузерах на базе Chromium, использующих движок PDFium. Код написан на C и опубликован на GitHub по лицензией GNU General Public License v3.0.
«Это Linux, работающий внутри PDF‑файла через эмулятор RISC‑V, основанный на TinyEMU», — пояснил автор решения.
Это работает очень похоже на мой предыдущий проект DoomPDF.
Можно было бы ожидать, что файлы PDF будут состоять только из статических документов, но, как ни странно, формат файла PDF поддерживает Javascript с собственной отдельной стандартной библиотекой.
Современные браузеры (Chromium, Firefox) реализуют это как часть своих движков PDF. Однако API, доступные в браузере, гораздо более ограничены.
Полная спецификация для JS в PDF была реализована только Adobe Acrobat, и она содержит некоторые нелепые вещи, такие как возможность выполнять 3D-рендеринг, делать HTTP-запросы и обнаруживать каждый монитор, подключенный к системе пользователя. Однако в Chromium и других браузерах была реализована только крошечная часть этого API из-за очевидных проблем безопасности. Благодаря этому мы можем выполнять любые вычисления, которые захотим, просто с очень ограниченным вводом-выводом.
Код C можно скомпилировать для запуска в PDF с использованием старой версии Emscripten, которая нацелена на asm.js вместо WebAssembly. С его помощью я могу скомпилировать модифицированную версию эмулятора TinyEMU RISC-V в asm.js, который можно запустить в PDF. Для ввода и вывода я повторно использовал тот же код отображения, который я использовал для DoomPDF. Он работает, используя отдельное текстовое поле для каждой строки пикселей на экране, содержимое которого задаётся различными символами ASCII. Для ввода есть виртуальная клавиатура, реализованная с кучей кнопок, и текстовое поле, в котором вы можете ввести текст, чтобы отправить нажатия клавиш в виртуальную машину.
Самая большая проблема здесь связана с производительностью эмулятора. Например, ядру Linux требуется около 30-60 секунд для загрузки в PDF, что более чем в 100 раз медленнее, чем обычно. К сожалению, нет способа исправить это, поскольку версия V8, которую использует движок PDF Chrome, имеет отключённый JIT-компилятор, что разрушает его производительность.
Для корневой файловой системы возможны как 64-, так и 32-битные версии. По умолчанию используется 32-битная система buildroot (которая была предварительно собрана и взята из оригинальных примеров TinyEMU), а также 64-битная система Alpine Linux. Однако 64-битный эмулятор примерно в два раза медленнее, поэтому обычно он не используется.
Ранее ading2210 представил проект DoomPDF — это Doom в PDF в браузере.
В начале января разработчик Томас Ринсма выпустил проект pdftris — это тетрис в PDF в браузере.
Источник: habr.com