当前位置: 首页 > news >正文

自己做坑人网站的软件销售网站设计

自己做坑人网站的软件,销售网站设计,无锡嘉饰茂建设网站,制作书签的感受心得kobject sysfs1 kobject2 ktype3 kset4 subsystem5 别混淆了这些结构体6 管理和操作kobject7 引用计数kref8 sysfssysfs中添加和删除kobject向sysfs添加文件9 内核事件层2.6内核增加了一个引人注目的新特性—同一设备模型。设备模型提供了独立的机制专门表示设备#xff0c;并… kobject sysfs1 kobject2 ktype3 kset4 subsystem5 别混淆了这些结构体6 管理和操作kobject7 引用计数kref8 sysfssysfs中添加和删除kobject向sysfs添加文件9 内核事件层2.6内核增加了一个引人注目的新特性—同一设备模型。设备模型提供了独立的机制专门表示设备并描述在系统中的拓扑结构。1 kobject 设备模型的核心部分就是kobject它由struct kobject定义于头文件linux/kobject.h中。kobject类似于C#或java这些面向对象语言中的object对象类提供了诸如计数、名称和父指针等字段可以创建对象的层次结构。 struct kobject {char * k_name;char name[KOBJ_NAME_LEN];struct kref kref;struct list_head entry;struct kobject * parent;struct kset * kset;struct kobj_type * ktype;struct dentry * dentry; };k_name指针指向kobject名称如果名称长度小于KOBJ_NAME_LEN那么该kobject的名称就存放在name数组中k_name指向数组头如果名称长度大于KOBJ_NAME_LEN则动态分配一个足够大的缓冲区来存放kobject的名称。KOBJ_NAME_LEN当前为20个字节。 parent指针指向kobject的父对象。因此kobject就会在内核中构造一个对象层次结构并且可以将多个对象间的关系表项出来。 dentry指针指向dentry结构体在sysfs中该结构体就表示这个kobject。 kref实现了kobject的引用计数。 kobject通常是嵌入到其他结构体中的其单独意义其实并不大。当kobject被嵌入到其他结构体中时该结构体便拥有了kobject提供的标准功能。 2 ktype kobject对象中的ktype域该结构体定义于头文件linux/kobject.h中 struct kobj_type {void (*release)(struct kobject *);struct sysfs_ops * sysfs_ops;struct attribute ** default_attrs; };ktype是为了描述一族kobject所具有的普遍特性。因此不在需要每个kobject都分别定义自己的特性而是将这些特性在ktype结构体中一次定义然后所有“同类”的kobject都能共享一样的特性。 release指针指向在kobject引用计数减为零时要被调用的析构函数。该函数负责释放所有的kobject使用的内存和其他相关清理工作。 sysfs_ops变量指向sysfs_ops结构体。该结构体表述了sysfs文件读写是的特性。 default_attrs指向一个attribute结构体数组。这些结构体定义了该kobject相关的默认属性。属性描述了给定对象的特征如果该kobject被导出到sysfs中那么这些属性都将相应地作为文件而导出。数组中的最后一项必须为NULL。 3 kset kobject中的kset域是kobject对象的集合体。把它看成是一个容器可将所有相关的kobject对象比如“全部的块设备”置于一个位置。kset把kobject集中到一个集合中。 kset指针指向kset集合kset集合由kset结构体表示定义于头文件linux/kobject.h中 struct kset {struct subsystem * subsys;struct kobj_type * ktype;struct list_head list;struct kobject kobj;struct kset_hotplug_ops * hotplug_ops; };其中ktype指向kset集合中kobject对象的类型。list连接该集合中所有的kobject对象kobj指向的kobject对象代表了该集合的基类。hotplug_ops指向一个用于处理集合中kobject对象的热插拔操作的结构体。 subsys指针指向该结构体相关的struct subsystem结构体。 4 subsystem subsystem在内核中代表高层概念它是一个或多个kset的大集合。 struct subsystem {struct kset kset;struct rw_semaphore rwsem; };虽然subsystem结构体只指向一个kset但是多个kset可以通过其subsys指针指向一个subsystem。这种单向关系意味着不可能仅仅通过一个subsystem结构体就找到所有的kset。 subsystem中的kset字段指向的是subsystem中默认的kset任rwsem字段是一个读写信号量该信号量用来对subsystem和它的所有的kset进行并发访问保护。 5 别混淆了这些结构体 这里最重要的是kobject它由struct kobject表示。kobject为我们引入了诸如计数、父子关系和对象名称等基本对象道具并且是以一个统一方式提供这些功能。不过kobject本身意义不大需要被嵌入到其他数据结构中。 kobject与一个特定的ktype对象关联ktype由struct kobject_type结构体表示在kobject中ktype字节指向该对象。ktype定义了一些kobject相关的默认特性析构行为、sysfs行为以及其他一些默认属性。 kset集合由struct kset结构体表示。kset提供了两个功能。第一其中嵌入的kobject作为kobject组合基类。第二kset将相关的kobject集合在一起。在sysfs中这些相关的kobject将以独立的目录出现在文件系统中。 subsystem表示的更为宏观它是包含kset的集合由struct subsystem结构体表示。sysfs中的根目录映射的便是subsystem。 这些数据结构的内在关系如下 6 管理和操作kobject 多数时候驱动程序开发者并不直接处理kobject因为kobject是被嵌入到一些特殊类型结构体中的而且由相关的 设备驱动程序在幕后管理。 使用kobject的第一步需要先来声明和初始化它。kobject通过函数kobject_init进行初始化该函数定义在文件linux/kobject.h中 void kobject_init(struct kobject *kobj);该函数的唯一参数就是需要初始化的kobject对象在调用初始化函数前kobject必须清空。如果kobject未被清空那么只需要调用memset()即可。 在清理后就可以安全地初始化parent和kset字段。 初始化后必须采用kobject_set_name()函数为kobject设置名称 int kobject_set_name(struct kobject *kobj,const char *fmt,...);该函数利用了printf和printk()风格的可变参数队列来为kobject设置名称。 初始化了kobject并设置名称后还需要为它设置kset字段以及可能的ktype字段可选。如果kset没有被提供那么仅需要设置ktype否则kset中的ktype字段将优先被使用。 7 引用计数 kobject的主要功能之一就是为我们提供了一个同一的引用计数系统。初始化后kobject的引用计数设置为1只要引用计数不为0那么该对象就会继续保留在内存中。任何包含对象引用的代码首先要增加该对象的引用计数当代码结束后则减少它的引用计数。增加引用计数称为获得get对象的引用减少引用计数称为释放put对象的引用。当引用计数减少到0时对象便可以被销毁。 增加一个引用计数可通过kobject_get()函数完成 struct kobject * kobject_get(struct kobject *kobj);该函数正常情况下返回一个指向kobject的指针如果失败返回NULL。 减少引用计数是通过kobject_put()完成 void kobject_put(struct kobject *kobj);如果对应的kobject的引用计数减少到0则与该kobject关联的ktype中的析构函数将被调用。 kref kobject的引用计数是通过kref结构体实现的该结构体定义在头文件linux/kref.h中 struct kref {atomic_t refcount; };其中唯一的字段是用来存放引用计数的原子变量。在使用kref之前必须先通过kref_init来初始化它 void kref_init(struct kref *kref) {atomic_set(kref-refcount,1); }这个函数简单地将原子变量置为1所以kref一旦被初始化它表示的引用计数便固定为1。 要获得对kref的引用需要调用kref_get函数 void kref_get(struct kref *kref) {WARN_ON(!atomic_read(kref-refcount));atomic_inc(kref-refcount); }该函数增加引用计数值它没有返回值。减少对kref的引用调用函数kref_put() void kref_put(struct kref *kref,void (*release)(struct kref *kref)) {WARN_ON(release NULL);WARN_ON(release (void (*)(struct kref*))kfree);if(atomic_dec_and_test(kref-refcount))release(kref); }该函数将使引用计数减1如果减少到0则调用作为参数提供的release函数注意WARN_ON声明提供的release函数不能简单地采用kfree它必须是一个仅接受一个kref结构体作为参数的特有函数而且还没有返回值。 上述的所有函数定义与声明分别在文件lib/kref.c和文件linux/kref.h中。 8 sysfs sysfs文件系统是一个处于内存中的虚拟文件系统它为我们提供了kobject对象层次结构的视图。帮助用户能以一个简单文件系统的方式来观察系统中各种设备的拓扑结构借助属性对象kobject可以用到处文件的方式将内核变量提供给用户读取或写入。 sysfs的诀窍是把kobject对象与目录项紧紧联系起来这是通过kobject对象中的dentry域实现的。dentry结构体表示目录项通过连接kobject到指定的目录项上无疑方便地将kobject映射到该目录上。从此把kobject导出形成文件系统就变得如同在内存中构建目录项一样简单。由于kobject被映射到目录项同时kobject形成一棵树因此sysfs的生成就很简单了。 sysfs中添加和删除kobject 仅仅初始化kobject是不能自动将其导出到sysfs中的想要把kobject导入sysfs需要用到函数kobject_add() int kobject_add(struct kobject *kobj);kobject在sysfs中位置取决于kobject在对象层次结构中的位置。如果kobject的parent指针被设置那么在sysfs中kobject将被映射为父目录下的子目录如果parent没有设置那么kobject将被映射为kset-kobj中的子目录。如果给定的kobject中parent或kset字段都没有设置那么就认为kobject没有父对象所以就会被映射成sysfs下的根级目录。 你不必分别调用kobject_init()和kobject_add()因为系统提供函数kobject_register()可帮助你一步到位 int kobject_register(struct kobject *kobj);该函数即初始化给定的kobject对象同时又将其加入到对象层次结构体中。 从sysfs中删除一个kobject对应文件目录需要使用函数kobject_del() void kobject_del(struct kobject *kobj);类似地函数kobject_unregister()包含了kobjeect_del和kobject_put二者的功能 void kobject_unregister(struct kobject *kobj);上述四个函数都定义与文件lib/kobject.c中声明于文件linux/kobject.h中。 向sysfs添加文件 sysfs仅仅是一个漂亮的树但是没有提供实际数据的文件。 默认的文件集合是通过kobject和kset中的ktype字段提供的。因此所有具有相同类型的kobject在它们对应的sysfs目录下都拥有相同的默认文件集合kobj_type字段含有一个字段default_attrs它是一个attribute结构体数组。这些属性负责将内核数据映射成sysfs中的文件。 attribute结构体定义在文件linux/sysfs.h中 struct attribute {char * name; /* 属性名 */struct module * owner; /* 所属模块如果存在 */mode_t mode; /* 权限 */ };name提供该属性的名称最终出现在sysfs中的文件名就是它owner字段在存在所属模块的情况下指向其所属module结构体。如果一个模块没有该属性那么该字段为NULL。mode表示了sysfs中该文件的权限。sysfs中的所有文件和目录的uid和gid标志均为0。 sysfs_ops字段描述了如何使用他们sysfs_ops字段指向了一个定义于文件linux/sysfs.h的同名的结构体 struct sysfs_ops {ssize_t (*show)(struct kobject *, struct attribute *,char *);ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); };show方法在读操作时被调用。它会拷贝由attr提供的属性值到buffer指定的缓冲区中缓冲区大小为PAGE_SIZE字节。 store方法在写操作时调用它会从buffer中读取size大小的字节并将其存放入attr表示的属性结构体变量中。 创建新属性 int sysfs_create_file(struct kobject *kobj,const struct attribute *attr);sysfs_create_file来创建新属性通过attr参数指向相应的attribute结构体而kobj则制定了属性所在的kobject对象。 除了添加文件外还有可能需要创建符号连接在sysfs中创建一个符号连接相当简单 int sysfs_create_link(struct kobject *kobj,struct kobject *target,char *name);该函数创建的符号连接名由name指定连接则由kobj对应的目录映射到target指定的目录 删除新属性 删除一个属性需通过函数sysfs_remove_file完成 sysfs_remove_file(struct kobject *kobj,const struct attribute *attr);另外由sysfs_create_link()创建的符号连接可通过函数sysfs_remove_link删除 void sysfs_remove_link(struct kobject *kobj,char *name);上述的四个函数在文件linux/kobject.h中声明sys_create_file和sysfs_remove_file函数定义于文件fs/sysfs/file.c中sysfs_create_link和sysfs_remove_link函数定义在文件fs/sysfs/symlink.c中。 9 内核事件层 内核事件层把事件模拟为信号从明确的kobject发出所以每个事件源都是一个sysfs路径。 每个事件都有一个可选的负载相比传递任意一个表示负载的字符串到用户空间而言内核事件层使用sysfs属性代表负载。 在内核代码中向用户空间发送信号使用函数kobject_uevent() int kobject_uevent(struct kobject *kobj,enum kobject_action action struct attribute *attr);第一个参数指定发送该信号的kobject对象实际的内核事件将包含该kobject映射到sysfs的路径。 第二个参数指定来描述该信号的动作。实际的内核事件将包含一个映射成枚举类型kobject_action的字符串。该函数不是直接提供一个字符串而是利用一个枚举变量来提高可重用性和保证类型安全而且也消除了打字错误或别的其他错误该枚举变量定义于文件linux/kobject_uevent.c中其形式为KOBJ_foo。当前值包含KOBJ_MOUNT、KOBJ_UNMOUNT、KOBJ_ADD等这些值分别映射mount、“unmonut”、“add”等。 最后一个参数是指向attribute结构体的可选指针它可看作为事件的“负载”。 该函数分配内存所以可以睡眠。但在内核中实现了原子和非原子操作两个版本其不同在于原子操作使用GFP_ATOMIC标志分配内存。 int kobject_uevent_atomic(struct kobject *kobj,enum kobject_action action,struct attribute *attr);这两个函数分别定义和声明在文件lib/kobject_uevent.c于文件linux/kobject_uevent.h中
http://wiki.neutronadmin.com/news/433379/

相关文章:

  • 建筑网站建设网站建设会犯法吗
  • 网站营销策略怎么写asp转换手机网站
  • 学校网站栏目建设北京师大互联网公司排名
  • 餐饮网站建设目标上海优化网站价格
  • 域名验证网站从零开始学做网站cdsn
  • 怎么查看网站开发语言网站未授权cas要怎么做
  • 制作图网站有哪些内容小说系统 wordpress
  • 吉首网站建设吉首网站建设icp ip 网站备案
  • 做网站的需求布吉做棋牌网站建设找哪家效益快
  • 如何学建设网站wordpress拍卖插件中文
  • 网站开发与设计现状国产免费crm系统有哪些在线
  • 做网站开发的步骤杭州网站建设路
  • 网站建设的流程该怎么确定重庆网络推广网站
  • 网站建设期末考试wordpress google搜索
  • seo网站程序自己开个什么小公司好
  • 网站 封锁右键通过网站做外贸
  • 朝阳周边做网站的公司好的免费个人网站
  • 网站如何申请微信支付接口旅游网站模块报价
  • 网站备案期间重庆网站优化网络服务
  • 网站建设修改企业应用平台和系统管理
  • 阿里备案成功后怎么做网站如何申请建设网站首页
  • 深圳网站建设找哪家网站建设课程ppt
  • 一级做爰A视频免费网站金华企业网站建设公司
  • 罗湖商城网站建设找哪家公司比较安全黑龙江建设网一体化平台
  • 课程网站开发的开题报告哪里买到纯净网站模板
  • 网站制作视频课程有哪些网站是可以做会计题目的
  • 无锡 网站建设页面设计的标准有哪些
  • 公司设计网站有什么好处网站建设流程体会
  • 杭州做网站外包公司网站如何做注册类 cpa
  • 网站开发毕业设计参考文献filetype doc 网站建设