What is Mac OS X Boot Process:
Firmware. Part of Hardware system
BootROM firmware is activated
Power-On Self Test
initializes some hardware interfaces and verifies that sufficient memory is available and in a good state.
Extensible Firmware Interface
EFI does basic hardware initialization and selects which operating system to use.
boot.efi boot loader
load the kernel environment
The init routine of the kernel is executed
boot loader starts the kernel’s initialization procedure
Various Mach/BSD data structures are initialized by the kernel.
The I/O Kit is initialized.
The kernel starts /sbin/mach_init
mach_init starts /sbin/init
init determines the runlevel, and runs /etc/rc.boot, which sets up the machine enough to run single-user.
rc.boot figures out the type of boot (Multi-User, Safe, CD-ROM, Network etc.)
- Power is turned on.
- Open Firmware code is executed.
- Hardware information is collected and hardware is initialized.
- Something (usually the OS, but also things like the Apple Hardware Test, etc.) is selected to boot. The user may be prompted to select what to boot.
- Control passes to /System/Library/CoreServices/BootX, the boot loader. BootX loads the kernel and also draws the OS badges, if any.
- BootX tries to load a previously cached list of device drivers (created/updated by /usr/sbin/kextcache). Such a cache is of the type mkext and contains the info dictionaries and binary files for multiple kernel extensions. Note that if the mkext cache is corrupt or missing, BootX would look in /System/Library/Extensions for extensions that are needed in the current scenario (as determined by the value of the OSBundleRequired property in the Info.plist file of the extension’s bundle.
- The init routine of the kernel is executed. The root device of the booting system is determined. At this point, Open Firmware is not accessible any more.
- Various Mach/BSD data structures are initialized by the kernel.
- The I/O Kit is initialized.
- The kernel starts /sbin/mach_init, the Mach service naming (bootstrap) daemon. mach_init maintains mappings between service names and the Mach ports that provide access to those services.
- mach_init starts /sbin/init, the traditional BSD init process. init determines the runlevel, and runs /etc/rc.boot, which sets up the machine enough to run single-user.
- rc.boot figures out the type of boot (Multi-User, Safe, CD-ROM, Network etc.). In case of a network boot (the sysctl variable kern.netboot will be set to 1 in which case), it runs /etc/rc.netboot with a start argument.
From here on, the startup becomes user-level:
Let’s describe Linux Boot Process:
Basic INPUT/OUTPUT System.
Master Boot Record
Grand Unified Bootloader
Executes Run level programs
|Run Level||Run Level Programs are executed from /etc/rc.d/rc*.d/|
- As power comes up the BIOS is given control
- BIOS runs self tests, usually including cursory memory tests.
- The BIOS then loads the first sector of the disk to be used for booting and transfers control to it.
- The MBR code varies. One version will chain to the code in the first sector of the boot partition (Windows), another will load a bootloader. Windows boot proceeds from code and information in the boot partition.
- The bootloader chooses kernel location and version
- The bootloader prepares kernel and initrd image in memory, transfers control to kernel
- Loading kernel modules
- Discovering hardware and load additional kernel modules to support it
- Looking for disks
- R/O mount of / partition so that it can potentially be checked and repaired
- init process spawn
- /etc/inittab read and executing
- Mounting all FSes from /etc/fstab
- runlevels running (based on default runlevel in /etc/inittab) or another init method such as systemd or upstart
- login prompt