kset_register
本文中的源码均来自linux内核3.14.3版本/lib/kobject.c文件
/**
* kset_register - 初始化并添加一个kset
* @k: kset.
*/
int kset_register(struct kset *k)
{
int err;
if (!k)
return -EINVAL;
kset_init(k);
err = kobject_add_internal(&k->kobj);
if (err)
return err;
kobject_uevent(&k->kobj, KOBJ_ADD);
return 0;
}
/**
* kset_init - 初始化一个kset
* @k: kset
*/
void kset_init(struct kset *k)
{
kobject_init_internal(&k->kobj);
INIT_LIST_HEAD(&k->list);
spin_lock_init(&k->list_lock);
}
static void kobject_init_internal(struct kobject *kobj)
{
if (!kobj)
return;
kref_init(&kobj->kref);//kref是引用计数,该struct仅有一个成员,就是atomic_t refcount,这里把他初始化为1
INIT_LIST_HEAD(&kobj->entry);//entry是一个struct list_head,这里把entry的next和prev均指向entry
kobj->state_in_sysfs = 0; //不在sysfs中显示
kobj->state_add_uevent_sent = 0;
kobj->state_remove_uevent_sent = 0;
kobj->state_initialized = 1;
}
static int kobject_add_internal(struct kobject *kobj)
{
int error = 0;
struct kobject *parent;
if (!kobj)
return -ENOENT;
if (!kobj->name || !kobj->name[0]) {
WARN(1, "kobject: (%p): attempted to be registered with empty name!\n", kobj);
return -EINVAL;
}
parent = kobject_get(kobj->parent);//parent的引用计数加一
/* join kset if set, use it as parent if we do not already have one */
/* 把kobject加入kset, 如果没有parent的话,就把它作为parent*/
if (kobj->kset) {
if (!parent)
parent = kobject_get(&kobj->kset->kobj);
kobj_kset_join(kobj);
kobj->parent = parent;
}
pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n", kobject_name(kobj), kobj, __func__, parent ? kobject_name(parent) : "<NULL>", kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>");
error = create_dir(kobj);
if (error) {
kobj_kset_leave(kobj);
kobject_put(parent);
kobj->parent = NULL;
/* be noisy on error issues */
if (error == -EEXIST)
WARN(1, "%s failed for %s with -EEXIST, don't try to register things with "
"the same name in the same directory.\n",__func__, kobject_name(kobj));
else
WARN(1, "%s failed for %s (error: %d parent: %s)\n", __func__, kobject_name(kobj), error,
parent ? kobject_name(parent) : "'none'");
} else
kobj->state_in_sysfs = 1;
return error;
}
/**
* kobject_get - object增加计数
* @kobj: object.
*/
struct kobject *kobject_get(struct kobject *kobj)
{
if (kobj)
kref_get(&kobj->kref);
return kobj;
}
我很想在这死磕一下,因为后面是继续调用原子操作来增加该计数,而我对原子操作只有概念上的认识,没有清晰的理解,不够看起来原子操作还挺麻烦的,这里就先放下了
static int create_dir(struct kobject *kobj)
{
const struct kobj_ns_type_operations *ops;
int error;
error = sysfs_create_dir_ns(kobj, kobject_namespace(kobj));
if (error)
return error;
error = populate_dir(kobj);
if (error) {
sysfs_remove_dir(kobj);
return error;
}
/*
* @kobj->sd 可能会被一个原始对象删除,保留一个备份索引
* 保证它可以持续到@kobj 释放。
*/
sysfs_get(kobj->sd);
/*
* 如果@kobj有ns_ops, 它的子对象需要用命名空间tags过滤,在@kobj->sd
* 中使能命名空间支持。
*/
ops = kobj_child_ns_ops(kobj);
if (ops) {
BUG_ON(ops->type <= KOBJ_NS_TYPE_NONE);
BUG_ON(ops->type >= KOBJ_NS_TYPES);
BUG_ON(!kobj_ns_type_registered(ops->type));
kernfs_enable_ns(kobj->sd);
}
return 0;
}
kset_register相关推荐
- 通过打印学习Linux内核之sysfs(1)
先研究 /lib/kobject.c 吧 先打开该文件把所有的pr_info或者pr_err全部改为printk,能多打印就多打印了 哦,如果要修改代码,我们可以选择用vim,如果你喜欢的话,不过我们 ...
- Linux那些事儿之我是Sysfs(4)举例一lddbus
对了,你得把ldd3的examples代码下下来.不然没法继续了. 接下来我们从例子着手, localhost:/home/XX/examples/lddbus#insmod lddbus.ko 此时 ...
- Linux那些事儿之我是Sysfs(2)linux设备底层模型
关于linux设备模型网上有一些论述,有些东西我就用了拿来主义,进行了修改和整理. §1 Kobject Kobject 是Linux 2.6引入的新的设备管理机制,在内核中由struct kobje ...
- 设备初始化缩水篇(一)
之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪 int __init devices_init(void) { devices_kset = ...
- kset_create_and_add
我也是初学,做一些学习笔记,总结到哪里算哪里吧 本文中所有代码都是来自linux内核源文件/lib/kobject.c /** * kset_create_and_add - 创建一个动态的kset ...
- input core input.c (1)
drivers/input/input.c 就是所谓的input的核心程序. 分析这个文件,先从input_init开始. 1: static int __init input_init(void) ...
- linux下bus、devices和platform的基础模型
转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义: kobject是Linux2.6引入的设备管理机制,在内 ...
- 初入android驱动开发之字符设备(一)
大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...
- linux lddbus设备,Linux那些事儿之我是Sysfs(4)举例一lddbus | 技术部落
接下来我们从例子着手 localhost:/home/XX/examples/lddbus#insmod lddbus.ko 此时再看/sys/bus/ 这时就多了一个文件夹ldd.里面的文件构成是这 ...
最新文章
- 为什么2100万个BTC发行总量少了0.0231?
- 马化腾首谈腾讯开源时,鹅厂已在Github上放出82个项目,标星24万+ | 附AI项目链接...
- websphere 内存溢出处理
- 制度化规范化标准化精细化_精细化管理ORTCC模型在管理中的运用(下)
- Vue之条件渲染v-if和v-show
- UVA254 Towers of Hanoi【DFS】
- 《实施Cisco统一通信管理器(CIPT1)》一1.3 总结
- 用DOSBox运行老游戏
- viper4android fx原理,ViPer4android. FX顶级音效!
- WRF学习笔记二:WRF-chem简单入门运行指南
- Vue2基础-el与data的两种写法(HTML版)
- 第二天学习笔记:(MDN HTML学习、web安全策略与常见攻击、语义化)
- 中山大学生科院骆观正教授课题组诚聘博士后及副研究员
- Warshall算法(C++代码实现)
- 阿里云服务器怎么样?详细介绍
- mapbox样式规范(style)
- 1471_TC275的内核种类以及ID判断
- Pangu and Stones (hihocoder 1636)
- <笔试> 回转寿司题解 动态规划
- 【Nexus】通过Nexus搭建Npm私库
热门文章
- error: Can not locate config makefile for product “xx“.
- Error: Gradle project sync failed. Please fix your project and try again.
- Android 购物车图片上面添加数字
- Android 串口通讯 获取卡号
- 一个http的Post请求问题,unable to resolve host 我的域名:no address associated with hostnam...
- SQL概念及DDL语句
- COLLATE 函数
- 201621123068 作业08-集合
- Redis 高级特性(5)— 集群模式(主从模式、哨兵模式、cluster 集群模式)
- Windows Python3.6 安装 IPython(Jupyter) qtconsole