El kernel de Linux se prepara para la actualización a Rust 1.77
El paso de Linux a toolchains más nuevas de Rust, incluida la actualización planificada a Rust 1.77, está provocando debate sobre cuánto debería depender el kernel de funciones inestables del compilador y qué significa eso para el mantenimiento a largo plazo. Los comentaristas sopesan los beneficios de Rust —seguridad de memoria, abstracciones modernas y soporte evolutivo para asignadores— frente a preocupaciones prácticas como el arranque del compilador, el tamaño binario y la proporción aún diminuta de código del kernel escrito en Rust. Hay un amplio acuerdo en que Rust seguirá siendo opcional e incremental en el kernel por ahora, sirviendo como banco de pruebas para dar forma tanto al lenguaje como a sus herramientas para el trabajo de sistemas de bajo nivel.
Versionado de Rust y uso de funciones inestables en el kernel
- Para proyectos ordinarios que usan Rust estable, las actualizaciones del compilador son en su mayoría compatibles hacia atrás; herramientas como
clippyycargo fmtayudan a seguir los cambios de estilo y lint. - Rust-for-Linux usa deliberadamente funciones nightly/inestables, así que las actualizaciones pueden requerir correcciones no triviales.
- Esto se considera necesario para ejercer funciones que faltan (por ejemplo,
offset_of, APIs de asignador) y ayudar a empujarlas hacia la estabilización. - Estimación citada: ~0.5 horas por millón de líneas de Rust para actualizar compiladores en bases de código grandes; Rust-for-Linux tiene una sobrecarga mayor debido al uso de nightly.
Asignadores y gestión de memoria
- El kernel necesita asignación de memoria de granularidad fina, fallible y por tipo de objeto, lo que lo empuja hacia las APIs inestables de
Allocatoren lugar de soloGlobalAlloc. allocator_apiproporciona construcción fallible (por ejemplo,try_new) y flexibilidad que las APIs estables no tienen.- La biblioteca estándar por sí sola puede usar funciones inestables; las crates de terceros no pueden hacerlo en estable.
Tamaño binario y dependencias
- Muchas quejas sobre el tamaño binario de Rust están ligadas a:
- La maquinaria de depuración/panic (por ejemplo, backtrace, formato consciente de Unicode).
- Enlace estático de std.
- Árboles de dependencias pesados y monomorfización.
- En contextos
no-std(microcontroladores, kernel) los binarios pueden ser mucho más pequeños. - La separación de símbolos de depuración y el despojado, además de los próximos valores predeterminados de Cargo, reducirán los tamaños; pero el “hello world” de Rust sigue teniendo una sobrecarga constante relativamente grande frente a C.
- Algunos argumentan que los grandes árboles de compilación y cachés (cientos de MB) son problemáticos; otros señalan que esto es comparable con toolchains modernas y que Rust en el kernel no arrastrará grandes grafos de dependencias.
Alcance y estructura de Rust en el kernel
- El código Rust es actualmente una fracción diminuta del kernel (del orden de ~0.03–0.05% de las líneas).
- La mayor parte es infraestructura; los drivers en Rust siguen siendo “errores de redondeo”, con ejemplos como una reescritura del binder de Android.
- El kernel usa
corey unallocpersonalizado, pero nostd.
Arranque, LFS y toolchains
- Preocupación: la historia de arranque de Rust es “fea” y podría amenazar Linux From Scratch (LFS).
- Contraargumento: LFS ya asume un compilador C en el host; de forma similar podría asumir un compilador Rust en el host y usar solo
rustcpara producir archivos objeto. - En comparación con arrancar otros compiladores complejos (por ejemplo, GHC), la situación de Rust es criticada pero no única.
Seguridad de bajo nivel, punteros y elección del lenguaje
- La discusión sobre operaciones inseguras con punteros y macros frente a aritmética de punteros segura resalta sutilezas de UB y compensaciones de rendimiento.
- Aclaración de las capas de la biblioteca de Rust:
core(primitivas del lenguaje),alloc(tipos en heap),std(funciones dependientes del SO). - Algunos quieren no solo una reescritura en un lenguaje, sino verificación formal al estilo de seL4.
- Se plantea la pregunta: “¿Por qué Rust en lugar de Zig?”
- Un lado valora las fuertes garantías de seguridad de memoria de Rust.
- Otro sostiene que los errores de memoria pueden manejarse con pruebas y que la seguridad de Rust tiene sus propias compensaciones; no se alcanzó consenso.