MutekH startup and initializations

This page describes how the various parts of the kernel are initialized when the operating system starts.

Modular startup process

The MutekH statup process consists in calling many intialization functions for all components of the system. Depending on the current build configuration, different modules and features are enabled at compile time. This make the set of relevant initialization functions change with the current configuration.

The initialization order of the various parts of the kernel is important because some components do depend on other components which need to be initialized first. The proper order may also be different depending on some configuration parameters like the target architecture.

Rather than defining the initialization order directly, the MutekH build system generates a list of intialization function calls sorted in the right order based on some expressed ordering constraints. This allows the developper of a software component to insert its intialization function calls at the right time relative to intialization of other components.

The kernel initialization stages are arranged in a hierarchical manner. Internal nodes of this intialization tree define the main steps of startup process whereas leaf nodes actually define the function calls which must take place. Ordering constraints are expressed along with the hierarchy using intialization tokens in the build system configuration files.

Initialization functions

The whole startup process is split in two main groups of intialization tokens:

  • Intializations which take place on the bootstrap processor while other processors are waiting.
  • Intializations which take place at the same time on all processors.

The bootstrap processor usally starts execution in assembly code in the cpu_boot function. It then jumps to the mutekh_startup function which contains function calls generated by the build system for the INIT_MUTEKH_STARTUP initialization token.

On multiprocessors platforms other processors enter the mutekh_startup_smp function when instructed to do so by the bootstrap processor. This function contains function calls corresponding to the INIT_SMP token which is actually the same as the second half of INIT_MUTEKH_STARTUP.

Initialization tokens which are part of INIT_SMP group can call the mutekh_startup_smp_barrier function to ensure that all processors have reached this same point in code. If an intialization must be performed on a single processor in this intialization group, the result of the cpu_isbootstrap function must be tested.

Startup related functions are declared in the mutek/startup.h header file.

Main intialization steps

The first part of the startup process executed on the boostrap processor only includes the following main steps (when relevant):

  • initialization of memory sections .bss and .data.
  • initialization of the early output console.
  • initialization memory and page allocators.
  • initialization and enumeration of devices present in the platform, including processors.
  • initialization of the associated device drivers.

The second part of the startup process which is executed by all processors includes:

  • initialization of each processor registers
  • initialization of the scheduler
  • initialization of other libraries and software components
  • initialization of the application
  • enter the scheduler loop

Below is an sample herarchical view of the main intialization tokens as output by the make listinit command with a multiprocessor build configuration (as described on the BuildSystem page).

         * INIT_MEMORY                             
             * INIT_MEMORY_SECTIONS                
                 * ....
             * INIT_MUTEK_EARLY_CONSOLE            
                 * ....
             * INIT_MUTEK_MEMALLOC                 
                 * ....
         * INIT_DEVICE                             
             * INIT_DEVICE_TREE                    
             * INIT_DEVICE_ENUM                    
                 * ....
             * INIT_DEVICE_DRIVERS                 
         * INIT_START_CPUS
             * ....
     * INIT_SMP                                    
         * INIT_CPUS                               
             * INIT_DEVICE_CPU_REGS                
             * INIT_MUTEK_FAULT_HANDLER            
         * INIT_MUTEK_SCHEDULER_INIT               
         * INIT_MUTEK_CONSOLE                      
         * INIT_LIBRARIES                          
             * ....
         * INIT_APPLICATION                        
         * INIT_MUTEK_SCHEDULER_START              

The INIT_APPLICATION step calls the app_start function which must be defined in the application source code.

Here is an example intialization function calls order retained by the build system:

       INIT_SOCLIB_BSS                  soclib_bss_section_init()
       INIT_SOCLIB_DATA                 soclib_data_section_init()
       INIT_SOCLIB_EARLY_CONSOLE        soclib_early_console_init()
       INIT_SOCLIB_MEM_ALLOC            soclib_mem_init()
       INIT_DEVICE_TREE                 device_tree_init()
       INIT_SOCLIB_FDT                  soclib_fdt_init()
       INIT_DEVICE_DRIVERS              libdevice_drivers_init()
       INIT_SMP_STARTUP_BARRIER         mutek_startup_barrier_init()
       INIT_SOCLIB_START_CPUS           soclib_start_cpus()
       INIT_SOCLIB_SMP_WAIT_BOOTSTRAP   soclib_smp_wait_bootstrap()
       INIT_DEVICE_CPU_REGS             libdevice_cpu_regs_initsmp()
       INIT_MUTEK_FAULT_HANDLER         mutek_fault_initsmp()
       INIT_MUTEK_SCHEDULER_INIT        mutek_scheduler_initsmp()
       INIT_MUTEK_CONSOLE               mutek_console_initsmp()
       INIT_APPLICATION                 mutek_app_initsmp()
       INIT_MUTEK_SCHEDULER_START       mutek_scheduler_start()
Last modified 7 years ago Last modified on Dec 18, 2012, 6:04:17 PM