ホームページ >php教程 >PHP开发 >Linux システムカーネルのデバイスマッパーメカニズム (1) (3)

Linux システムカーネルのデバイスマッパーメカニズム (1) (3)

黄舟
黄舟オリジナル
2016-12-23 14:08:031476ブラウズ

3. ユーザー空間コマンドは、ioctl を通じて table_load 関数を呼び出します。この関数は、ユーザー空間から渡されたパラメーターに基づいて、指定されたマッピングされたデバイスとマッピングされたターゲット デバイスのマッピング テーブルを構築します。この関数は、まず対応する dm_table 構造体と dm_target 構造体を構築し、次に dm-table.c の dm_table_add_target 関数を呼び出して、ユーザーが渡したパラメータに従ってこれらの構造体を初期化し、パラメータで指定されたターゲットタイプをターゲットデバイスに対応する構造体をメモリ上に構築し、確立された dm_target 構造体に基づいて dm_table に保持される B ツリーを更新します。上記の処理が完了したら、作成した dm_table をマッピングされたデバイスのグローバル ハッシュ テーブルに対応する hash_cell 構造体に追加します。

4. 最後に、ioctl を介して do_resume 関数が呼び出され、マッピングされたデバイスとマッピング テーブル間のバインディング関係が確立されます。実際、このプロセスでは、現在の dm_table 構造体ポインター値を、mapped_device の対応するマップ フィールドに割り当てます。 dm_swap_table 関数を使用して、mapped_device の現在の状態の表現を変更します。

上記の 4 つの主要な手順を通じて、デバイス マッパーはユーザーに提供できるマップされたデバイス論理ブロック デバイスをカーネル内に作成します。

IO フロー

デバイス マッパーの本質的な機能は、ターゲット ドライバーによって記述されたマッピング関係と IO 処理ルールに基づいて、論理デバイス マップされたデバイスから対応するターゲット デバイスに IO リクエストを転送することです。デバイス マッパーは、カーネル内のブロック レベル IO サブシステムの generic_make_request および submit_bio インターフェイスからマップされたデバイスに送信されるすべてのブロック読み取りおよび書き込み IO リクエストを処理します。 IO リクエストは、リクエスト転送を通じてデバイス マッパーのデバイス ツリーの上から下まで処理されます。バイオ リクエストがデバイス ツリー内のマッピングされたデバイスに転送されると、1 つ以上のバイオ クローンが作成され、下位のターゲット デバイスに送信されます。その後、同じプロセスがデバイス ツリーの各レベルで繰り返されます。デバイス ツリーが十分に大きい限り、この転送プロセスは理論的には無期限に継続できます。デバイス ツリーの特定のレベルで、ターゲット ドライバーが特定のバイオ リクエストを終了した後、上位にマップされたデバイスにバイオ リクエストの終了を示すイベントを報告します。このプロセスは、イベントが最終的にアップロードされるまで各レベルで実行されます。これまでのところ、デバイス マッパーはルート マップされたデバイス上の元の BIOS リクエストを終了し、IO リクエスト プロセス全体を終了します。

Bio がデバイス マッパーのデバイス ツリーでレイヤーごとに転送すると、最終的に 1 つ以上のリーフ ターゲット ノードに転送されて終了します。 Bio リクエストは複数のターゲット デバイス (つまり、物理空間セグメント) にまたがることができないため、各レベルで、デバイス マッパーは、ユーザーによって事前に通知されたマッピングされたデバイスのターゲット マッピング情報に基づいて 1 つ以上の BIOS をクローンし、それらを逆アセンブルします。 bios は分割された後、対応するターゲットデバイスに転送されます。これらの複製された BIOS は、まずマップされたデバイス上の対応するターゲット ドライバーに渡されて処理されます。IO リクエストは、ターゲット ドライバーで定義された IO 処理ルールに従ってフィルタリングおよび処理され、完了のためにターゲット デバイスに送信されます。上記のプロセスは、dm.c ファイルの dm_request 関数で完了します。ターゲット ドライバーは次のように BIOS を処理できます。

1. これらの BIOS を後で処理するためにキューに入れます。

3. BIOS を 1 つ以上のターゲット デバイスにリダイレクトします。エラーステータスをデバイスマッパーに送信します。

IO リクエストは、IO リクエストが完了するまで、上で説明したプロセスに従って、図 2 に示すデバイス ツリー内で層ごとに処理されます。

概要

ユーザーがユーザー空間でマッピング戦略を策定し、ユーザーの要求に従って特定の IO リクエストを処理するターゲット ドライバー プラグインを作成する限り、デバイス マッパーはカーネル内の論理デバイスから物理デバイスへのマッピング アーキテクチャを提供します。 LVM に似た論理ボリューム マネージャーを簡単に実装できます。デバイス マッパーは、ioctl の形式で外部インターフェイスを提供します。ユーザーは、ユーザー空間でデバイス マッパー ライブラリを使用して、デバイス マッパーのキャラクター デバイスに ioctl コマンドを送信し、内部通信を完了します。また、ioctl を介して必要なイベント通知メカニズムも提供し、ターゲット ドライバーが特定の IO 関連イベントをユーザー空間に送信できるようにします。

上記は、Linux システム カーネルのデバイス マッパー メカニズム (1) (3) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。