一個子系統是作為一個整體對核心一個進階部分的代表. 子系統常常(但是不是一直)出現 在 sysfs 層次的頂級. 一些核心中的例子子系統包括 block_subsys(/sys/block, 給塊 裝置), devices_subsys(/sys/devices, 核心裝置層次), 以及一個特殊子系統給每個内 核已知的總線類型. 一個驅動作者幾乎從不需要建立一個新子系統; 如果你想這樣做, 再 仔細想想. 你可能需要什麼, 最後, 是增加一個新類别, 如同在"類别"一節中描述的.
一個子系統由一個簡單結構代表: struct subsystem {
struct kset kset;
struct rw_semaphore rwsem;
};
一個子系統, 是以, 其實隻是一個對 kset 的包裝, 有一個旗标丢在裡面.
每個 kset 必須屬于一個子系統. 子系統成員關系幫助建立 kset 的位置在層次中, 但是, 更重要的, 子系統的 rwsem 旗标用來串行化對 kset 的内部連結清單的存取. 這個成員關系 由在 struct kset 中的 subsys 指針所表示. 是以, 可以從 kset 的結構找到每個 kset 的包含子系統, 但是卻無法直接從子系統結構發現多個包含在子系統中的 kset.
子系統常常用一個特殊的宏聲明:
decl_subsys(name, struct kobj_type *type, struct kset_hotplug_ops
*hotplug_ops);
這個宏建立一個 struct subsystem 使用一個給這個宏的名子并字尾以 _subsys 而形成 的名子. 這個宏還初始化内部的 kset 使用給定的 type 和 hotplug_ops. ( 我們在本章 後面讨論熱插拔操作).
子系統有通常的建立和拆卸函數:
void subsystem_init(struct subsystem *subsys); int subsystem_register(struct subsystem *subsys);