05、创建 kset 实验 *
本章节是一个在Linux系统上创建kset的实验。实验展示了如何通过编写代码创建kset,并将多个kobject对象关联到这个集合中。通过实验现象可以看到,kset其实就是多个kobject的容器,而每个kobject都会在/sys目录下自动生成对应的文件节点,这就是它们出现在该目录的原因。
一、kset 与 kobject的关系
kset 与 kobject的关系图:
二、kset编程接口
- 创建一个kset对象
- 指定kset的parent
- 创建kset下的属性
C
void kset_init (struct kset *kset);
int kset_register (struct kset *kset);
void kset_unregister (struct kset *kset);
struct kset *kset_create_and_add(const char *name, const struct kset_uevent_ops *u,
struct kobject *parent_kobj)
1
2
3
4
5
2
3
4
5
To be determined 缺少第三章
四、实验
这段代码用于定义并初始化两个自定义内核对象 mykobject01 和mykobject02, 并将它们添加到一个自定义内核对象集合 mykset 中。 这些自定义内核对象可以用于在 Linux 内核中表示和管理特定的功能或资源。
C
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
// 定义kobject结构体指针,用于表示第一个自定义内核对象
struct kobject *mykobject01;
// 定义kobject结构体指针,用于表示第二个自定义内核对象
struct kobject *mykobject02;
// 定义kset结构体指针,用于表示自定义内核对象的集合
struct kset *mykset;
// 定义kobj_type结构体,用于定义自定义内核对象的类型
struct kobj_type mytype;
// 模块的初始化函数
static int mykobj_init(void)
{
int ret;
// 创建并添加kset,名称为"mykset",父kobject为NULL,属性为NULL
mykset = kset_create_and_add("mykset", NULL, NULL);
// 为mykobject01分配内存空间,大小为struct kobject的大小,标志为GFP_KERNEL
mykobject01 = kzalloc(sizeof(struct kobject), GFP_KERNEL);
// 将mykset设置为mykobject01的kset属性
mykobject01->kset = mykset;
// 初始化并添加mykobject01,类型为mytype,父kobject为NULL,格式化字符串为"mykobject01"
ret = kobject_init_and_add(mykobject01, &mytype, NULL, "%s", "mykobject01");
// 为mykobject02分配内存空间,大小为struct kobject的大小,标志为GFP_KERNEL
mykobject02 = kzalloc(sizeof(struct kobject), GFP_KERNEL);
// 将mykset设置为mykobject02的kset属性
mykobject02->kset = mykset;
// 初始化并添加mykobject02,类型为mytype,父kobject为NULL,格式化字符串为"mykobject02"
ret = kobject_init_and_add(mykobject02, &mytype, NULL, "%s", "mykobject02");
return 0;
}
// 模块退出函数
static void mykobj_exit(void)
{
// 释放mykobject01的引用计数
kobject_put(mykobject01);
// 释放mykobject02的引用计数
kobject_put(mykobject02);
}
module_init(mykobj_init); // 指定模块的初始化函数
module_exit(mykobj_exit); // 指定模块的退出函数
MODULE_LICENSE("GPL"); // 模块使用的许可证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
驱动加载之后, 我们进入/sys/目录下, 可以看到创建生成的 kset
五、/sys/bus 的创建案例
kset_create_and_add("bus"
drivers/base/bus.c