カーネルホットスワップ管理


USB(およびCardbusPCI)などの挿抜可能なバスでは、端末ユーザはホストの実行時にデバイスをバスに挿入する.ほとんどの場合、ユーザは、デバイスが直ちに利用可能であることを望む.これは、システムが次のような多くのことをしなければならないことを意味します.
  • は、デバイスを処理できる駆動を見つけた.カーネルモジュールをマウントすることも含まれます.新しいドライバは、モジュール初期化ツールを使用してデバイスのサポートをユーザーアプリケーションツールセットにパブリッシュできます.
  • は、駆動をデバイスにバインドする.バスフレームワークは、デバイス駆動のprobe()関数を使用して、デバイスに駆動をバインドします.
  • は、他のサブシステムに新しいデバイスを構成するように伝えた.印刷キューが使用可能になり、ネットワークがオープンになり、ディスクパーティションがマウントされるなどします.場合によっては、駆動関連の動作もいくつかあります.

  • PolicyAgent:ホットスワップイベントが発生したときにカーネルによってトリガーされるユーザ空間プログラム(例えば/sbin/hotplug).通常、これらのプログラムはshellスクリプトであり、このスクリプトを使用してより多くの管理ツールを呼び出すことができます.
    このメカニズムは主にkobjectオブジェクトモデルによって実現される.
    ホットスワップ関連インタフェース関数:
    /**
     * kobject_uevent - notify userspace by ending an uevent
     *
     * @action: action that is happening
     * @kobj: struct kobject that the action is happening to
     *
     * Returns 0 if kobject_uevent() is completed with success or the
     * corresponding error when it fails.
     */
    int kobject_uevent(struct kobject *kobj, enum kobject_action action);
       kobject_uevent_env(kobj, action, NULL);
    /**
     * kobject_uevent_env - send an uevent with environmental data
     *
     * @action: action that is happening
     * @kobj: struct kobject that the action is happening to
     * @envp_ext: pointer to environmental data
     *
     * Returns 0 if kobject_uevent() is completed with success or the
     * corresponding error when it fails.
     */
    int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
    			char *envp[]);
    /**
     * add_uevent_var - add key value string to the environment buffer
     * @env: environment buffer structure
     * @format: printf format for the key=value pair
     *
     * Returns 0 if environment variable was added successfully or -ENOMEM
     * if no space was available.
     */
    int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
    	__attribute__((format (printf, 2, 3)));
    
    /**
     * kobject_action_type - translate action string to numeric type
     *
     * @buf: buffer containing the action string, newline is ignored
     * @len: length of buffer
     * @type: pointer to the location to store the action type
     *
     * Returns 0 if the action string was recognized.
     */
    int kobject_action_type(const char *buf, size_t count,
    			enum kobject_action *type);
    関連データ構造:
    enum kobject_action {
    	KOBJ_ADD,
    	KOBJ_REMOVE,
    	KOBJ_CHANGE,
    	KOBJ_MOVE,
    	KOBJ_ONLINE,
    	KOBJ_OFFLINE,
    	KOBJ_MAX
    };
    /* the strings here must match the enum in include/linux/kobject.h */
    static const char *kobject_actions[] = {
    	[KOBJ_ADD] =		"add",
    	[KOBJ_REMOVE] =		"remove",
    	[KOBJ_CHANGE] =		"change",
    	[KOBJ_MOVE] =		"move",
    	[KOBJ_ONLINE] =		"online",
    	[KOBJ_OFFLINE] =	"offline",
    };
    struct kobj_uevent_env {
    	char *envp[UEVENT_NUM_ENVP];
    	int envp_idx;
    	char buf[UEVENT_BUFFER_SIZE];
    	int buflen;
    };
    //         
    struct kset_uevent_ops {
    	int (*filter)(struct kset *kset, struct kobject *kobj);//      
    	const char *(*name)(struct kset *kset, struct kobject *kobj);//      , USB
    	int (*uevent)(struct kset *kset, struct kobject *kobj,
    		      struct kobj_uevent_env *env);//       
    };
    関連関数:
    struct kset *kset_create_and_add(const char *name,
    				 struct kset_uevent_ops *uevent_ops,
    				 struct kobject *parent_kobj);
    ここでstructkset_uevent_opsでは、特定のuevent関数を指定します.