8 de febrero de 2025

Ejecutar Linux en una máquina virtual estaba muy visto: este programador ha conseguido que funcione dentro de un PDF

Ejecutar Linux en una máquina virtual estaba muy visto: este programador ha conseguido que funcione dentro de un PDF

En el campo de la informática, a veces somos testigos de innovaciones sorprendentes como, qué sé yo, la posibilidad de ejecutar un sistema Linux completo dentro de un archivo PDF (este PDF, en concreto). Algo así carece, claro, aplicaciones prácticas inmediatas debido a sus limitaciones de rendimiento y entrada/salida, pero sienta un precedente en el mundo de la emulación y la experimentación con formatos de archivo.

Y este logro se lo debemos al desarrollador (adolescente, según su perfil de GitHub) que hace sólo unos días creó también 'DoomPDF', el proyecto que permite, como su nombre indica, jugar al histórico 'Doom' dentro de un documento PDF.

De hecho, nuestro protagonista ha reutilizado parte de ese trabajo para dar vida a este nuevo proyecto: basado en el emulador ligero TinyEMU, que permite simular arquitecturas de hardware (en este caso, un procesador RISC-V), este experimento demuestra la flexibilidad del formato PDF más allá de su uso tradicional.

Un PDF interactivo: más que texto y gráficos

Lo que se espera de los archivos PDF es que contengan meros documentos estáticos, pero este proyecto desafía esa idea preconcebida al demostrar que los PDF pueden ejecutar JavaScript. Los navegadores modernos, como Chromium y Firefox, han implementado una versión limitada de las API de JavaScript en PDF, permitiendo cierto grado de interactividad.

Adobe Acrobat, por otro lado, ofrecería una implementación aún más completa de JavaScript, con funcionalidades avanzadas (como renderización 3D y peticiones HTTP), aunque las mismas no están presentes en navegadores debido a potenciales problemas de seguridad.

De modo que, gracias a este soporte, es posible realizar cálculos y ejecutar código dentro de un PDF, aunque con restricciones en la entrada y salida de datos. Esto ha permitido portar un emulador de RISC-V al entorno PDF, convirtiéndolo en una máquina virtual funcional dentro de un archivo.

La magia de la compilación: de C a asm.js

El emulador TinyEMU, base de este proyecto, fue modificado para ejecutarse en el entorno restringido de un PDF. Esto se logró utilizando una versión antigua de Emscripten, que permite compilar código C a asm.js en lugar de WebAssembly. Como WebAssembly es incompatible con el entorno PDF limitado que proporcionan los navegadores, asm.js era la mejor alternativa disponible.

Desafíos técnicos y rendimiento

Uno de los mayores obstáculos de este experimento ha sido el rendimiento. Debido a que la implementación de V8 en el motor PDF de Chrome tiene el compilador JIT desactivado, la emulación es extremadamente lenta. Iniciar el kernel de Linux dentro del PDF puede tomar entre 30 y 60 segundos, lo que es más de 100 veces más lento que en condiciones normales.

El sistema de archivos raíz cuenta con versiones tanto de 32 como de 64 bits. Sin embargo, la versión de 64 bits basada en Alpine Linux es aproximadamente el doble de lenta que la de 32 bits, por lo que normalmente no se utiliza.

Además, el sistema visual del emulador dentro del PDF se basa en el uso de campos de texto, donde cada fila de píxeles en la pantalla se representa con caracteres ASCII.

Y para la entrada de datos se ha implementado un teclado virtual con botones interactivos y un campo de texto donde el usuario puede escribir, enviando así pulsaciones de teclas a la máquina virtual.

Un proyecto desarrollado en tiempo récord

A pesar de los desafíos técnicos, el desarrollo de este proyecto fue sorprendentemente rápido. Gracias a la reutilización de partes del código de DoomPDF, incluyendo el script de generación de PDF y partes de los scripts de compilación, el desarrollador logró completar el trabajo en tan solo 16 horas y 39 minutos...

...lo preciso del conteo se debe a que utilizó WakaTime, una extensión de VSCode, dedicada precisamente a registrar el tiempo dedicado a proyectos de programación.

Además, la portabilidad de TinyEMU ya contemplaba compatibilidad con Emscripten, lo que facilitó su adaptación al entorno PDF. La experiencia previa del desarrollador con Emscripten y otros proyectos complejos, como la portabilidad de SuperTuxKart, también contribuyó a la rapidez del desarrollo. Al enfocarse exclusivamente en Chromium, también se logró optimizar el proceso de pruebas y depuración.

Imagen | Marcos Merino mediante IA

En Genbeta | "A nuestros políticos les flipa el PDF". Es el mejor modo de ocultar cosas a plena vista, según denuncia este ciberactivista

-
La noticia Ejecutar Linux en una máquina virtual estaba muy visto: este programador ha conseguido que funcione dentro de un PDF fue publicada originalmente en Genbeta por Marcos Merino .



☞ El artículo completo original de Marcos Merino lo puedes ver aquí

No hay comentarios.:

Publicar un comentario