Rust で Linux カーネル用の安全なドライバーを作成するためのフレームワーク

Intel に勤務し、Crates.io の開発を監督する委員会の一員である Josh Triplett 氏がオープンソース テクノロジー サミットで講演 紹介された システム プログラミングの分野で Rust 言語を C 言語と同等にすることを目的としたワーキング グループです。

現在設立中のワーキンググループでは、Rust開発者はインテルのエンジニアと協力して、システムプログラミングのためにRustに実装する必要がある機能を定義する仕様を準備します。 システム プログラミングでは、特権プロセッサ命令の実行やプロセッサの状態に関する詳細情報の取得など、低レベルの操作が必要になることがよくあります。 Rust 向けにすでに開発されている同様の機能のうち、名前のない構造体、共用体、アセンブリ言語の挿入 (「asm!」マクロ)、および BFLOAT16 浮動小数点数形式のサポートが注目されています。

Josh は、システム プログラミングの未来は Rust に属し、現代の現実では、過去数年間 Assembly が占めていた場所を C 言語が占めていると信じています。 さび
これは、メモリを使用した低レベルの作業によって発生する C 言語固有の問題から開発者を解放するだけでなく、最新のプログラミング パラダイムの開発に C 言語を使用する機会も提供します。

進行中 議論 公演
Josh は、Rust 言語の Linux カーネルにドライバーを開発する機能を追加するというアイデアを思いつきました。これにより、解放後のメモリ アクセスなどの問題がなく、最小限の労力でより安全で優れたドライバーを作成できるようになります。ポインタの逆参照とバッファ オーバーラン。

Linux カーネルの安定版ブランチの保守を担当する Greg Kroah-Hartman 氏は、Rust 言語でドライバを開発するためのフレームワークが C よりも実際に優れている場合、たとえば安全な機能が提供されるのであれば、カーネルに追加する用意があると表明しました。カーネル API を介したバインディング。 さらに、Greg は、Rust をカーネルのビルド依存関係として含めないように、このフレームワークをオプションとしてのみ考慮し、デフォルトではアクティブではありません。

いくつかのチームがすでにこの方向に取り組んでいることが判明しました。 たとえば、「Fish in a Barrel」社の開発者 подготовили Linux カーネル用のロード可能なモジュールを Rust 言語で作成するためのツールキット。インターフェイスとカーネル構造上の一連の抽象レイヤーを使用してセキュリティを強化します。 ユーティリティを使用して、既存のカーネル ヘッダー ファイルに基づいてレイヤーが自動的に生成されます。 結合元。 Clang はレイヤーの構築に使用されます。 中間層に加えて、アセンブルされたモジュールは staticlib パッケージを使用します。

平行 開発中です 別のプロジェクトは、組み込みシステムおよび IoT デバイス用のドライバーの開発に焦点を当てており、これもまた、bindgen を使用してカーネル ヘッダー ファイルに基づいてレイヤーを生成します。 このフレームワークを使用すると、カーネルに変更を加えずにドライバーのセキュリティを向上させることができます。カーネル内でドライバーの追加の分離レベルを作成する代わりに、より安全な Rust 言語を使用してコンパイル段階で問題をブロックすることが提案されています。 このようなアプローチは、適切な監査を実施せずに急いで独自のドライバーを開発する機器メーカーからの需要があると想定されます。

意図した機能のすべてがまだ実装されているわけではありませんが、フレームワークはすでに作業に非常に適しており、Raspberry Pi 9512 ボードで提供される LAN3 USB イーサネット コントローラー用の動作するドライバーを作成するために使用されました。 C言語。 Rust でドライバーを開発する際のモジュール サイズとランタイム コンポーネントからのオーバーヘッドはわずかであるため、リソースが限られたデバイスでもフレームワークを使用できることに注意してください。

出所: オープンネット.ru

コメントを追加します