Pictorially (loosely speaking :), Linux initialization looks like this, where "[...]" means optional (depends on the kernel's configuration) and "{...}" is a comment.
+-------------------------------+
| arch/i386/boot/setup.S:: + |
| arch/i386/boot/video.S:: |
|-------------------------------|
| start_of_setup: |
| check that loaded OK |
| get system memory size |
| get video mode(s) |
| get hard disk parameters |
| get MC bus information |
| get mouse information |
| get APM BIOS information |
| enable address line A20 |
| reset coprocessor |
| mask all interrupts |
| move to protected mode |
| jmp to startup_32 |
+-------------------------------+
|
v
+-------------------------------+
| arch/i386/kernel/head.S:: |
|-------------------------------|
| startup_32: |
| set segment registers to |
| known values |
| init basic page tables |
| setup the stack pointer |
| clear kernel BSS |
| setup the IDT |
| checkCPUtype |
| load GDT, IDT, and LDT |
| pointer registers |
| start_kernel |
| {it does not return} |
+-------------------------------+
|
v
+-------------------------------+ +-------------------------------+
| init/main.c:: | +->| arch/i386/kernel/setup.c:: |
|-------------------------------| | |-------------------------------|
| start_kernel(): | | | setup_arch(): |
| lock_kernel | | | copy boot parameters |
| setup_arch |--+ | init ramdisk |
| parse_options |<-+ | setup_memory_region |
| trap_init | | | parse_cmd_line |
| cpu_init | | | use the BIOS memory map to |
| init_IRQ | | | setup page frame info. |
| sched_init | | | reserve physical page 0 |
| init_timervecs | | | [find_smp_config] |
| time_init | | | paging_init |
| softirq_init | | | [get_smp_config] |
| console_init | | | [init_apic_mappings] |
| [init_modules] | | | [reserve INITRD memory] |
| [profiling setup] | | | probe_roms to search |
| kmem_cache_init | | | for option ROMs |
| sti | | | request_resource to |
| calibrate_delay | | | reserve video RAM memory |
| [INITRD setup] | | | request_resource to |
| mem_init | | | reserve all standard PC |
| free_all_bootmem | +--| I/O system board resources|
| kmem_cache_sizes_init | +-------------------------------+
| [proc_root_init] |
| fork_init |
| proc_caches_init |
| vfs_caches_init |
| buffer_init |
| page_cache_init |
| kiobuf_setup |
| signals_init | +-------------------------------+
| bdev_init | | init/main.c:: |
| inode_init | | init(): {...init thread...} |
| [ipc_init] | | do_basic_setup |
| [dquot_init_hash] | | {bus/dev init & initcalls}|
| check_bugs | | free_initmem |
| [smp_init] {*below} | | open /dev/console |
| start init thread {---->} |.....| exec init script or shell |
| unlock_kernel | | or panic |
| cpu_idle | +-------------------------------+
+-------------------------------+
+-------------------------------+
| smpboot.c::smp_init |
|-------------------------------|
| arch/i386/kernel/smpboot.c:: |
| smp_boot_cpus(): |
| [mtrr_init_boot_cpu] |
| smp_store_cpu_info |
| print_cpu_info |
| save CPU ID/APIC ID mappings|
| verify_local_APIC |
| connect_bsp_APIC |
| setup_local_APIC |
| foreach valid APIC ID |
| do_boot_cpu(apicid) |
| setup_IO_APIC |
| setup_APIC_clocks |
| synchronize_tsc_bp |
+-------------------------------+