linux/Documentation/kobject.txt的翻译

               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下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将QT += core QT -= gui CONFIG += c++11 TARGET = UavRectifyLoadLIb CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS win32{ CONFIG(debug, debug|release){ DESTDIR = $$PWD/../../../../RasterManager/bin/Debug } else{ DESTDIR = $$PWD/../../../../RasterManager/bin/release } INCLUDEPATH += $$PWD/../../../include/gdal1101 DEPENDPATH += $$PWD/../../../include/gdal1101 } else{ CONFIG(debug, debug|release){ DESTDIR = $$PWD/../../../product/release32 } else{ DESTDIR = $$PWD/../../../product/release32 } } # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lUAVAutoRectifyMt -lUAVAutoRectify -lUAVAutoRectifyFi INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include unix:!macx: LIBS += -L$$PWD/../../../lib/opencvf249/ -lopencv_core unix:!macx: LIBS += -L$$PWD/../../../lib/opencvf249/ -lopencv_highgui unix:!macx: LIBS += -L$$PWD/../../../lib/opencvf249/ -lopencv_imgproc INCLUDEPATH += $$PWD/../../../lib/opencvf249 DEPENDPATH += $$PWD/../../../lib/opencvf249 unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_core #unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_highgui unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_imgproc unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_features2d unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_imgcodecs INCLUDEPATH += $$PWD/../../../../../../../usr/local/include DEPENDPATH += $$PWD/../../../../../../../usr/local/include unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lDEMDriver unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lProjection unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lIImage_gC QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO 转为cmake格式
06-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值