Las cosas se están oxidando en Kernel Land

Las cosas se están oxidando en Kernel Land

Está cobrando impulso los angeles thought de agregar Rust al kernel de Linux. ¿Por qué exactamente es tan importante y qué significa esto para el resto de nosotros? El kernel de Linux ha sido solo C y ensamblaje durante toda su vida. Un gran proyecto como el kernel tiene una gran cantidad de herramientas compartidas para hacer que sus lenguajes funcionen, por lo que agregar otro es una gran tarea. También está los angeles cultura del proyecto desarrollada en torno a los angeles elección del idioma. Entonces, ¿por qué exactamente las barbas grises del desarrollo del kernel incluso están considerando los angeles thought de agregar Rust? Para responder en una sola línea, es porque C fue diseñado en 1971 para ejecutarse en las minicomputadoras de Bell Labs. Si quieres pegarte un tiro en el pie, C te entregará el arma cargada.

Por otro lado, si desea escribir un kernel, C es un gran lenguaje para hacer codificación de bajo nivel. ¿Memoria de acceso directo? Sí. ¿Montaje en línea? Por supuesto. ¿Se ejecuta directamente en el steel, sin recolección de basura o máquinas virtuales en el camino? Absolutamente. Pero todas las cosas que hacen que C sea excelente para los angeles programación del núcleo también hacen que C sea peligroso para los angeles programación del núcleo.

Ahora escucho sus teclados colectivos chasquear con consternación: “¡Es posible escribir código C seguro!” Sí, sí es posible. Es muy fácil estropearlo, y cuando lo estropeas en un kernel, tienes vulnerabilidades de seguridad. También hay algunas cosas que son objetivamente horrible sobre C, como un comportamiento indefinido. Los compiladores de C hacen todo lo posible para hacer lo correcto con código maldito como i++ + i++; o a[i] = i++;. Pero es casi seguro que no va a hacer lo que usted quiere, y lo que es peor, puede algunas veces hacer lo correcto.

Rust parece estar ganando popularidad. Hay algunos proyectos ambiciosos por ahí, como reescribiendo coreutils en Rust. Muchas otras aplicaciones estándar están recibiendo una reescritura de Rust. Es bastante inevitable que los angeles colección de desarrolladores de Rust comenzara a preguntarse, ¿podríamos invadir el kernel a continuación? Esto fue lanzado para una conferencia de fontaneros de Linux, y la respuesta de la lista de correo generation cautelosamente optimista. Si se pudiera agregar Rust sin romper las cosas y sin perder las mismas cosas que hacen que Rust sea útil, entonces sí, sería interesante.

¿Por qué se oxida?

Entonces, ¿qué hace que Rust sea tan interesante? Hay dos respuestas principales aquí. Primero, es un lenguaje moderno con una fuerte garantía de seguridad de los angeles memoria. (Hay una advertencia aquí, y cubriremos el código no seguro más adelante). Alrededor de dos tercios de todas las vulnerabilidades de seguridad son el resultado de errores en el manejo de los angeles memoria, y Rust prácticamente los elimina. Una segunda ventaja, Rust tiene algunas de las sutilezas que hemos llegado a apreciar en los lenguajes modernos, como un fácil de usar STRING escriba integrado en los angeles biblioteca estándar y algunas funciones útiles para escenarios comunes como los angeles comparación de cadenas.

L. a. otra respuesta es que Rust encaja fácilmente con el código C y los angeles programación del kernel. Rust hace su magia en el compilador. El código que escribe es lo que realmente se ejecuta, sin un intérprete o una recolección de basura que intente ser útil. Rust no ha tenido una sobredosis de patrones orientados a objetos, pero encaja muy bien con las estructuras de estilo C que ya se utilizan en el núcleo. Incluso el modelo de pila es muy equivalent a C.

Hay un problema con los angeles garantía de memoria segura de Rust: es imposible escribir un núcleo que sea formalmente seguro para los angeles memoria. Un kernel tiene que escribir en los angeles memoria no asignada, hacer matemáticas de punteros extraños y otras cosas aparentemente extrañas para que nuestras computadoras funcionen. Esto no funciona bien con un lenguaje que intenta garantizar que las manipulaciones de los angeles memoria sean seguras. Entonces, ¿cómo se escribe el código del kernel con Rust? Rust ha añadido el unsafe palabra clave, lo que permite el uso de acceso directo a los angeles memoria y otras técnicas similares que no funcionan con las garantías de memoria de Rusts. Mantenga los problemas potenciales juntos y hará que los angeles auditoría sea más fácil.

Hay al menos otro lenguaje que puede venir a los angeles mente como una actualización incremental de C que intenta hacer algunas de estas cosas: C++. Seguramente esto habría sido aún mejor, ¿verdad? Los desarrolladores del kernel tienen algunos sentimientos fuertes sobre esa idea. Para decirlo suavemente, ninguna de las mejoras en C++ es útil en el contexto del kernel, y algunos de los otros cambios simplemente se interponen en el camino.

¿Cuál es el plan?

Entonces, ¿estamos a punto de ver el kernel completamente reescrito en Rust? No es possible. El proceso de desarrollo del kernel es minuciosamente conservador, por lo que los angeles introducción inicial de Rust se realizará de los angeles manera menos intrusiva posible: el código del controlador. Como segundo al mando del kernel [Greg Kroah-Hartman] dicho, “los controladores son probablemente el primer lugar para un intento como este, ya que son las ‘hojas finales’ del árbol de dependencias en el código fuente del núcleo. Dependen de los angeles funcionalidad central del kernel, pero nada depende de ellos”.

En los angeles práctica, esto significaría que las herramientas, los angeles documentación y el código de ejemplo se fusionarían en el kernel de inmediato. En algún momento en el futuro, una de las partes interesadas, como Google, comenzaría a escribir nuevos controladores en Rust. Google parece estar muy interesado en convertir partes de Android a Rust, probablemente en un intento de frustrar el continuo pwnage de su sistema operativo por parte del grupo NSO. Hay un controlador de ejemplo útil en Rust en el blog de seguridad de Google. Otra conexión interesante es que [Miguel Ojeda]desarrollador predominant del proyecto Rust for Linux, ahora está empleado a tiempo completo por Prossimo para ese propósito. Prossimo es un brazo del Grupo de Investigación de Seguridad de Web, que también es famoso por liderar Let’s Encrypt. Financiamiento para [Ojeda]El trabajo de fue proporcionado por Google.

Entonces, ¿dónde estamos ahora? Versión 6 de los parches de Rust fueron enviados a los angeles lista de correo del kernel. Ha habido un par de solicitudes de cambios muy menores, pero lo más notable es que los desarrolladores han comenzado a solicitar que los parches se introduzcan en el kernel 5.19 una vez que se abra los angeles ventana de combinación. 5.18-rc6 acaba de ser lanzado, por lo que en dos o tres semanas deberíamos ver que el kernel acuña una versión ultimate y se abre los angeles ventana de combinación 5.19. Así es, ¡hay muchas posibilidades de que veamos Rust agregado al kernel de Linux en unas tres semanas!

Una vez que finalmente aterrice, espere ver un controlador easy que realmente haga uso del soporte en los angeles siguiente versión. Entonces, si 5.19 ve el soporte de Rust, un controlador escrito en rust probablemente ocurrirá en 5.20. Como se insinuó anteriormente, Google es una de las partes muy interesadas en el esfuerzo de Rust para Linux. Es possible que algunos códigos relacionados con Android se transfieran a Rust, como parte del esfuerzo continuo de Google para mejorar los angeles seguridad de su ecosistema móvil.

¿Qué podría salir mal?

Rust en Linux es casi seguro que sucederá, pero ¿se garantiza que sea algo bueno? Hay algunas desventajas posibles a considerar. En primer lugar, los angeles interfaz entre C y Rust es un lugar possible para que surjan errores inesperados. Es un código nuevo, parte de él generado automáticamente, que hace algo novedoso; sin duda habrá sorpresas. Eso no es realmente más problema que cualquier otro código nuevo. Los errores se arreglan, los problemas se solucionan.

Lo que puede ser más problemático es los angeles complejidad adicional de depurar problemas cuando hay otro lenguaje a considerar. Hasta ahora, el núcleo ha disfrutado de los angeles ventaja de que está todo en C y todos los programadores que trabajan en él están familiarizados con ese lenguaje. Agregue un segundo idioma, y ​​ahora hay programadores de C, programadores de Rust y los pocos que realmente dominan ambos. Hay otro compilador que posiblemente podría introducir errores y otra cadena de herramientas para administrar.

Por último, existe el peligro de que simplemente no se ponga de moda. Puede ser que los angeles comunidad del kernel se encoja de hombros colectivamente y continúe escribiendo código en C, y el soporte de Rust se pudra. Este es el problema menos problemático, porque el respaldo de grandes jugadores como Google hace que esto sea poco possible, e incluso si Rust muere en los angeles vid, es fácil eliminar el código.

¿Es possible que alguno de los problemas anteriores sea un issue decisivo? Probablemente no. L. a. adición de Rust cambiará un poco los angeles forma en que se desarrolla el kernel, y los mantenedores del kernel tendrán que refrescar sus conocimientos sobre Rust. Los beneficios potenciales parecen superar las desventajas. Torvalds parece haber aceptado los angeles thought de Rust within the kernel, una vez que se eliminan las últimas arrugas. Estamos deseando que Rust madure en Linux y les contaremos el resto de los angeles historia una vez que eso suceda.

Pasaporte En Linea