Responsibilities of the IPL

The initial task of the IPL is to minimally configure the hardware to create an environment that allows the startup program (e.g. startup-bios, startup-ixdp425, etc.), and consequently the microkernel, to run. This includes at least the following:

  1. Start execution from the reset vector.
  2. Configure the memory controller. This may include configuring the chip selects and/or PCI controller.
  3. Configure clocks.
  4. Set up a stack to allow the IPL library to perform OS verification and setup (download, scan, set up, and jump to the OS image).

The IPL's initialization part is written entirely in assembly language (because it executes from ROM with no memory controller). After initializing the hardware, the IPL then calls the main() function to initiate the C-language environment.

Once the C environment is set up, the IPL can perform different tasks, depending on whether the OS is booting from a linearly mapped device or a bank-switched device:

Linearly mapped
The entire image is in the processor's linear address space.
Bank-switched
The image isn't entirely addressable by the processor (e.g. bank-switched ROM, disk device, network, etc.).

Note that we use the term "ROM" generically to mean any nonvolatile memory device used to store the image (Flash, RAM, ROM, EPROM, flash, battery-backed SRAM, etc.).