- 本記事は、Linuxカーネル向けにRustで開発された最新のGPUドライバーTyr の開発過程とGPUドライバーの動作原理に焦点を当てる
- GPUドライバー開発において、UMD(ユーザーモードドライバー) と KMD(カーネルモードドライバー) の役割分担と相互作用を VkCube の例を通じて説明する
- UMD は高レベルAPIをGPUが理解できる低レベル命令に変換し、KMD はメモリ割り当て、ジョブスケジューリング、デバイス初期化などの中核的な役割を担う
- Tyrドライバーが提供する API はPanthorと同一で、デバイスクエリ、メモリ管理、グループ管理、ジョブ提出、Tilerヒープ管理などで構成される
- 次回の記事では Arm CSFハードウェアアーキテクチャ と主要コンポーネント(例: MCU)およびブート手順について扱う予定である
紹介: Rustベースの最新GPUカーネルドライバー開発
- 本記事はLinuxカーネルでArm Mali CSFベースのGPUをサポートする、最先端のRust GPUドライバーTyr 開発シリーズの第2回目である
- 実例として、Vulkan API を使って回転するキューブをレンダリングするシンプルな3Dプログラム、VkCube を選び、GPUドライバーの内部動作方式を説明する
- VkCubeのシンプルな構成は、GPUドライバーの動作原理を学ぶのに適したケースである
GPUドライバー基礎: UMDとKMDの役割と構造
- User Mode Driver(UMD) と Kernel Mode Driver(KMD) で構成される
- UMD: panvk(MesaのVulkanドライバー等)のように、一般アプリのAPI(Vulkan、OpenGLなど)を実装する
- KMD: Tyr など、ハードウェアに対する特権を持つカーネルレベルドライバーとしてLinuxカーネルの一部として動作する
- カーネルモードGPUドライバーは、UMDと実際のGPUをつなぐ役割を果たし、UMDはAPIコマンドを解釈してGPUが理解できる命令セットに変換する
- UMDは、シーン構築に必要なジオメトリ、テクスチャ、シェーダーなどのデータを準備し、実行前にKMDへGPUメモリへの割り当てを要求する
- シェーダー はGPU上で動作する独立したプログラムであり、VkCubeではキューブの配置、カラー付け、回転実装などを担当する。シェーダー実行には外部データ(ジオメトリ、カラー、回転行列など)が必要である
- UMDは準備したコマンド(例: VkCommandBuffers)をKMDに渡して実行させ、作業が完了すると通知を受け取り結果をメモリに保存できる
KMD(カーネルモードドライバー)の主な責務
- GPUメモリの割り当てとマッピング(アプリケーションごとの分離を提供)
- ハードウェアキューへのジョブ提出と、完了タイミングのユーザー通知
- 非同期・並列なハードウェア環境ではジョブ依存関係の管理が必須で、正しい結果を保証するためにKMDがスケジューリングと依存関係検証の役割を担う
- デバイス初期化、クロック/電圧レギュレーター制御、スタートアップコード実行、複数クライアントが公平にハードウェアを共有できるようアクセス回転を管理することなども含まれる
複雑性の所在: UMDとKMDの分業
- GPUドライバーの複雑性は主にUMDに集中している
- UMD: 高レベルAPIコマンドをハードウェア命令へ変換
- KMD: UMDが正しく動作できるようメモリ分離、共有、公平なアクセス性などの中核機能を提供
Tyrが提供するドライバーインターフェース(API)構造
- TyrドライバーAPI(=Panthorと同一)は、主に5つのグループに分類できる
- デバイス情報クエリ: DEV_QUERY(IOCTLでGPUハードウェア情報を確認、ROM領域を使用)
- メモリ割り当てと分離: VM_CREATE、VM_BIND、VM_DESTROY、VM_GET_STATE、BO_CREATE、BO_MMAP_OFFSET など
- スケジューリンググループ管理: GROUP_CREATE、GROUP_DESTROY、GROUP_GET_STATE(詳細説明は今後の記事で予定)
- ジョブ提出: GROUP_SUBMIT(デバイスコマンドバッファを通じてGPUへの実行要求)
- Tilerヒープ管理: TILER_HEAP_CREATE、TILER_HEAP_DESTROY(タイルドレンダリングGPUのメモリ要件を満たす)
- これらのAPIは実際に直接描画する作業からは距離があるが、UMDが実コマンド実行を担い、KMDはハードウェアアクセスのために上記インターフェースのみを提供する
結論と今後の計画
- 今回の記事では、GPUドライバーの全体構造と内部フロー、そしてTyrが提供する主要APIについて確認した
- この内容を踏まえ、シリーズの次回記事では Arm CSFハードウェアアーキテクチャ、**マイクロコントローラーユニット(MCU)**などの主要コンポーネントとドライバー初期化手順を扱う予定である
まだコメントはありません。