Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
KOBJ(9)			 BSD Kernel Developer's	Manual		       KOBJ(9)

     kobj -- a kernel object system for	FreeBSD

     #include <sys/param.h>
     #include <sys/kobj.h>

     kobj_class_compile(kobj_class_t cls);

     kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);

     kobj_class_free(kobj_class_t cls);

     kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);

     kobj_init(kobj_t obj, kobj_class_t	cls);

     kobj_init_static(kobj_t obj, kobj_class_t cls);

     kobj_delete(kobj_t	obj, struct malloc_type	*mtype);

     DEFINE_CLASS(name,	kobj_method_t *methods,	size_t size);

     The kernel	object system implements an object-oriented programming	system
     in	the FreeBSD kernel.  The system	is based around	the concepts of	inter-
     faces, which are descriptions of sets of methods; classes,	which are
     lists of functions	implementing certain methods from those	interfaces;
     and objects, which	combine	a class	with a structure in memory.

     Methods are called	using a	dynamic	method dispatching algorithm which is
     designed to allow new interfaces and classes to be	introduced into	the
     system at runtime.	 The method dispatch algorithm is designed to be both
     fast and robust and is only slightly more expensive than a	direct func-
     tion call,	making kernel objects suitable for performance-critical	algo-

     Suitable uses for kernel objects are any algorithms which need some kind
     of	polymorphism (i.e., many different objects which can be	treated	in a
     uniform way).  The	common behaviour of the	objects	is described by	a
     suitable interface	and each different type	of object is implemented by a
     suitable class.

     The simplest way to create	a kernel object	is to call kobj_create() with
     a suitable	class, malloc type and flags (see malloc(9) for	a description
     of	the malloc type	and flags).  This will allocate	memory for the object
     based on the object size specified	by the class and initialise it by ze-
     roing the memory and installing a pointer to the class' method dispatch
     table.  Objects created in	this way should	be freed by calling

     Clients which would like to manage	the allocation of memory themselves
     should call kobj_init() or	kobj_init_static() with	a pointer to the mem-
     ory for the object	and the	class which implements it.  It is also possi-
     ble to use	kobj_init() and	kobj_init_static() to change the class for an
     object.  This should be done with care as the classes must	agree on the
     layout of the object.  The	device framework uses this feature to asso-
     ciate drivers with	devices.

     The functions kobj_class_compile(), kobj_class_compile_static() and
     kobj_class_free() are used	to process a class description to make method
     dispatching efficient.  A client should not normally need to call these
     since a class will	automatically be compiled the first time it is used.
     If	a class	is to be used before malloc(9) and mutex(9) are	initialised,
     then kobj_class_compile_static() should be	called with the	class and a
     pointer to	a statically allocated kobj_ops	structure before the class is
     used to initialise	any objects.  In that case, also kobj_init_static()
     should be used instead of kobj_init().

     To	define a class,	first define a simple array of kobj_method_t.  Each
     method which the class implements should be entered into the table	using
     the macro KOBJMETHOD() which takes	the name of the	method (including its
     interface)	and a pointer to a function which implements it.  The table
     should be terminated with two zeros.  The macro DEFINE_CLASS() can	then
     be	used to	initialise a kobj_class_t structure.  The size argument	to
     DEFINE_CLASS() specifies how much memory should be	allocated for each ob-

     Some of the concepts for this interface appeared in the device framework
     used for the alpha	port of	FreeBSD	3.0 and	more widely in FreeBSD 4.0.

     This manual page was written by Doug Rabson.

BSD			       November	14, 2011			   BSD


Want to link to this manual page? Use this URL:

home | help