The startup code completes the hardware configuration, detects system resources, and loads and starts the OS kernel.
In order to keep the QNX Neutrino RTOS as configurable as possible, the startup code can program components such the base timers, interrupt controllers, and cache controllers; and provide kernel callouts (see the Kernel Callouts chapter).
The startup code's main tasks are, in sequence:
If the IFS isn't in its final location in RAM when the startup code begins execution, the startup code copies it there.
The startup code itself can never be compressed. However, if the rest of the OS image is compressed, it is the responsibility of the startup code to decompress it to its final location.
The startup code does the minimum needed to detect the present hardware configuration, then completes any further configuration that might be required. Sometimes, very little is required: the MMU, the timer hardware, and the interrupt controllers (see Hardware initialization in this chapter).
Depending on the nature of the system, its software configuration can be either dynamically detected and set by the startup code, or pre-set (hardcoded).
When the startup code has initialized the system, it places the system information in the system page area, then transfers control to the QNX Neutrino kernel and process manager (procnto*).
The system page area is a dedicated area of memory. This area contains the data structures that the kernel examines to learn about the system configuration. This configuration information includes:
The system page also includes kernel callouts that provide board-specific code for:
For more information, see the System Page chapter.
The startup code's final task is to load the OS kernel and the process manager (procnto), which:
When this phase is complete, the system is fully operational. The OS kernel can proceed to load and run user processes, as specified in the build scripts (see Scripts in the OS Image Buildfiles chapter).