FreeBSD系统内核对象
来源:FreeBSD中文用户组 作者: 出处:综艺读书 2006-03-18内核对象,也就是Kobj,为操作系统内核提供了一种面向对象的C语言编程方式。被操作的数据也承载操作它的方法。这使得在不破坏二进制兼容性的前提下,某一个接口能够增/减相应的操作。Kobj工作时,产生方法的描述。每个描述有一个唯一的标识和一个缺省函数。
|
|
|||
如何使用Kobj
结构 struct kobj_method 函数 void kobj_class_compile(kobj_class_t cls); void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops); void kobj_class_free(kobj_class_t cls); kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags); void kobj_init(kobj_t obj, kobj_class_t cls); void kobj_delete(kobj_t obj, struct malloc_type *mtype); 宏 KOBJ_CLASS_FIELDS KOBJ_FIELDS DEFINE_CLASS(name, methods, size) KOBJMETHOD(NAME, FUNC) 头文件 <SYS param.h>建立一个接口的模板
<SYS kobj.h>
使用Kobj的第一步是建立一个接口。建立接口包括建立模板的工作。建立模板可用脚本src/sys/kern/makeobjops.pl完成,它会产生申明方法的头文件和代码,脚本还会生成方法查找函数。 在这个模板中如下关键词会被使用: #include, INTERFACE, CODE, METHOD, STATICMETHOD, 和 DEFAULT. #include语句的整行内容将被一字不差的复制到被生成的代码文件的头部。
例如: #include
CODE {
struct foo * foo_alloc_null(struct bar *)
{
return NULL;
}
};
关键词METHOD用来描述一个方法。语法是: METHOD [返回值类型] [方法名] { [对象 [, 参数若干]] }; 例如: METHOD int bar {
struct object *;
struct foo *;
struct bar;
};
关键词DEFAULT跟在关键词METHOD之后,是对关键词METHOD的补充。它给这个方法补充上缺省函数。语法是: METHOD [返回值类型] [方法名] { [对象; [其它参数]] }DEFAULT [缺省函数]; 例如: METHOD int bar {
struct object *;
struct foo *;
int bar;
} DEFAULT foo_hack;
关键词STATICMETHOD类似关键词METHOD。对于每个Kobj对象,一般其头部都有一些Kobj专有的数据。METHOD定义的方法就假设这些专有数据位于对象头部;假如对象头部没有这些专有数据,这些方法对这个对象的访问就可能出错。而STATICMETHOD定义的对象可以不受这个限制:这样描述出的方法,其操作的数据不由这个类的某个对象实例给出,而是全都由调用这个方法时的操作数(译者注:即参数)给出。这也对于在某个类的方法表之外调用这个方法有用。 其它完整的例子:
src/sys/kern/bus_if.m src/sys/kern/device_if.m建立一个类
使用Kobj的第二步是建立一个类。一个类的组有名字、方法表;假如使用了Kobj的“对象管理工具”(Object Handling Facilities),类中还包含对象的大小。建立类时使用宏DEFINE_CLASS()。建立方法表时,须建立一个kobj_method_t数组,用NULL项结尾。每个非NULL项可用宏KOBJMETHOD()建立。 例如:
DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));
kobj_method_t foomethods[] = {
KOBJMETHOD(bar_doo, foo_doo),
KOBJMETHOD(bar_foo, foo_foo),
{ NULL, NULL}
};
类须被“编译”。根据该类被初始化时系统的状态,将要用到一个静态分配的缓存和“操作数表”(ops table,译者注:即“参数表”)。这些操作可通过声明一个结构体struct kobj_ops并使用kobj_class_compile_static(),或是只使用kobj_class_compile()来完成。建立一个对象
使用Kobj的第三步是定义对象。Kobj对象建立程序假定Kobj专有数据在一个对象的头部。如果不是如此,应当先自行分配对象,再使用kobj_init()初始化对象中的Kobj专有数据;其实可以使用kobj_create()分配对象,并自动初始化对象中的Kobj专有内容。kobj_init()也可以用来改变一个对象所使用的类。 将Kobj的数据集成到对象中要使用宏KOBJ_FIELDS。 例如:
struct foo_data {
KOBJ_FIELDS;
foo_foo;
foo_bar;
};
调用方法使用Kobj的最后一部就是通过生成的函数调用对象类中的方法。调用时,接口名与方法名用'_'接合,而且全部使用大写字母。 例如,接口名为foo,方法为bar,调用就是: [返回值 = ] FOO_BAR(对象 [, 其它参数]);
当一个用kobj_create()不再需要被使用时,可对这个对象调用kobj_delete()。当一个类不再需要被使用时,可对这个类调用kobj_class_free()。
相关图文阅读
频道图文推荐
相关专题
·系统优化大全 (13944篇文章)
·系统安全设置 (18567篇文章)
·系统安装手册 (16426篇文章)
·系统备份专题 (13550篇文章)
·系统维护手册 (13080篇文章)
·FreeBSD系统安全管理 (7310篇文章)
·全面解析 Linux2.6内核 (525篇文章)
·FreeBSD使用教程 (5218篇文章)
·Freebsd频道 (618篇文章)
·FreeBSD系统的使用 (83篇文章)
·系统安全设置 (18567篇文章)
·系统安装手册 (16426篇文章)
·系统备份专题 (13550篇文章)
·系统维护手册 (13080篇文章)
·FreeBSD系统安全管理 (7310篇文章)
·全面解析 Linux2.6内核 (525篇文章)
·FreeBSD使用教程 (5218篇文章)
·Freebsd频道 (618篇文章)
·FreeBSD系统的使用 (83篇文章)
阅读排行榜
·FreeBSD下构建安全的Web服务器 (10次浏览)
最新技术文档
·FreeBSD下构建安全的Web服务器 07-11
·在FreeBSD4.x中制作启动菜单 12-12
·在FREEBSD 5中使用MRTG画图 12-07
·浅谈FreeBSD 5.2常用操作的改变 12-02
·FreeBSD如何通过代理上网更新 11-21
·拿刀砍才能进freebsd系统的修复方法 10-27
·FreeBSD新手建议 10-14
·CERT? Advisory CA-2003-25 Buffer Overflow in Se 10-12
·FREEBSD下使用crunch集成编译程序 10-10
·FreeBSD下配置IPSec:WinXP------FreeBSD 10-10
·在FreeBSD4.x中制作启动菜单 12-12
·在FREEBSD 5中使用MRTG画图 12-07
·浅谈FreeBSD 5.2常用操作的改变 12-02
·FreeBSD如何通过代理上网更新 11-21
·拿刀砍才能进freebsd系统的修复方法 10-27
·FreeBSD新手建议 10-14
·CERT? Advisory CA-2003-25 Buffer Overflow in Se 10-12
·FREEBSD下使用crunch集成编译程序 10-10
·FreeBSD下配置IPSec:WinXP------FreeBSD 10-10
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容




