Uno de los hechos más importantes de Linux 6 es la proliferación en su interior de código escrito en Rust, el lenguaje creado en su momento por Mozilla y que opera de manera independiente desde hace tiempo. Como suele ser habitual dentro del mundillo desde hace una década y media, la introducción de nuevas tecnologías tiende a sembrar debates, y este caso no es un excepción.
El veterano Steven Vaughan-Nichols ha hecho para ZDNet un repaso de la situación de Rust en el kernel Linux a partir de la conferencia dada por Miguel Ojeda en la Linux Plumbers Conference celebrada en la ciudad de Richmond, ubicada en el estado estadounidense de Virginia. Aquí se señalaron tanto las presuntas virtudes que debería aportar el lenguaje como algunas cosas no tan positivas que han surgido en torno a él, aunque la implementación sigue madurando y cuenta con un fuerte apoyo de compañías como Cisco, Samsung y Canonical.
Entre otras cosas recogidas están unas frases de Wedson Almeida Filho, ingeniero de software en Microsoft, quien dijo que siente “que Rust ahora está listo para unirse a C como lenguaje práctico para implementar el kernel. Puede ayudarnos a reducir la cantidad de posibles errores y vulnerabilidades de seguridad en el código privilegiado, al mismo tiempo que funciona bien con el núcleo central y preserva sus características de rendimiento”.
Llegados a este punto, nos encontramos con una de las principales promesas de Rust, y es la de mejorar la seguridad en torno a la memoria. Linus Torvalds mostró en su momento cierto escepticismo sobre esta capacidad, pero si ha dado su visto bueno a la inclusión del lenguaje, nos suponemos que se habrá convencido.
Continuando con los aspectos de la seguridad relacionados con la memoria que sobre el papel mejora Rust, los desarrolladores Alex Gaynor y Geoffrey Thomas explicaron en la Linux Security Summit de 2019 que casi dos tercios de los agujeros de seguridad que se encuentran en Linux provienen de problemas de seguridad en la memoria y que el origen está en debilidades inherentes a C y C++. Aquí es donde entraría Rust, que por su diseño debería evitar estos problemas mediante el uso de API más seguras.
Rust es un lenguaje de programación que ha despertado mucho interés, pero cuya popularidad al menos en producción sigue estando por detrás de otros que son mucho más veteranos. Su implementación dentro del kernel ha derivado en que los programadores están siguiendo la última versión del compilador de Rust, lo cual es bastante inusual en un proyecto de tendencia conservadora como Linux.
El intentar emplear la última versión del compilador de Rust ha despertado cierta preocupación entre algunos desarrolladores de Linux, en especial por el posible uso de características que todavía están consideradas como inestables y por cuestiones relacionadas con la retrocompatibilidad. El emplear cosas cuya presencia futura no está garantizada es algo que, por lógica, siembra dudas en un proyecto que necesita que sus cimientos sean lo más estables posible.
Otro asunto que ha surgido es la demanda de portar hacia atrás el soporte de Rust a versiones LTS de Linux. Una vez más, nos encontramos con la política conservadora empleada para el desarrollo del kernel, la cual tiende a no dejar la puerta abierta a portar cosas hacia atrás, aunque sea algo que se permite bajo ciertas condiciones.
Y siguiendo con más desafíos, está que los desarrolladores que programan en Rust están dispuestos a no cumplir, o al menos no cumplir del todo, la regla contra los controladores duplicados. Esto es debido a que algunos están abiertos a experimentar con el lenguaje para ver qué resultados obtienen. Aquí se suma el hecho de que la abstracción requerida para los drivers escritos en Rust no está ahí y que la fusión podría romper una regla relacionada con el desarrollo del kernel, así que Miguel Ojeda y su equipo han solicitado un excepción para los controladores hechos con el lenguaje originario de Mozilla.
Además de aspectos relacionados con la política de desarrollo del kernel Linux, también hay otros técnicos, como por ejemplo los bloqueos mutuos o deadlocks que se producen cuando dos o más procesos están esperando a que otro termine. Mientras esto resulta seguro en Rust debido a que no se da como resultado un comportamiento indefinido, en Linux no se puede decir lo mismo, así que los responsables están trabajando para resolver ese problema.
Y como último frente están las cadenas de herramientas, donde están el generador de código de GCC para rustc
(el compilador de Rust), un frontend de GCC que está en estado alfa y un port de Coccinelle, una herramienta para la comparación y transformación automática de programas que se desarrolló originalmente para realizar cambios a gran escala en el código fuente del kernel de Linux, para el lenguaje originario de Mozilla.
Como vemos, Rust habrá aterrizado en Linux, pero todavía quedan muchas cuestiones sobre cómo manejar su implementación, en especial en lo que respecta al desarrollo de controladores. El kernel ocupaba para marzo de 2022 casi 28 millones de líneas de código, así que la sustitución de C por Rust suena en estos momentos más a ciencia ficción que algo que pueda llevarse a cabo, pero a saber qué ocurrirá en el futuro lejano.
Para terminar y a modo de curiosidad, Rust no solo ha llegado al kernel Linux, sino también a la otra pata del soporte de hardware cuando se trata del sistema operativo: Mesa. Aquí nos referimos principalmente a Rusticl, un driver de OpenCL bastante prometedor que puede darle un impulso a la pila a la hora de soportar ciertas soluciones profesionales, pero habrá que ver si dichas soluciones se lo toman en serio y dan soporte a través de él si llega a un buen estado de madurez.
Fuente: muylinux