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

FreeBSD Manual Pages

  
 
  

home | help
SYSINIT(9)		   Kernel Developer's Manual		    SYSINIT(9)

NAME
       SYSINIT,	SYSUNINIT -- a framework for dynamic kernel initialization

SYNOPSIS
       #include	<sys/param.h>
       #include	<sys/kernel.h>

       SYSINIT(uniquifier,	  enum	      sysinit_sub_id	    subsystem,
	   enum	   sysinit_elem_order	  order,     sysinit_cfunc_t	 func,
	   const void *ident);

       SYSUNINIT(uniquifier,	    enum       sysinit_sub_id	    subsystem,
	   enum	   sysinit_elem_order	  order,     sysinit_cfunc_t	 func,
	   const void *ident);

DESCRIPTION
       SYSINIT	is  a mechanism	for scheduling the execution of	initialization
       and teardown routines.  This is similar to init and fini	routines  with
       the addition of explicit	ordering metadata.  It allows runtime ordering
       of  subsystem  initialization  in  the kernel as	well as	kernel modules
       (KLDs).

       The SYSINIT() macro creates a struct sysinit and	stores it in a startup
       linker set.  The	struct sysinit type as well as the  subsystem  identi-
       fier   constants	  (SI_SUB_*)  and  initialization  ordering  constants
       (SI_ORDER_*) are	defined	in <sys/kernel.h>:

       struct sysinit {
	       enum sysinit_sub_id subsystem;  /* subsystem identifier*/
	       enum sysinit_elem_order order;  /* init order within subsystem*/
	       SLIST_ENTRY(sysinit) next;      /* singly-linked	list */
	       sysinit_cfunc_t func;	       /* function	       */
	       const void      *udata;	       /* multiplexer/argument */
       };

       The SYSINIT() macro takes a uniquifier argument to identify the partic-
       ular function dispatch data, the	subsystem type of  startup  interface,
       the subsystem element order of initialization within the	subsystem, the
       func function to	call, and the data specified in	ident argument to pass
       the function.

       The  SYSUNINIT()	 macro behaves similarly to the	SYSINIT() macro	except
       that it adds the	data to	a shutdown linker set.

       The startup linker set for the kernel is	scanned	during boot to build a
       sorted list of initialization routines.	 The  initialization  routines
       are  then  executed  in the sorted order.  The subsystem	is used	as the
       primary key and is sorted in ascending order.  The order	is used	as the
       secondary key and is sorted in ascending	order.	The relative order  of
       two routines that have the same subsystem and order is undefined.

       The  startup  linker sets for modules that are loaded together with the
       kernel by the boot loader are scanned during the	 SI_SUB_KLD  subsystem
       initialization.	 These modules'	initialization routines	are sorted and
       merged into the kernel's	list of	startup	routines and are executed dur-
       ing boot	along with the kernel's	initialization	routines.   Note  that
       this has	the effect that	any initialization routines in a kernel	module
       that are	scheduled earlier than SI_SUB_KLD are not executed until after
       SI_SUB_KLD during boot.

       The  startup  linker  set  for  a  kernel  module loaded	at runtime via
       kldload(2) is scanned, sorted, and executed when	the module is loaded.

       The shutdown linker set for a kernel module is scanned, sorted, and ex-
       ecuted when a kernel module is unloaded.	  The  teardown	 routines  are
       sorted  in the reverse order of the initialization routines.  The tear-
       down routines of	the kernel and any loaded  modules  are	 not  executed
       during shutdown.

EXAMPLES
       This example shows the SYSINIT which displays the copyright notice dur-
       ing boot:

	     static void
	     print_caddr_t(void	*data)
	     {
		     printf("%s", (char	*)data);
	     }
	     SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t,
		 copyright);

SEE ALSO
       kld(4),	   DECLARE_MODULE(9),	  DEV_MODULE(9),     DRIVER_MODULE(9),
       MTX_SYSINIT(9), SYSCALL_MODULE(9)

HISTORY
       The SYSINIT framework first appeared in FreeBSD 2.2.

AUTHORS
       The   SYSINIT   framework   was	  written    by	   Terrence    Lambert
       <terry@FreeBSD.org>.

       This manual page	was written by Hiten Pandya <hmp@FreeBSD.org>.

FreeBSD	14.3		       December	1, 2010			    SYSINIT(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=SYSINIT&sektion=9&manpath=FreeBSD+14.3-RELEASE+and+Ports>

home | help