天天看點

linux 4.4核心 熱插拔,Linux 核心熱插拔操作

熱插拔事件的實際控制是通過一套存儲于 kset_hotplug_ops 結構的方法完成.

struct kset_hotplug_ops {

int (*filter)(struct kset *kset, struct kobject *kobj); char *(*name)(struct kset *kset, struct kobject *kobj); int (*hotplug)(struct kset *kset, struct kobject *kobj, char **envp, int num_envp, char *buffer,

int buffer_size);

};

一個指向這個結構的指針在 kset 結構的 hotplug_ops 成員中. 如果一個給定的 kobject 不包含在一個 kset 中, 核心搜尋整個層次( 通過 parent 指針) 直到它發現一 個 kobject 确實有一個 kset; 接着使用這個 kset 的熱插拔操作.

filter 熱插拔操作被調用無論何時核心在考慮為給定 kobject 産生一個事件. 如果 filter 傳回 0, 事件沒有建立. 這個方法, 是以, 給 kset 代碼一個機會來決定哪個事 件應當被傳遞給使用者空間以及哪個不.

作為一個例子關于這個方法怎樣被使用, 考慮塊裝置子系統. 至少有 3 類 kobject 用在 那裡, 表示磁盤, 分區, 和請求隊列. 使用者空間可能想對磁盤或分區的增加作出反應, 但 是它正常地不關心請求隊列. 是以 filter 方法允許事件産生隻給代表磁盤和分區的 kobjects. 它看來如此:

static int block_hotplug_filter(struct kset *kset, struct kobject *kobj)

{

struct kobj_type *ktype = get_ktype(kobj);

return ((ktype == &ktype_block) || (ktype == &ktype_part));

}

這裡, 一個快速的在 kobject 類型上的測試是足以決定是否這個事件應當産生或者不.

當使用者空間熱插拔程式被調用, 它被傳遞給相關子系統的 name 作為它唯一的一個參數. name 熱插拔方法負責提供這個名子. 它應當傳回一個簡單的适合傳遞給使用者空間的字串.

熱插拔腳本的可能想知道的其他所有東東都在環境中傳遞. 最終的熱插拔方法( hotplug ) 給了一個機會來在調用這個腳本之前添加有用的環境變量. 再次, 這個方法的原型是:

int (*hotplug)(struct kset *kset, struct kobject *kobj, char **envp, int num_envp, char *buffer,

int buffer_size);

如常, kset 和 kobject 描述事件産生給的對象. envp 數組是一個地方來存儲額外的環 境變量定義(以通常的 NAME=值 的格式); 它有 num_envp 個入口變量. 這些變量自身應 當被編碼入緩沖, 緩沖是 buffer_size 位元組長. 如果你添加任何變量到 envp, 确信添加 一個 NULL 入口在你最後的添加項後面, 這樣核心知道結尾在哪裡. 傳回值正常應當是 0; 任何非零傳回都終止熱插拔事件的産生.