FreeBSD系统内核对象( 二 )


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() 。

推荐阅读