Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxデバイスの基礎となるモデル

Linuxデバイスの基礎となるモデル

  

オンラインのLinuxデバイスモデルでは、変更や整理のためにいくつかの議論がありました。

§ 1 KobjectKobjectは、Linux 2.6で導入された新しいデバイス管理メカニズムで、カーネルのstruct kobjectで表されています。このデータ構造を通して、すべてのデバイスは一番下に統一されたインターフェースを持ち、kobjectは基本的なオブジェクト管理を提供し、Linux2.6デバイスモデルのコア構造であり、sysfsファイルシステムに密接に関連し、各kobjectオブジェクトはカーネルに登録されますどちらもsysfsファイルシステム内のディレクトリに対応しています。 Kobjectはデバイスモデルを構成する基本構造です。 C ++の基底クラスと同様に、デバイスモデルのコンポーネントを記述するために使用される、より大きなオブジェクト(いわゆるコンテナ)のオブジェクトに埋め込まれています。バス、デバイス、ドライバなどが典型的なコンテナです。これらのコンテナはkobjectによって接続され、木構造を形成します。このツリー構造は/sys方向に対応しています。 kobject構造体は、いくつかの大きなデータ構造体とサブシステムに基本的なオブジェクト管理を提供し、同様の機能の繰り返しの実装を避けます。 - オブジェクト参照カウント - オブジェクトリンクリストの管理(オブジェクトコレクション) - オブジェクトロック - ユーザー空間での表現

Kobject構造体は次のように定義されます。
struct kobject {char * k name;}デバイス名へのポインタchar name [KOBJ NAME LEN];デバイス名struct kref kref;オブジェクト参照カウントstructリストヘッドエントリ; kset * parentでksetに接続されている単位;親オブジェクトへのポインタstruct kset * kset ksetへのポインタはstruct kobj type * ktype;そのオブジェクト型記述子へのポインタstruct dentry * dentry; sysfsファイルシステム内のオブジェクトに対応するファイルノードパスポインタ};

ここで、krefフィールドはオブジェクト参照を示します。カウント、カーネルはkrefを介してオブジェクト参照カウント管理を実装し、カーネルは参照カウントを増減する2つの関数kobject_get()とkobject_put()を提供し、リファレンスカウントが0の場合、オブジェクトが使用していたリソースはすべて解放されます。 Ktypeフィールドは、オブジェクトの型を示す、kobj型構造体へのポインタです。

関連関数
void kobject_init(struct kobject * kobj); //kobject初期化関数。 Int kobject_set_name(struct kobject * kobj、const char * format、...); //指定したkobjectの名前を設定します。 kobject * kobject_get(struct kobject * kobj); //kobjオブジェクトの参照カウントを1に加算し、そのオブジェクトへのポインタを返します。 Void kobject_put(struct kobject * kobj); //kobjオブジェクトの参照カウントを1つ減らします。参照カウントが0になると、kobject release()が呼び出されてkobjectオブジェクトが解放されます。 Int kobject_add(struct kobject * kobj); //Linuxデバイス階層にkobjオブジェクトを追加します。 kobjectオブジェクトをksetのリストチェーンにフックし、親ディレクトリ内のkobject //の参照カウントを増やし、親が指すディレクトリにファイルノードを作成して、そのタイプのカーネルオブジェクトのhotplug関数を起動します。 Int kobject_register(struct kobject * kobj); //kobject登録関数。 kobjは、kobject init()を呼び出して初期化され、kobject_add()が呼び出されて、カーネルオブジェクトの登録が完了します。 Void kobject_del(struct kobject * kobj); //Linuxデバイスの階層(hierarchy)からkobjオブジェクトを削除します。 kobject_unregister(struct kobject * kobj); //kobjectログアウト関数。 kobject register()とは反対に、最初にkobject delを呼び出してデバイス階層からオブジェクトを削除します//オブジェクトの参照カウントを減らすためにkobject put()を呼び出し、参照カウントが0になると、kobjectオブジェクトは解放されます。

&2; Kobj型
struct kobj_type {void(* release)(struct kobject *); struct sysfs_ops * sysfs_ops; struct attribute ** default_attrs;};

Kobj型データ構造には3つのフィールドがあります。解放方法はkobjectによって占有されたリソースを解放するために使用されます; sysfs opsポインタはsysfs操作テーブルとsysfsファイルシステムのデフォルト属性のリストを指します。 Sysfsアクションテーブルには、store()とshow()の2つの関数があります。ユーザーモードでプロパティが読み込まれると、show()関数が呼び出され、指定されたプロパティ値がバッファーにエンコードされてユーザー状態に戻され、store()関数によってユーザー状態で渡されたプロパティ値が格納されます。属性
struct attribute {char * name; struct module * owner; mode_t mode;};

属性、属性。ファイルとしてsysfsディレクトリに出力されます。 kobjectに対応するディレクトリの下ファイル名はnameです。ファイルの読み書き方法は、kobjタイプのsysfs opsに対応しています。 § 3。ksetksetについて最も重要なことは、サブシステムとその下にある(kobject)との間の関連付けを確立することです。 Kobjectはそれがどのタイプに属しているかを識別するためにもそれを使用し、そして/sysの下に正しいディレクトリの場所を作成します。 ksetの優先順位は比較的高く、kobjectはそれ自身のksetを見つけるためにそれ自身の* ksetを使用し、ksetの下のktypeとして* ktypeを指定します。 ksetは、ksetによって階層構造に編成されていますksetは、同じ型のkobjectのコレクションで、カーネル内のksetデータ構造で表され、次のように定義されます。
struct kset {struct subsystem * subsys;ポインタstruct kobj of the subsystem * ktype; ksetオブジェクトタイプ記述子へのポインタstruct list head list; kset内のすべてのkobjectを接続するためのチェーンヘッダーstruct kobject kobj;埋め込みkobjectstruct kset hotplug ops * hotplug ops;ホットプラグ操作テーブルを指すksetに含まれるすべてのオブジェクトは双方向の循環リストにまとめられ、リストフィールドはリストの先頭になります。 Ktypeフィールドは、これらのオブジェクトのタイプを示すために、kset内のすべてのkobjectによって共有されるkobjタイプ構造を指します。 Ksetデータ構造体はkobjectオブジェクト(kobjフィールドで表される)も埋め込み、このksetに属するkobjectオブジェクトのすべての親フィールドはこの埋め込みオブジェクトを指します。さらに、ksetは参照カウントを維持するためにkobjにも依存します。ksetの参照カウントは、実際には埋め込まれたkobjectオブジェクトの参照カウントです。図1、ksetとkobjectの関係図を参照してください。


この画像は非常に古典的なもので、彼女はkobject全体のつながりを反映しています。

相関関数はkobjectに似ています。kset_init()は指定されたksetの初期化を完了し、kset_get()およびkset_put()はそれぞれksetオブジェクトの参照カウントを増分および減分します。 Kset_add()関数とkset_del()関数はそれぞれ、指定されたkesetオブジェクトのデバイス階層への追加と削除を実装し、kset_register()関数はksetの登録を完了し、kset_unregister()関数はksetのログアウトを完了します。

&4; subsystem ksetがkobjectsのコレクションの場合、サブシステムはksetsのコレクションです。これは、sysfsファイルシステムのブロックディレクトリに対応する、すべてのブロックデバイスを表すblock subsysなど、システム内のデバイスサブシステムのクラスを表します。同様に、devices subsysはsysfsのdevicesディレクトリに対応し、システム内のすべてのデバイスを記述します。サブシステムは、次のように定義されたstruct subsystemデータ構造によって記述されます。
struct subsystem {struct kset kset;埋め込まれたksetオブジェクトstruct rwセマフォrwsem;相互に排他的なアクセスセマフォ};

は、サブシステムとksetの違いを見ることができます。追加のセマフォがあるので、後のコードでは、サブシステムはksetによって完全に禁止されています。

各ksetはサブシステムに属します指定したサブシステムを指すようにkset構造体のsubsysフィールドを設定することによって、サブシステムにksetを追加できます。同じサブシステムに接続されたすべてのksetは、kset内のリンクリストへの同期アクセスのために同じrwsemセマフォを共有します。関連関数
subsystemには、同様の関数セットがあります。void subsystem_init(struct subsystem * subsys); int subsystem_register(struct subsystem * subsys); void subsystem_unregister(struct subsystem * subsys); struct subsystem * subsys_get(struct subsystem *) Subsys)void subsys_put(struct subsystem * subsys);

これらの関数の使用法については、以下の例で詳しく説明します。これはほんの紹介です。

Copyright © Windowsの知識 All Rights Reserved