返回

深入解析 Linux 设备模型:揭秘 kobject 与 sysfs 的关联

后端

导言

Linux 设备模型提供了一个框架,用于在内核中表示硬件设备。该模型的核心组件之一是 kobject,它充当设备及其属性的表示。kobject 与 sysfs 文件系统密切相关,sysfs 文件系统是一个特殊的文件系统,允许用户空间应用程序访问内核对象的信息。

kobject 与 sysfs 的关联

每个 kobject 对象都与一个 sysfs 文件目录关联。该目录包含有关设备及其属性的文件。例如,对于一个代表串口设备的 kobject,其关联的 sysfs 目录可能包含诸如端口号和波特率等文件。

将 kobject 与 sysfs 文件目录关联的过程称为注册。注册过程包括以下步骤:

  1. 为 kobject 分配一个名称。
  2. 创建一个 sysfs 目录,并将其与 kobject 的名称相关联。
  3. 将 kobject 添加到 sysfs 目录的父目录中。

kobject 的属性文件操作

kobject 提供了一组默认的属性文件操作接口,允许用户空间应用程序读取和写入设备属性。这些操作包括:

  • show(): 用于读取属性值。
  • store(): 用于写入属性值。
  • create(): 用于创建新属性文件。
  • remove(): 用于删除属性文件。

属性文件操作接口的实现取决于属性的类型。例如,对于字符串属性,show() 操作将返回属性的字符串值,而 store() 操作将更新属性的值。

实用示例

以下示例演示了如何创建一个 kobject 并将其与 sysfs 目录关联:

#include <linux/kobject.h>
#include <linux/module.h>

static struct kobject *my_kobject;

static ssize_t show_name(struct kobject *kobj, struct attribute *attr,
			char *buf)
{
	return sprintf(buf, "My kobject\n");
}

static struct attribute my_attr = {
	.name = "name",
	.mode = S_IRUGO,
	.show = show_name,
};

static int my_kobject_init(void)
{
	int ret;

	my_kobject = kobject_create_and_add("my_kobject", kernel_kobj);
	if (!my_kobject)
		return -ENOMEM;

	ret = sysfs_create_file(my_kobject, &my_attr);
	if (ret)
		return ret;

	return 0;
}

static void my_kobject_exit(void)
{
	sysfs_remove_file(my_kobject, &my_attr);
	kobject_put(my_kobject);
}

module_init(my_kobject_init);
module_exit(my_kobject_exit);

MODULE_LICENSE("GPL");

在该示例中,我们创建了一个名为 "my_kobject" 的 kobject,并将其与 sysfs 目录 "my_kobject" 关联。我们还创建了一个名为 "name" 的属性文件,允许用户空间应用程序读取 kobject 的名称。

结论

kobject 与 sysfs 文件系统的关联是理解 Linux 设备模型的关键方面。通过关联,用户空间应用程序可以访问有关设备及其属性的信息。本文提供了对 kobject 与 sysfs 关联的深入概述,并介绍了 kobject 的默认属性文件操作接口。