OpenHarmony HDF フレームワークの紹介


OpenHarmony HDF フレームワークの紹介

OpenHarmony システムの HDF ドライバー フレームワークは、C 言語のオブジェクト指向プログラミング モデルを使用して構築されており、プラットフォーム デカップリングとカーネル デカップリングによって、異なるカーネルとの互換性とプラットフォーム ベースの統合という目的を達成し、開発者がその効果を実現するのに役立ちます。ワンタイムドライバー開発とマルチシステム展開. .

このような目標を達成するために、OpenHarmony システムの HDF ドライバー フレームワークは次のものを提供します:
オペレーティング システム アダプテーション レイヤー (OSAL): カーネル オペレーティング システム関連のインターフェイスを一様にカプセル化し、異なるシステムの操作インターフェイスを保護します
; : i2c、spi、 uart バスおよびその他のプラットフォーム リソース) をサポートし、同時にボード ハードウェア操作の統合適応インターフェイス抽象化を実行するため、開発者は新しいハードウェア抽象化インターフェイスを開発するだけで、新しく追加されたボード部分を取得できます。ドライバー サポート. ドライバー モデル:
デバイス ドライバー用に、共通のドライバー抽象化モデルを提供します。主に次の 2 つの目的があります:
標準化されたデバイス ドライバー モデルを提供する、開発者が独自に開発する必要がない、構成によってドライバーの展開を完了することができる、
ドライバー モデルの抽象化を提供する、ドライバーとさまざまなシステム コンポーネントとの関係をシールドします。相互作用により、ドライバーはより用途の広いものになります。

OpenHarmony システムの HDF ドライバー フレームワークは、主に次のもので構成されています。

  • ドライバーベースのフレームワーク
  • 運転者
  • ドライバー構成ファイル
  • ドライバーインターフェース

この4つの部分で構成されています。

  1. HDF ドライバー インフラストラクチャは、統合されたハードウェア リソース管理、ドライバー ロード管理、およびデバイス ノード管理を提供します。ドライバ フレームワークはマスター/スレーブ モード設定を採用し、デバイス マネージャとデバイス ホストで構成されます。デバイス マネージャーは、統合されたドライバー管理を提供し、デバイス マネージャーが起動すると、デバイス情報によって提供されるドライバー デバイス情報に従って、対応するドライバー デバイス ホストをロードし、ホストを制御してドライバーのロードを完了します。デバイス ホストは、ドライバーを実行するための環境を提供すると同時に、事前設定されたホスト フレームワークがデバイス マネージャーと連携して、ドライバーの読み込みと呼び出しを完了します。ビジネス要件に従って、デバイス ホストは複数のインスタンスを持つことができます。
  2. The driver implementation the specific functions of the driver. 各ドライバーは 1 つ以上のドライバーで構成され、各ドライバーはドライバー エントリに対応します。ドライバー エントリは、主にドライバーの初期化とドライバー インターフェイスのバインド機能を完了します。
  3. ドライバー構成ファイル (.hcs) は、主にデバイス情報とデバイス リソースで構成され、デバイス情報は、デバイス情報の構成 (構成インターフェイスのリリース戦略、ドライバーのロード方法など) を完了します。デバイス リソース デバイス リソースの構成を完了します (GPIO ピン、レジスタ、その他のリソース情報の構成など)。
  4. ドライバー インターフェイス (HDI) は標準化されたインターフェイスの定義と実装を提供し、ドライバー フレームワークは IO サービスと IO ディスパッチャー メカニズムを提供するため、ドライバー インターフェイスはさまざまな展開形式で一貫性が保たれます。

ここに画像の説明を挿入

HDF ドライバー フレームワークのブロック図

The HDF framework puts a class of device drivers in the same host, and developers can also development and deploy the driver functions in layer, which supports multiple nodes for one driver. 次の図に、HDF フレームワーク管理ドライバー モデルを示します。

ここに画像の説明を挿入

HDF ドライバー フレームワークのしくみ

デバイス マネージャは、統合されたドライバ ローディング管理メカニズムとドライバ インターフェイス公開メカニズムを提供します。
デバイス ホスト環境が読み込まれると、デバイス マネージャーは、デバイス情報情報に従って対応するドライバーを読み込むようにホストに要求し、デバイス ホストは要求を受け取ると次の操作を実行します。

  • 要求に応じてデバイス情報を読み込み、指定されたパスの下にあるドライバー イメージを検索して読み込むか、指定されたセクション アドレス (セクション) からドライバー エントリを検索します。
  • ドライバー デバイス記述子を検索し、対応するデバイス ドライバーと一致させます。
  • ドライバーのマッチングが成功したら、指定されたドライバー イメージを読み込みます。
  • ドライバー イメージが正常に読み込まれた後、ホスト フレームワークは、ドライバー エントリのバインド インターフェイスと初期化インターフェイスを呼び出して、ドライバーのサービス オブジェクトとのバインドを実現し、同時にデバイス ドライバーを初期化します。
  • デバイス情報構成のサービス ポリシーがドライバー インターフェイスの外部公開を必要とする場合、ドライバー フレームワークはドライバーのサービス オブジェクトを外部に公開されたサービス オブジェクトのリストに追加し、外部クライアント プログラムはこのリスト インターフェイスを介して対応するサービスを照会およびアクセスできます。 .

HDF ドライバー フレームワークの動作原理のブロック図:

ここに画像の説明を挿入

HDF ドライバーの読み込みプロセスの分析

OpenHarmony システム ドライバーには、ドライバー展開のさまざまな方法に応じて、2 つのドライバー読み込み方法があります。

  • 動的読み込み方法: 従来の so (共有ライブラリ) 読み込み方法を使用して、ドライバーはドライバー関数エントリを見つけ、シンボル メソッドを指定してそれを読み込みます。
  • スタティックロード方式:スキャッタでドライバプログラムを指定セクションにコンパイルし、指定セクションに対応するアドレスにアクセスしてロードするドライバ関数エントリを探します。

以下は、静的ロード モードでのカーネル モード ドライバーのロード プロセスの分析に焦点を当てて、ドライバーのロード プロセスを説明するサンプル コードを組み合わせたものです。

HDF ドライバーのロード プロセスの分析 - ドライバーの実装 1

HDF ドライバー フレームワークでは、HdfDriverEntry オブジェクトを使用してドライバーの実装を記述します。

struct HdfDriverEntry{
    int32_t    moduleVersion;
    const char *moduleName;
    int32_t    (*Bind)(struct HdfDeviceObject *deviceObject);
    int32_t    (*Init)(struct HdfDeviceObject *deviceObject);
    void     (*Release)(struct HdfDeviceObject *deviceObject);
}
  • バインド インターフェイス: ドライバー インターフェイスのインスタンス化とバインドを実現する.ドライバー インターフェイスを公開する必要がある場合は、ドライバーの読み込みプロセス中に呼び出され、インターフェイスのドライバー サービスがインスタンス化され、deviceobject にバインドされます。
  • 初期化インターフェイス: ドライバーの初期化を実現します。エラーを返すと、ドライバーの読み込みプロセスが停止します。
  • リリース インターフェイス: ドライバーのアンロードを実現し、このインターフェイスでドライバー インスタンスのソフトウェアおよびハードウェア リソースを解放します。

HDF ドライバーのロード プロセスの分析 - ドライバーの実装 2

int SampleDriverBind(struct HdfDeviceObject *deviceObject)
intSampleDriverInit(struct HdfDeviceObject *deviceObject)
intSampleDriverRelease(struct HdfDeviceObject *deviceObject)

struct HdfDriverEntry g_sampleDriverEntry = {
    .moduleVersion = 1,
    .moduleName = "sample_driver",
    .Bind = SampleDriverBind,
    .Init = SampleDriverInit,
    .Release = SampleDriverRelease
};

HDF_INIT(g_sampleDriverEntry);

HDF_INIT マクロを展開します。

#define HDF_SECTION    __attribute__((section(".hdf.driver")))
#define HDF_DRIVER_INIT(module)    \
const size_t    USED    ATTR    module##HdfEntry HDF SECTION = (size_t)(&(module))

ここに画像の説明を挿入

HDF_INITマクロが「ドライバモジュール名+HdfEntry」のシンボルを定義し、シンボルが指すセクションに配置していることがわかります “.hdf.driver”.シンボルが指すメモリアドレスは、ドライバエントリ構造体のアドレスです. この特別なセクションは、起動時にデバイス ドライバーを検索するために使用されます。

HDF ドライバーのロード プロセスの分析 - ドライバー リストの取得

ここに画像の説明を挿入

HDF ドライバー フレームワークは、ドライバー エントリ シンボルのアドレスを特別なセクションに格納することにより、ドライバーのインデックス付けを実現します. 2 つの特別なシンボル _hdf_drivers_start および _hdf_drivers_end が、このセクションの範囲をマークするために、このセクションの最初と最後に挿入されます. データ2 つの特殊なシンボルの間にあるのは、ドライバー実装ポインターです。

HDF ドライバーのロード プロセスの分析 - デバイス リストの取得

ここに画像の説明を挿入

構成テキストがコンパイルされると、バイナリ形式の構成ファイルになり、デバイス関連の情報が「hdf_manager」でマークされた device_info 構成ブロックに格納されます。ホスト名、起動優先順位、およびデバイス リスト情報。デバイス情報の moduleName フィールドは、デバイスの正しいドライバーと一致するように、ドライバー エントリの moduleName と一致するために使用されます。

HDF ドライバーのロード プロセスの分析 - デバイスとドライバーの一致

システムが起動すると、最初にドライバー フレームワーク (デバイス マネージャー、デバイス ホスト) が起動し、構成ファイルを解析してデバイス リストを取得し、".hdf.drivers" セクションを読み取ってドライバー リストを読み取り、デバイス リストを走査して、 driver リストが照合され、一致するドライバがロードされます。ドライバー フレームワークには、次の 2 つのコア マネージャーがあります。

  • device managerデバイスのロード、アンロード、クエリなどのデバイス関連機能を含むデバイス管理を担当
  • device service managerデバイスによってリリースされたインターフェイス サービスを管理し、インターフェイス サービスの発行やクエリなどの機能を提供します。

ドライバのロードは、主にデバイス マネージャによって行われます. まず、デバイス マネージャは、構成ファイル内のホスト リストを解析する必要があります. ホスト リストの情報に従って、対応するホスト オブジェクトをインスタンス化します. ホストはファイルを解析して、関連付けられたデバイス リストを検索し、デバイス リストをトラバースして対応する一致するドライバー名を取得し、前述の hdf.driver セクションをトラバースして、ドライバー名に基づいてドライバー アドレスを取得します。

HDF ドライバーのロード プロセスの分析 - ロード プロセスのフローチャート

ここに画像の説明を挿入

The device manager traverse the device list, and when it finds the supported driver, it creates a device object instance for the device. デバイス構成のポリシー フィールドが外部世界に解放する必要があるドライバー インターフェイスである場合、バインドドライバーのインターフェイスが最初に呼び出され、デバイスとデバイスを関連付けます。次に、ドライバーの Init インターフェイスが呼び出され、関連するドライバーの初期化作業が完了します。ドライバーがアンロードされた場合、またはハードウェアやその他の理由で Init インターフェイスがエラーを返した場合、Release が呼び出され、ドライバーによって要求されたさまざまなリソースが解放されます。

HDF ドライバーのロード プロセスの分析 - ドライバー フレームワークの起動
ドライバー フレームワークは late_initcall によって起動されます

static init __init DeviceManagerInit(void)
{
    int ret;
    ret = DeviceManagerStart();
    return ret;
}

late_initcall(DeviceManagerInit);

late_initcall マクロ展開
ここに画像の説明を挿入

マクロの意味:

  1. __initcall_DeviceManagerInit という名前の initcall)_t 型の関数ポインターを宣言します。
  2. この関数ポインタを DeviceManagerInit として初期化します
  3. コンパイル時に、この関数ポインタ変数を「.initcall7.init」という名前のセクションに配置する必要があります。本質は、関数 DeviceManagerInit の最初のアドレスをセクション「.initcall7.init」に配置することです。

ここに画像の説明を挿入

ここに画像の説明を挿入

HDF ドライバーのロード プロセスの分析 - 概要

  1. システムが起動すると、まず late_initcall によって devicemanagerInit が起動します
  2. デバイス マネージャは、デバイス情報情報に従って構成ファイル内のホスト リストを解析し、ホスト リスト内の情報に従って、対応するホスト オブジェクトをインスタンス化します。
  3. ホスト変数デバイス リストから一致するドライバー名を取得し、ドライバー名に基づいて .hdf.driver セクションをトラバースしてドライバー アドレスを取得します。
  4. デバイスとドライバーが正常に一致したら、指定されたドライバーのエントリ アドレスを取得し、対応するデバイス ドライバーを読み込みます。
  5. 指定されたドライバーのバインド インターフェイスを呼び出して、デバイスとサービス インスタンスを関連付けます。
  6. 指定されたドライバーの init インターフェイスを呼び出し、関連するドライバーの初期化作業を完了します。
  7. ドライバーがアンインストールされた場合、または init インターフェイスがハードウェアやその他の理由で失敗を返した場合、ドライバーが要求したさまざまなリソースを解放するために release が呼び出されます。

参考リンク

おすすめ

転載: blog.csdn.net/qq_37596943/article/details/128527737