Mauerer app04.tex V1 - 09/04/2008 6:12pm Page 1235
Appendix D: System Startup
in theprocfilesystem.init_workqueuesgenerates theeventswork queue, andusermodehelper_init
creates thekhelperwork queue.
do_basic_setup
init_workqueues
usermodehelper_init
driver_init
init_irq_proc
do_initcalls
Figure D-4: Code flow diagram
fordo_basic_setup.
Much more interesting isdo_initcalls, which is responsible for invoking the driver-specific initializa-
tion functions. Because the kernel can be custom configured, a facility must be provided to determine the
functions to be invoked and to define the sequence in which they are executed. This facility is known as
theinitcall mechanismand is discussed in detail later in this section.
The kernel defines the following macros to detect the initialization routines and to define their sequence
or priority:
<init.h>
#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __attribute_used__ \
__attribute__((__section__(".initcall" level ".init"))) = fn
#define pure_initcall(fn) __define_initcall("0",fn,0)
#define core_initcall(fn) __define_initcall("1",fn,1)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define late_initcall(fn) __define_initcall("7",fn,7)
The names of the functions are passed to the macros as parameters, as shown in the examples for
device_initcall(time_init_device)andsubsys_initcall(pcibios_init). This generates an entry
in the.initcalllevel.initsection. Theinitcall_tentry type is used and is defined as follows:
<init.h>
typedef int (*initcall_t)(void);
This is a pointer to functions that do not expect an argument and return an integer to indicate
their status.