FreeBSD系统内核对象
2008-06-18 03:30:22来源: 阅读 ()
如何使用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()。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Freebsd oracle 10g 2009-05-13
- ACL 疑问 2009-05-13
- FreeBSD下nginx+fast-cgi+mysql+zend的实现 2009-05-13
- 声卡的问题 ! 2009-05-13
- 我喜欢的桌面主题 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash