INIT(9) ======== :doctype: manpage :man source: X15 :man manual: X15 Kernel initialization NAME ---- init - kernel initialization DESCRIPTION ----------- This document describes kernel initialization, and in particular, the concept of initialization operation and their dependencies. All related declarations are provided by the module:kern/init module. Initialization operations ~~~~~~~~~~~~~~~~~~~~~~~~~ An initialization operation is a function that enables the use of a specific interface. For example, The cfunction:thread_setup function enables the creation of threads. Any thread created before calling that function is invalid and leads to undefined behaviour, potentially being silent and unnoticed for a long time. This kind of relation is expressed as an initialization operation dependency. As a result, the data structure for initialization operations associates a function and its dependencies. Definition ~~~~~~~~~~ Initialization operations are defined using the cmacro:INIT_OP_DEFINE() macro. The first argument is the function implementing the operation, and any additional argument is a dependency. Dependencies are built with the cmacro:INIT_OP_DEP() macro. They may be either required or optional. An optional dependency is only used to infer execution order. If it fails, the initialization operation function is run regardless. Declaration ~~~~~~~~~~~ In order to build dependencies, initialization operations must be declared as part of the public interface of the module providing it. This is accomplished using the cmacro:INIT_OP_DECLARE() macro in the public header. Execution order ~~~~~~~~~~~~~~~ The complete set of initialization operations and their dependencies must result in a directed acyclic graph, so that a topological sort can be applied, starting from the roots, i.e. initialization operations with no dependencies. For convenience, the topological sort is performed both at build and run time. Sorting at build time is done with the shell:{make x15.sorted_init_ops} command. Debugging ~~~~~~~~~ In order to help debugging initialization issues, the module:kern/init module provides a debugging mode, that may be enabled at build time by changing an internal macro. In this mode, text buffers record various information such as the list of roots, operations with dependency cycles (in case the build time check isn't used), and the list of operations that completed. These buffers can be dumped using a debugger such as a JTAG interface. Debugging mode is enabled by setting the cmacro:INIT_DEBUG macro to a non-zero value. SEE --- manpage:intro {x15-operating-system}