kobject_init_and_add函数的功能
时间: 2023-12-21 15:03:55 浏览: 312
kobject_init_and_add函数的功能是用于在/sys文件系统中添加一个kobject对象。这个函数会调用kobject_init函数初始化kobject对象,并通过调用kobject_add函数将其添加到/sys 文件系统。kobject对象通常被用于Linux驱动程序中,用于表示设备或驱动程序的抽象概念。在/sys 文件系统中添加kobject对象可以方便地对其进行管理和控制。
相关问题
[ 4.858794] uwe5621_bt_tty_init [ 4.862131] mtty_probe unisoc soc, continue [ 4.868449] mtty_probe init device addr: 0x000000007db4bee8 [ 4.868608] rfkill_bluetooth_init [ 4.871951] rfkill_bluetooth_init end [ 4.872048] marlin_sdio_init [ 4.873682] mtty_probe unisoc soc, continue [ 4.873724] sysfs: cannot create duplicate filename '/devices/virt[ 4.873829] CPU: 1 PID: 121 Comm: init Not tainted 4.19.193 #34 [ 4.873842] Hardware name: ROC-RK3566-PC HDMI(Android) (DT) [ 4.873849] Call trace: [ 4.873868] dump_backtrace+0x0/0x178 [ 4.873876] show_stack+0x14/0x20 [ 4.873886] dump_stack+0x94/0xb4 [ 4.873895] sysfs_warn_dup+0x64/0x80 [ 4.873902] sysfs_create_dir_ns+0xdc/0xf8 [ 4.873910] kobject_add_internal+0xa0/0x288 [ 4.873916] kobject_add+0x98/0x100 [ 4.873928] device_add+0xec/0x698 [ 4.873934] device_register+0x1c/0x28 [ 4.873945] tty_register_device_attr+0xe4/0x208 [ 4.873951] tty_register_driver+0x138/0x248 [ 4.873970] mtty_probe+0x144/0x33u0 [sprdbt_tty] [ 4.873978] platform_drv_probe+0x50/0xa8 [ a 4.873984] really_probe+0xl228/0x2a0 [ 4.873991] driver_probe_device+0x58/0x100 [ 4.873996] device_driver_attach+0x6c/0x78 [ 4.874001] __driver_attach+0xb0/0xf0 [ 4.874009] bus_for_each_dev+0x68/0xc8 [ 4.874014] driver_attach+0x20/0x28 [ 4.874019] bus_add_driver+0xf8/0x1f0 [ 4.874025] driver_register+0x60/0x110 [ 4.874031] __platform_driver_register+0x40/0x48 [ 4.874044] uwe5621_bt_tty_init+0x44/0x1000 [sprdbt_tty] [ 4.874052] do_one_initcall+0x48/0x240 [ 4.874061] do_init_module+0x5c/0x1c8 [ 4.874069] load_module+0x18f8/0x1f68 [ 4.874074] __se_sys_finit_module+0xc0/0xd8 [ 4.874079] __arm64_sys_finit_module+0x14/0x20 [ 4.874087] el0_svc_common.constprop.0+0x64/0x178 [ 4.874092] el0_svc_handler+0x28/0x78 [ 4.874097] el0_svc+0x8/0xc [ 4.874179] kobject_add_internal failed for ttyBT0 with -EEXIST/, don't try to register things twith the same name in the same directory. [ 4.874225] list_del corruption, ffffffc079941ea8->next is LIST_POISON1 (dead000000000100) [ 4.874270] ------------[ cut here ]------------
这是一段内核启动时的日志信息,其中包含了一些设备的初始化信息和错误提示。具体来说,这段日志中可能发生了以下几个问题:
1. sysfs_create_dir_ns 函数创建了一个重复的 sysfs 节点,导致 sysfs_warn_dup 函数发出了一个警告信息。
2. kobject_add_internal 函数添加一个设备对象时,发现该设备已经存在,返回 -EEXIST 错误。
3. 在尝试注册 ttyBT0 设备时,发现该设备名称已经存在于同一目录中,导致 kobject_add_internal 函数失败。
4. list_del 函数出现了链表错误,可能导致系统崩溃或其他异常行为。
需要进一步分析日志信息,确定具体的问题和解决方法。
linux系统中DEFINE_SHOW_ATTRIBUTE函数
在Linux内核中,`DEFINE_SHOW_ATTRIBUTE`函数用于定义一组`show`函数和`store`函数,以便用户空间可以使用sysfs文件系统来访问内核中的某些属性。具体来说,`DEFINE_SHOW_ATTRIBUTE`函数接受三个参数:属性名、`show`函数和`store`函数。其中,`show`函数用于读取属性值,并将其输出到缓冲区中;`store`函数用于将用户空间传递的新属性值写入内核中。
举例来说,下面是一个使用`DEFINE_SHOW_ATTRIBUTE`函数定义`sysfs`属性的示例:
```c
static ssize_t my_attr_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
return sprintf(buf, "Hello, world!\n");
}
static ssize_t my_attr_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t count)
{
// Do something with the new attribute value
return count;
}
static struct kobj_attribute my_attribute =
__ATTR(my_attr, 0666, my_attr_show, my_attr_store);
static struct attribute *attrs[] = {
&my_attribute.attr,
NULL,
};
static struct attribute_group attr_group = {
.attrs = attrs,
};
static struct kobject *my_kobj;
static int __init my_module_init(void)
{
int ret;
my_kobj = kobject_create_and_add("my_kobject", kernel_kobj);
if (!my_kobj) {
return -ENOMEM;
}
ret = sysfs_create_group(my_kobj, &attr_group);
if (ret) {
kobject_put(my_kobj);
return ret;
}
return 0;
}
static void __exit my_module_exit(void)
{
sysfs_remove_group(my_kobj, &attr_group);
kobject_put(my_kobj);
}
module_init(my_module_init);
module_exit(my_module_exit);
```
在上述示例中,我们定义了一个名为`my_attr`的属性,并将其加入到一个名为`my_kobject`的内核对象中。`my_attr_show`函数用于读取属性值,在本例中返回值为`Hello, world!\n`。`my_attr_store`函数用于将用户空间传递的新属性值写入内核中,在本例中只是简单地返回传入的属性值。最后,我们通过`sysfs_create_group`函数将这个属性加入到`my_kobject`的属性组中,以便用户空间可以使用sysfs文件系统来访问它。
阅读全文