Alexander Böhm
Chemnitzer Linux Tage, 11.03.2023
- Kein Kernel-Entwickler
kleine Anpassungen & Experimente - Python, Java, C/C++
- 2017 zaghafte Versuche mit Rust
- Seit 1.5y täglich Rust
Quelle: https://github.com/torvalds/linux, (Datum 4.3.23)
- Vereinzelte Projekte mit C++ und Ada
- Out-Of-Tree Entwicklungen
- 2006 Diskussion über C++:
Absage von diversen Kernel Maintainern
- Komplexität Objekt-Orientierung
- Behandlung Sprachfunktionen?
Exceptions, Constructor, ... - Unzureichende Kompilerunterstützung
- Strittige Kompatiblität mit C
- Notwendige Kernel-Infrastruktur
Quelle: cve.mitre.org, linux kernel (Datum 4.3.23)
Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor:
We believe Rust offers key improvements over C in this domain.
Asahi Lina (M1 DRM Developer):
Rust is truly magical! [...] It really guides you towards not just safe but good design.
- Entstanden bei Mozilla 2009:
C/C++ zwar schnell, aber fehleranfällig - Einfache & sichere Parallelisierung
- LLVM-Kompiler
-
- stabiles Release 2015
- systemnahe Entwicklungen
- Strenge Typisierung
- Hohe Speichersicherheit
- Keine Garbage Collection
- Zero-Cost Abstraction
- Vergleichbare C/C++-Leistung
- Anbindung zu C
- Beispiel: Use after free
// Rufe Funktion `do_something(-1)`
void* do_something(int value) {
// Alloziiere Puffer
void* buf = malloc(1024);
if (value < 0) {
free(buf);
// Bug: return NULL vergessen
}
// Schreibe in Puffer
memcpy(buf, &value, sizeof(value));
// Gebe Pointer zurück
return buf;
}
GCC kompiliert ohne Fehler/Warnungen
fn do_something(value: i32) -> Vec<u8> {
// Alloziiere Puffer auf veränderlicher Variable
let mut buf = Vec::with_capacity(1024);
if value < 0 {
// Gebe explizit Speicher frei
drop(buf);
}
// Schreibe in Puffer
buf.copy_from_slice(&value.to_be_bytes());
// Gebe Pointer zurück
return buf;
}
Kompilerfehler
error[E0382]: borrow of moved value: `buf`
--> src/main.rs:6:5
2 | let mut buf = Vec::with_capacity(1024);
| ------- move occurs because `buf` has type ...
3 | if value < 0 {
4 | drop(buf);
| --- value moved here
5 | }
6 | buf.copy_from_slice(&value.to_be_bytes());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| value borrowed here after move
Lösung erfordert Umbau
fn do_something(value: i32) -> Option<Vec<u8>> {
let mut buf = Vec::with_capacity(1024);
if value < 0 {
// Gebe `buf` frei, da Scope verlassen wird
None
} else {
buf.copy_from_slice(&value.to_be_bytes());
// Übergebe Ownership von `buf` als Rückgabe
Some(buf)
}
}
- 2012 LLVM Linux und Clang-Support
- 2020 Linux Plumbers Conference:
Vorschlag zum In-Tree Support von Rust
Quelle: Rust for Linux, Miguel Ojeda, Wedson Almeida Filho (März 2022)
- Mitte Dezember 2022
- Minimales Kernelmodul
- Infrastruktur
Quelle: Rust for Linux, Miguel Ojeda, Wedson Almeida Filho (März 2022)
- Mitte Feburar 2023
- String-Behandlung
- Formater
- VTables-Unterstützung
- netfilter
- Moduleparameter
- Dateisystemanbindung
- TCP-Server
- Einfache Treiber (Char/Misc Device)
- Asynchronous Resource Counter
- Synchronisationsprimitive (Mutex, Semaphore)
- Rust Abhängigkeiten
rustup override set 1.62.0
rustup component add rust-src
cargo install --locked --version 0.56.0 bindgen
- LLVM/Clang Abhängigkeiten
apt-get install -y clang-11 lld-11 llvm-11
- Meist abgestimmt auf konkrete Rust-Version
*** Rust compiler 'rustc' is too new.
This may or may not work.
*** Your version: 1.67.1
*** Expected version: 1.62.0
- Führt teilweise zu Fehlern
error: the feature `core_ffi_c` has been stable since 1.64.0
and no longer requires an attribute to enable
// SPDX-License-Identifier: GPL-2.0
//! Rust module for CLT 2023
use kernel::prelude::*;
module! {
type: RustCltModule,
name: "rust_clt_module",
author: "Alexander Böhm",
description: "Rust Module for CLT 2023",
license: "GPL v2",
}
struct RustCltModule { name: &'static CStr }
impl kernel::Module for RustCltModule {
fn init(
name: &'static CStr,
_module: &'static ThisModule
) -> Result<Self> {
pr_info!("Hello CLT 2023 from kernel module {name}!");
Ok(Self { name })
}
}
impl Drop for RustCltModule {
fn drop(&mut self) {
pr_info!("Goodbye from kernel module {}!",
self.name);
}
}
make LLVM=1 bzImage modules
[ 1.023889] rust_clt_module: Hello CLT 2023 from kernel
module rust_clt_module!
[ 1.025889] rust_clt_module: Goodbye from kernel module
rust_clt_module!
- Keine Reimplementierung
- Weitere Abstraktionen für Subsysteme
- Testing
- Tooling & Infrastruktur
- Offene Fragen bzgl. Distribution
- Weitere Architekturen (aarch64)
- Android IPC Binder
- GPU Treiber für M1 (Asahi Linux)
- NVM Express Treiber
- 9p Server
- Abstimmung
- Eigene Primitive (bspw.
Arc
) - Kompiler-Anpassung
- Frontend für GCC
- Erste experimentele Version
für GCC 13.1 - 2023: Test Suite v1.49 bestehen
- Kein Borrow-Checker
- Ermöglicht mehr Architekturen
- Zugriff auf GCC-Tooling
- Rust ist im Kernel angelangt
- Schnelle Entwicklung
- Potentiale für sicheren Code
- Zahlreiche offene Themen
Folien & Beispiele: https://github.com/aboehm/CLT2023-rust-im-linux-kernel
- Rust For Linux
- LKML: Vorschlag für Unterstützung von "in-tree" Rust Support
- Google Security Blog: Memory Safe Languages in Android 13
- Linus Torvalds über C++ Pushbacks
- Stackoverflow Developer Survey 2022
- LWN: A first look at Rust in the 6.1 kernel
- LWN: A pair of Rust kernel modules
- Asahi Linux: Tales of the M1 GPU
- How Rust supports the Linux Kernel
- Rust for Linux by Miguel Ojeda and Wedson Almeida Filho - Rust Linz, March 2022
- Rust for Linux: Status and Wishlist
- Rust for Linux, Rust CTCFT 2021
- Heise: Three Questions and Answers: Rust for Linux
- GCCRS Kompiler