KOBJ虚拟文件系统 (kobj)
本文档详细介绍 XSTAR 的 KOBJ(Kernel Object)虚拟文件系统,包括数据结构、API 接口和使用示例。
目录
引言
KOBJ 的作用
KOBJ(Kernel Object)即内核对象,其层次结构表现为一棵倒置的树,用来管理各种设备、驱动、运行时状态等。
在文件系统中,通过 sysfs 接口绑定 kobj 节点,来实现对该节点的读写操作。sysfs 接口有两种基本用途:
- 组件外部操作接口:应用可以通过此接口操作设备
- 调试驱动模块或查看运行时状态:通过读写 kobj 节点获取设备信息
核心价值
实现 kobj 可以对任何形态的组件进行高度抽象,是各种组件的基石。系统提供了一组 API,以方便管理 kobj。
理解了 kobj,对理解 XSTAR 中的各种核心组件(如设备驱动、设备管理等)有相当大的帮助,建议细心阅读。
KOBJ 节点类型
kobj 有两种基本类型:
目录类型(KOBJ_TYPE_DIR)
- 可以挂接子节点
- 类似文件系统中的目录
- 不提供读写接口
- 用于组织节点层次结构
文件类型(KOBJ_TYPE_REG)
- 代表树的末端节点
- 不可拥有子节点
- 提供读或写接口
- 用于存储和传递数据
枚举定 义:
enum kobj_type_t {
KOBJ_TYPE_DIR,
KOBJ_TYPE_REG,
};
KOBJ 结构体
kobj_t 结构定义
kobj 结构体拥有名字、节点类型、父节点指针、当前节点链表、子节点链表头、读写接口函数及一个私有数据指针。
struct kobj_t {
char * name; /* kobj 名称 */
enum kobj_type_t type; /* kobj 类型 DIR 或 REG */
struct kobj_t * parent; /* kobj 的父节点 */
struct list_head_t entry; /* kobj 的链表项 */
struct list_head_t children; /* kobj 的子节点链表 */
ssize_t (*read)(struct kobj_t * kobj, void * buf, size_t size); /* 读接口 */
ssize_t (*write)(struct kobj_t * kobj, void * buf, size_t size); /* 写接口 */
void * priv; /* 私有数据 */
};
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
name | char * | 节点名称,必须唯一(同一父节点下) |
type | enum kobj_type_t | 节点类型:目录或文件 |
parent | struct kobj_t * | 父节点指针 |
entry | struct list_head_t | 链表项,用于挂载到父节点的 children 链表 |
children | struct list_head_t | 子节点链表头 |
read | 函数指针 | 读操作回调函数(仅文件类型有效) |
write | 函数指针 | 写操作回调函数(仅文件类型有效) |
priv | void * |