Rust ha ganado suficiente popularidad a tal grado de que se ha convertido en uno de los elegidos para integrarse como lenguaje secundario en Linux, asi como también en otros sistemas operativos, tal es el caso de Android, que ya cuenta con parte de código en Rust, Windows que también le ha dado el visto bueno, entre otros.
Rust ha demostrado ser un lenguaje robusto y que ha generado tal confianza que incluso se han creado ya algunos sistemas operativos con este lenguaje de programación y solo por mencionar algunos tenemos a Redox, también tenemos a Kernels escritos desde cero como por ejemplo Kerla o el Kernel utilizado en el satélite que recientemente lanzo china.
La razón de mencionar esto, es que hace poco me encontré con una noticia que llamo mi atención y es que se presentó un proyecto en el cual se desarrolla un Kernel escrito en Rust y el cual es parcialmente compatible con Linux.
El nombre de este proyecto es «Maestro» y como se mencionó, es un kernel similar a Unix escrito en Rust implementando un subconjunto de llamadas al sistema del kernel de Linux suficientes para crear entornos de trabajo estándar. Como tal, el proyecto de «Maestro» no es algo nuevo, pues el desarrollador menciona que el proyecto nació en el año 2018, pero en ese momento estaba escrito en C y por las diferentes bondades y características de Rust, el proyecto fue reescrito desde cero.
En la página del proyecto se describen las razones del cambio:
En ese momento decidí cambiarme a Rust (mi primer proyecto en este lenguaje), lo que representó varias ventajas:
- Reinicie el proyecto desde el principio, utilizando las lecciones aprendidas de errores anteriores.
- Sea un poco más innovador que simplemente escribir un kernel similar a Linux en C. Después de todo, simplemente use Linux en ese momento.
- Utilice la seguridad del lenguaje Rust para aprovechar algunas dificultades de la programación del kernel. El uso del sistema de escritura de Rust permite transferir parte de la responsabilidad sobre la seguridad de la memoria del programador al compilador.
En el desarrollo del kernel, la depuración es muy difícil por varias razones:
- La documentación suele ser difícil de encontrar y las implementaciones del BIOS pueden tener fallas (más a menudo de lo que cree).
- Al arrancar, el kernel tiene acceso total a la memoria y puede escribir donde no debería (su propio código, por ejemplo).
- Solucionar problemas de pérdidas de memoria no es fácil. No se pueden utilizar herramientas como valgrind.
- gdb se puede usar con QEMU y VMWare , pero el kernel puede tener un comportamiento diferente cuando se ejecuta en un emulador o máquina virtual diferente. Además, es posible que esos emuladores no sean compatibles con gdb (por ejemplo, VirtualBox ).
- Faltan algunas funciones en el soporte para gdb en QEMU o VMWare y gdb puede incluso fallar en ocasiones
En relación con las características del proyecto, se destaca que el Kernel es monolítico y actualmente solo es compatible con sistemas x86 en modo de 32 bits. La base del código del kernel abarca cerca de 49 mil líneas, siendo ejecutable tanto en hardware real como en entornos virtualizados, como QEMU o VirtualBox.
En el desarrollo actual de «Maestro», se han implementado el 31% (135 de 437) de las llamadas al sistema Linux. Esto es suficiente para cargar un entorno de consola basado en Bash y la biblioteca C estándar Musl. Además, el entorno basado en Maestro puede ejecutar algunas utilidades de la suite GNU coreutils y una paquetería básica de cualquier sistema Unix. Actualmente, se está trabajando en la implementación de una pila de red y también se está trabajando en el desarrollo de un servidor X11, un administrador de paquetes, un cargador de arranque, un instalador y otras utilidades esenciales para construir un sistema operativo.
Entre las funciones disponibles de Maestro se destacan las siguientes::
- Controladores para teclado y terminal PS/2 con modo texto y soporte parcial para secuencias ANSI.
- Sistema de asignación de memoria con soporte para memoria virtual.
- Programador de tareas basado en el algoritmo round-robin con soporte para señales POSIX.
- Definición de dispositivos PCI.
- Controlador IDE/PATA.
- Sistema de archivos Ext2.
- Soporte para sistemas de archivos virtuales /tmp y /proc.
- Capacidad para montar particiones de disco FS, MBR y GPT.
- Soporte de initramfs.
- Controlador RTC para temporizador y hora precisa.
- Soporte para cargar módulos del kernel.
- Capacidad para ejecutar archivos ejecutables en formato ELF.
Para los interesados en poder conocer un poco más sobre el proyecto, pueden consultar los detalles en el siguiente enlace. En cuanto a los interesados en el código del proyecto, deben saber que este se distribuye bajo la licencia MIT.