Marco para escribir controladores seguros para el kernel de Linux en Rust

Josh Triplett, que trabaja en Intel y forma parte del comité que supervisa el desarrollo de Crates.io, hablando en la Cumbre de Tecnología de Código Abierto presentado un grupo de trabajo destinado a equiparar el lenguaje Rust con el lenguaje C en el campo de la programación de sistemas.

En un grupo de trabajo que está en proceso de creación, los desarrolladores de Rust, junto con ingenieros de Intel, prepararán especificaciones que definan la funcionalidad que debe implementarse en Rust para la programación de sistemas. La programación del sistema a menudo requiere manipulación de bajo nivel, como ejecutar instrucciones privilegiadas del procesador y obtener información detallada sobre el estado del procesador. De las características similares que ya se están desarrollando para Rust, se destaca la compatibilidad con estructuras sin nombre, uniones, inserciones en lenguaje ensamblador (la macro “asm!”) y el formato de número de punto flotante BFLOAT16.

Josh cree que el futuro de la programación de sistemas pertenece a Rust, y el lenguaje C en la realidad moderna está reclamando el lugar que en años pasados ​​ocupaba Assembly. Óxido
no solo libera a los desarrolladores de los problemas inherentes al lenguaje C que surgen debido al trabajo de bajo nivel con la memoria, sino que también brinda la oportunidad de utilizarlo en el desarrollo de paradigmas de programación modernos.

En progreso discusiones actuaciones
A Josh se le ocurrió la idea de agregar la capacidad de desarrollar controladores en el kernel de Linux en lenguaje Rust, lo que permitiría crear controladores mejores y más seguros con el mínimo esfuerzo, libres de problemas como el acceso a la memoria después de la liberación, null desreferencias de puntero y desbordamientos de búfer.

Greg Kroah-Hartman, responsable de mantener la rama estable del kernel de Linux, expresó su disposición a agregar al kernel un marco para desarrollar controladores en lenguaje Rust si tiene ventajas reales sobre C, por ejemplo, proporcionará seguridad enlaces sobre la API del kernel. Además, Greg considera este marco solo como una opción, no activa de forma predeterminada, para no incluir Rust como una dependencia de compilación en el kernel.

Resultó que varios equipos ya están trabajando en esta dirección. Por ejemplo, los desarrolladores de la empresa "Fish in a Barrel" подготовили un conjunto de herramientas para escribir módulos cargables para el kernel de Linux en el lenguaje Rust, utilizando un conjunto de capas abstractas sobre las interfaces y estructuras del kernel para aumentar la seguridad. Las capas se generan automáticamente en función de los archivos de encabezado del kernel existentes utilizando la utilidad enlazar. Clang se utiliza para construir capas. Además de las capas intermedias, los módulos ensamblados utilizan el paquete staticlib.

Paralelo está desarrollando Otro proyecto se centró en el desarrollo de controladores para sistemas integrados y dispositivos IoT, que también utiliza bindgen para generar capas basadas en archivos de encabezado del kernel. El marco le permite mejorar la seguridad de los controladores sin realizar cambios en el kernel; en lugar de crear niveles de aislamiento adicionales para los controladores en el kernel, se propone bloquear los problemas en la etapa de compilación utilizando el lenguaje Rust, más seguro. Se supone que este enfoque puede ser solicitado por los fabricantes de equipos que desarrollan apresuradamente controladores propietarios sin realizar una auditoría adecuada.

Aún no se ha implementado toda la funcionalidad prevista, pero el marco ya es bastante adecuado para el trabajo y se utilizó para escribir un controlador funcional para el controlador Ethernet USB LAN9512 suministrado en la placa Raspberry Pi 3. El controlador smsc95xx existente, escrito por en lenguaje C. Cabe señalar que el tamaño del módulo y la sobrecarga de los componentes en tiempo de ejecución al desarrollar un controlador en Rust son insignificantes, lo que permite utilizar el marco para dispositivos con recursos limitados.

Fuente: opennet.ru

Añadir un comentario