linux/Documentation/kobject.txt的翻译
来源:互联网 发布:matlab 矩阵逻辑运算 编辑:程序博客网 时间:2024/05/17 23:05
linux/Documentation/kobject.txt的翻译
1.初始化kobjects
1.1 要初始化一个kobject,则调用函数kobject_init():
void kobject_init(struct kobject *kobj, struct kobj_type *ktype);ktype 要求kobject必须先创建后,因为每一个kobject必须关联一个kobj_type.当调用kobject_init()后,注册一个kobject到sysfs中需要调用kobject_add():
int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...);
这步会设置kobject的parent 和命名kobject。如果一个kobject关联一个指定的kset,kobj->kset必须在kobject_add()之前赋值。如果一个kset关联一个kobject,那么这个kobject的
parent就可以设置为NULL,然后这个kobject的parent就是kset
1.2 如果要获取kobject的name可以调用kobject_name():
const char *kobject_name(const struct kobject * kobj);1.3 也有一个便捷的函数可以一步完成初始化和注册kobject_init_and_add():
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...);
2.Uevents
当一个kobject被注册到kobject系统中,你必须向上层宣告这个kobject已经被注册了,这个时候就要调用kobject_uevent():
int kobject_uevent(struct kobject *kobj, enum kobject_action action);
使用KOBJ_ADD action来表示一个kobject第一次注册到Kernel中。这个必须在所有属性和子kobject都初始化完成后才调用。
当kobject移除kernel的时候,KOBJ_REMOVE 的uevent会自动被kobject系统创建。所以我们不必手动的去做。
3.引用计数
kobject的其中一项功能就是充当引用计数器,增加和减少引用计数分别是
struct kobject *kobject_get(struct kobject *kobj);void kobject_put(struct kobject *kobj);
kobject_get的成功调用会增加一个引用计数,而且返回指向kobject的指针
4.ktypes和release 方法
一旦你用kobject_add()注册一个kobject,你必须用kobject_put()来释放对象。
一般在release方法中释放kobject如例子:
void my_object_release(struct kobject *kobj) { struct my_object *mine = container_of(kobj, struct my_object, kobj); /* Perform any additional cleanup on this object, then... */ kfree(mine); }
一个重要点就是:每一个kobject都必须有一个release()方法。而且kobject将一直存在直到调用release方法。
有趣的是release()方法不是在kobject中,而是在ktype中,下面介绍kobj_type:
struct kobj_type { void (*release)(struct kobject *kobj); const struct sysfs_ops *sysfs_ops; struct attribute **default_attrs; const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); const void *(*namespace)(struct kobject *kobj); };
这个结构来表达一类kobject。每一个kobject都需要关联一个kobj_type;(其实也好理解,因为每一个kobject都要有一个release()方法,而release()正在ktype中)
default_attrs指向一组默认的attributes,然后创建在每一个在ktype中的kobject
5.ksets
kset就是一些你想要联系在一起的kobject的集合,没有规定必须要同样的ktype,但是要小心如果不是同样的ktype
kset有以下几个功能:
-----他是一系列objects的集合,一个kset可以被kernel分类标识为“所有的block devices"或者”所有的PCI device drivers“
-----一个kset是sysfs的子目录,每一个kset包含一个kobject可以设置为其他kobjects的parent.
------ksets 可以支持kobjects的“hotplugging”,影响uevents怎样report到userspace
kset让他的子类们保持在一个标准的内核联系列表中。Kobjects指向包含他们的kset通过他们的kset域。在大部分情况下,kobjects属于的那个kset就是他的parent.
因为kset包含一个kobject,那么他将被动态的创建,不会静态的声明,而且不会在stack上。创建一个kset:
struct kset *kset_create_and_add(const char *name, struct kset_uevent_ops *u, struct kobject *parent);
当你不使用一个kset的时候,call:
void kset_unregister(struct kset *kset);
来消除他
如果kset想kobjects的uevent,他可以使用struct kset_uevent_ops
struct kset_uevent_ops { int (*filter)(struct kset *kset, struct kobject *kobj); const char *(*name)(struct kset *kset, struct kobject *kobj); int (*uevent)(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env);};
filter函数,让kset阻止一个kobject的uevent,如果,return 0,那么uevent将不会发射到usespace
the uevent函数将被调用,当使更多的环境变量加入到uevent
可能有人要问,一个kobject怎样add到kset中,其实没有函数来做这项功能,这个是kobject_add()的任务,当一个kobject传到kobject_add(_),那么
他的kset域将会指到他属于的那个kset中
如果一个kobject属于一个kset没有设置parent,他将会被默认add到kset的目录。如果一个具体的parent设置到kobject中,这个kobject将注册在kset中,但是
在parent下
- linux/Documentation/kobject.txt的翻译
- 翻译 /documentation/kobject.txt
- 【加入自己的部分内容】Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- Linux内核文档翻译:Documentation/gpio.txt(转+改)
- Documentation/fb/framebuffer.txt 翻译
- Documentation目录下的as-iosched.txt文档翻译
- linux/Documentation/java.txt
- Linux/Documentation/io_ordering.txt
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- Linux/Documentation/io-mapping.txt
- linux内核Documentation/arm下的00-INDEX文档翻译
- Linux内核 Documentation下的00-INDEX文档翻译
- Linux的kobject机制
- Linux的kobject机制
- linux的kobject分析
- Linux/Documentation/kbuild/kconfig-language.txt
- Server2003系统启动后总提示:“系统已经在未计划的关机后重启”!
- 关于java的动态索引加载数据库
- QT信号和槽机制
- unix系统编程小结(一)------文件I/O
- RS232与485相关资料
- linux/Documentation/kobject.txt的翻译
- js判断undefined类型,undefined,null,NaN的区别
- Boot Debugging
- Kernel Debugging Tips
- netty-关闭应用程序
- RF技术
- linux系统用户切换开机关机
- 从30岁到35岁:为你的生命多积累一些厚度(好文 保留)
- Enumeration作用