Reference 1
generic call sort and dispatch mechanism;
dynamic initialization of kernel;
allows kernel subsystems to be reordered, and added, removed, and replaced at kernel link time when kernel or one of its module is loaded;
without having to edit a statically ordered initialization routing and recompile the kernel;
kernel linker
Linker: take static data declared at multiple locations throughout a program’s source and group it together as a single contiguous chunk of data. This linker technique is called a “linker set”.
SYSINIT uses two linker sets to maintain two data sets containing each consumer’s call order, function, and a pointer to the data to pass to that function. Startup and shutdown data sets.
Two priorities:
sys/kernel.h: sysinit_sub_id
;sys/kernel.h:sysinit_elem_order
;Two Uses of SYSINIT:
function dispatch at system shutdown and kernel module unload.
system startup SYSINIT to initialize data structures. e.g. process scheduling subsystem uses a SYSINIT to initialize the run queue data structure.
in sys/kernel.h
SYSINIT(uniquifier, subsystem, order, func, ident) // for startup data set SYSUNINIT(uniquifier, subsystem, order, func, ident) // for shutdown data set
SYSINIT() macro: takes a uniquifier (that SYSINIT uses to identify the particular function dispatch data), the subsystem order, the subsystem element order, the function to call, and the data to pass the function. All functions must take a constant pointer argument.
Example:
#include <sys/kernel.h>
void foo_null(void *unused)
{
foo_doo();
}
SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);
struct foo foo_voodoo = {
FOO_VOODOO;
}
void foo_arg(void *vdata)
{
struct foo *foo = (struct foo *)vdata;
foo_data(foo);
}
SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);
SI_SUB_FOO
and SI_ORDER_FOO
defined in sysinit_sub_id
and sysinit_elem_order
enum’s.
If you could revise
the fundmental principles of
computer system design
to improve security...
... what would you change?