Rust 言語をサポートする Linux カーネル用パッチの XNUMX 番目のバージョン

Rust-for-Linux プロジェクトの作者である Miguel Ojeda は、Linux カーネル開発者による検討のために、Rust 言語でデバイス ドライバーを開発するための v6 コンポーネントのリリースを提案しました。 これは、バージョン番号なしで公開された最初のバージョンを考慮すると、パッチの XNUMX 版目です。 Rust のサポートは実験的であると考えられていますが、すでに linux-next ブランチに含まれており、カーネル サブシステム上に抽象化レイヤーを作成したり、ドライバーやモジュールを作成したりする作業を開始できるほど十分に開発されています。 この開発には、Google と、Let's Encrypt プロジェクトの創設者であり、HTTPS とインターネット セキュリティを向上させる技術の開発を推進する ISRG (Internet Security Research Group) が資金提供しています。

収録曲:

  • ツールキットとallocライブラリのバリアントは、エラー発生時に「パニック」状態が生成される可能性から解放され、Rust 1.60のリリースに更新され、カーネルパッチで使用される「maybe_uninit_extra」モードのサポートが安定しました。
  • カーネル API に関連付けられたテストを、カーネルの読み込み中に実行される KUnit テストにコンパイル時に変換することにより、ドキュメントからテスト (ドキュメントで例としても使用されるテスト) を実行する機能が追加されました。
  • Rust カーネル コードと同様に、テストで Clippy リンター警告が発生してはならないという要件が採用されています。
  • ネットワーク機能を備えた「ネット」モジュールの初期実装が提案されています。 Rustコードは、Namespace(struct netカーネル構造に基づく)、SkBuff(struct sk_buff)、TcpListener、TcpStream(structソケット)、Ipv4Addr(struct in_addr)、SocketAddrV4(struct sockaddr_in)およびそれらのIPv6相当物などのカーネルネットワーク構造にアクセスできます。 。
  • kasync モジュールの形式で実装された非同期プログラミング手法 (async) の初期サポートがあります。 たとえば、次のように非同期コードを記述して TCP ソケットを操作できます。 async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; ループ { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); stream.write_all(&buf[..n]).await?; } }
  • ネットワークパケットフィルターを操作するための net::filter モジュールを追加しました。 Rust言語でのフィルター実装を含むサンプルrust_netfilter.rsを追加しました。
  • 固定を必要としない単純なミューテックス smutex::Mutex の実装を追加しました。
  • NoWaitLock が追加されました。ロックを待機せず、別のスレッドによって占有されている場合、呼び出し元を停止する代わりにロックを取得しようとするとエラーが報告されます。
  • アイドル状態にできないセクションに適用するために、カーネル内の raw_spinlock_t によって識別される RawSpinLock を追加しました。
  • 参照カウントメカニズムが適用されるオブジェクトへの参照用の ARef タイプを追加しました (always-refcounted)。
  • Rustc_codegen_gcc バックエンドでは、GCC プロジェクトの libgccjit ライブラリを Rustc のコード ジェネレーターとして使用して、GCC で利用可能なアーキテクチャと最適化のサポートを Rustc に提供できるようになり、Rustc コンパイラをブートストラップする機能が実装されました。 コンパイラーのプロモーションとは、Rustc で GCC ベースのコード ジェネレーターを使用して、Rustc コンパイラー自体を構築できる機能を意味します。 さらに、GCC 12.1 の最近のリリースには、rustc_codegen_gcc が正しく動作するために必要な libgccjit への修正が含まれています。 Rustup ユーティリティを使用して Rustc_codegen_gcc をインストールする機能を提供する準備が進行中です。
  • GCC ベースの Rust 言語コンパイラの実装による GCC フロントエンド gccrs の開発の進歩が注目されています。 現在、XNUMX 人のフルタイム開発者が gccrs に取り組んでいます。

提案されている変更により、ドライバーとカーネル モジュールを開発するための第 XNUMX 言語として Rust を使用できるようになるということを思い出してください。 Rust サポートは、デフォルトでは有効になっていないオプションとして提供されており、カーネルの必須ビルド依存関係として Rust が含まれることはありません。 ドライバー開発に Rust を使用すると、解放後のメモリ アクセス、null ポインターの逆参照、バッファ オーバーランなどの問題がなく、最小限の労力でより安全で優れたドライバーを作成できます。

Rustのメモリ安全性は、参照チェック、オブジェクトの所有権とオブジェクトの有効期間(スコープ)の追跡、およびコード実行中のメモリアクセスの正確性の評価を通じて、コンパイル時に提供されます。 Rust は整数オーバーフローに対する保護も提供し、使用前に変数値の初期化を必須にし、標準ライブラリでエラーをより適切に処理し、デフォルトで不変参照と変数の概念を適用し、論理エラーを最小限に抑えるための強力な静的型付けを提供します。

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

コメントを追加します