Linux 内核子系统
阅读原文时间:2023年07月11日阅读:1

一个子系统是作为一个整体对内核一个高级部分的代表. 子系统常常(但是不是一直)出现 在 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);

void subsystem_unregister(struct subsystem *subsys); struct subsystem *subsys_get(struct subsystem *subsys) void subsys_put(struct subsystem *subsys);

大部分这些操作只是作用在子系统的 kset 上.