📃

NVIDIA DRIVE OS 6.0 のドキュメント読んでみた

2023/02/11に公開

自動運転ソフトウェアであるNVIDIA DRIVE OS 6.0 の公式ドキュメントを読んでみました。
読んでいて気になったところをまとめてみました。

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/common/topics/intro_sdk/GettingStarted1.html

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/api_reference/index.html

NVIDIA DRIVE OS とは

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/common/topics/archi/PlatformSoftwareStacks1.html

NVIDIA DRIVE OSとはNVIDIAが開発する自動運転向けのオペレーティングシステムとそれに付随するソフトウェア群の総称です。主に以下がDRIVE OS(SDK)から提供されます。

  • 自動運転アプリケーションに最適な仮想マシン作成SDKとHypervisor
  • セキュアブートやファイアーウォールなどセキュアなシステム実現するためのツールとハードウェアインターフェース
  • CUDA,TensorRT,NvMediaなどのハードウェアアクセラレーションにアクセスするためのインターフェース
  • 自動運転アプリケーションを構築するためのライブラリ、デバッガー、プロファイリングツール

Hypervisor


Copyright © 2022 NVIDIA CORPORATION

NVIDIA DRIVE OSはハイパーバイザーによる機能の分離を前提としている。ハイパーバイザーの主な特徴を下にまとめた。

  • ARMv8.2で実行するように最適化されている
    • DRIVE AGX OrinのみでDRIVE OSは動作するのでそれはそう
  • ゲストOSはLinuxとQNXのみをサポートする。しかし両方同時には使えない。
    • 実行ログやインストールログを見る感じ軽量DRIVE OSが提供されているようである(フルに近いものを実行しているような物もあるので何個か提供されているようである。)
  • VMを跨ぐプロセス間通信の機能はこのハイパーバイザーによって提供される。
    • ゼロコピーを実現するためだと思われる
  • para-virtualization(準仮想化)方式で仮想化が実行されている

プロセス間通信

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/common/topics/nvsci_nvsciipc/Inter-ProcessCommunication1.html

お互いのプロセスの居場所によって、明示的にAPIを使い分ける必要がある。メッセージは固定長で行う。通信方式は以下である。

  • "同じプロセス内の異なるスレッド間" もしくは "同じVM内の異なるプロセス間" ではPOSIX shared memoryを使用し共有メモリ領域を持つ。subscriverへの通知はPOSIX mqueueを使用して行う。
  • "同じSoC内の異なるVM間" では共有メモリ領域を設けて通信を行う。この共有領域はハイパーバイザーによって提供される。
  • "異なるSoC間" ではAGX OrinモジュールをPCIeで相互接続して通信する。

余談だがDRIVE OS 5.xの時にはOpenDDSも本番アプリケーションへは非推奨だがサポートされていたが6.0で完全に切られた。

NvSciBuf

各エンジン、UMDからアクセス可能な共有メモリ領域をアロケートし管理する。
エンジンとはGPUやDLAなどのハードウェアのことを指す。またUMDとはUser mode driverの略でありCUDA、OpenGL、TensorRTなどが該当する。
似たようなものとしてEGLがあるがNvSciBufでは画像データの他にTensorなども使用できる

Copyright © 2023 NVIDIA CORPORATION

NvSciはCUDAの機能としてあるようだがDRIVE OS固有の機能があるのかは調査中。

マイコンとの通信

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/common/topics/mcu_setup_usage/mcu_setup_soc_to_microcontroller_communications.html?hl=communication

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/common/topics/mcu_sw_modules/mcu_common_interface.html?hl=udp%2Cover%2Cethernet

大前提としてAUTOSARにマイコン側のソフトウェアが準拠してなければならない。AUTOSARとはソフトウェア開発標準規格であり下記の図に示すような構造をしている。
MCU側のインターフェースはCmplexDriver(CDD)として実装されている。実際の通信はEhernet/vLANを使用し、UDPで通信する。ただしセンサーなどと通信するためのCANやI2Cインターフェースはある。


イータス

PKCS#11 Interface

PKCS#11 インターフェイスでは共通鍵、公開鍵での暗号化、認証コードの生成、疑似乱数の生成などを行うハードウェアへのアクセスを提供する。その他にも鍵の生成や鍵の保存などを行う。
すべての暗号化のタスクはSoCやその他ハードウェアの機能としてあるTEE(Trusted Execution Environment)で実行される。

具体的には以下がサポートされている(一部)

  • AESでの暗号化と復号化
    • CBCモード
    • CTRモード
  • SHA256~512,SHA3 256~512のメッセージ・ダイジェスト
  • EdDSAによる署名
    • 楕円曲線の一種であるエドワーズ曲線を使用した署名方式
  • 楕円曲線暗号の公開鍵と秘密鍵の生成
    • エドワーズ曲線
    • モンゴメリ型楕円曲線
  • RSA 512~4096での署名と検証

ベンチマークライブラリ

https://developer.nvidia.com/docs/drive/drive-os/latest/linux/sdk/common/topics/util_setup/benchmarking_library.html
DRIVE OSではベンチマークライブラリ(C/C++用)が提供されている。
ナノ秒単位でタイムスタンプを取得できる。

最後に

NVIDIA DRIVE OSに共通している事柄として以下が挙げらると思います。

  • メモリコピーを徹底的に減らす
  • メモリ安全性を確保する
  • カーネルレベルで分離を行う
  • ハードウェアアクセラレータを最大限に活用し、CPUの計算タスクをできる限り減らす

このような思想はハードウェア、OS、様々なSDK/APIを開発していて資産が豊富にあるNVIDIAだからこそ出来るものであると思います。大枠の設計思想のようなところは真似するのは大変ですが各コンポーネントの設計などは参考になる部分が多くあると思います。

Discussion