KernelAnalysis-HOWTO: Linux Startup

Next Previous Contents

## 4. Linux Startup

We start the Linux kernel first from C code executed from ''startup_32:'' asm label:

    |startup_32:
       |start_kernel
          |lock_kernel
          |trap_init
          |init_IRQ
          |sched_init
          |softirq_init
          |time_init
          |console_init
          |#ifdef CONFIG_MODULES
             |init_modules
          |#endif
          |kmem_cache_init
          |sti
          |calibrate_delay
          |mem_init
          |kmem_cache_sizes_init
          |pgtable_cache_init
          |fork_init
          |proc_caches_init
          |vfs_caches_init
          |buffer_init
          |page_cache_init
          |signals_init
          |#ifdef CONFIG_PROC_FS
            |proc_root_init
          |#endif
          |#if defined(CONFIG_SYSVIPC)
             |ipc_init
          |#endif
          |check_bugs
          |smp_init
          |rest_init
             |kernel_thread
             |unlock_kernel
             |cpu_idle

- startup_32 [arch/i386/kernel/head.S]
- start_kernel [init/main.c]
- lock_kernel [include/asm/smplock.h]
- trap_init [arch/i386/kernel/traps.c]
- init_IRQ [arch/i386/kernel/i8259.c]
- sched_init [kernel/sched.c]
- softirq_init [kernel/softirq.c]
- time_init [arch/i386/kernel/time.c]
- console_init [drivers/char/tty_io.c]
- init_modules [kernel/module.c]
- kmem_cache_init [mm/slab.c]
- sti [include/asm/system.h]
- calibrate_delay [init/main.c]
- mem_init [arch/i386/mm/init.c]
- kmem_cache_sizes_init [mm/slab.c]
- pgtable_cache_init [arch/i386/mm/init.c]
- fork_init [kernel/fork.c]
- proc_caches_init
- vfs_caches_init [fs/dcache.c]
- buffer_init [fs/buffer.c]
- page_cache_init [mm/filemap.c]
- signals_init [kernel/signal.c]
- proc_root_init [fs/proc/root.c]
- ipc_init [ipc/util.c]
- check_bugs [include/asm/bugs.h]
- smp_init [init/main.c]
- rest_init
- kernel_thread [arch/i386/kernel/process.c]
- unlock_kernel [include/asm/smplock.h]
- cpu_idle [arch/i386/kernel/process.c]

The last function ''rest_init'' does the following:

1. launches the kernel thread ''init''
2. calls unlock_kernel
3. makes the kernel run cpu_idle routine, that will be the idle loop executing when nothing is scheduled

In fact the start_kernel procedure never ends. It will execute cpu_idle routine endlessly.

Follows ''init'' description, which is the first Kernel Thread:

    |init
       |lock_kernel
       |do_basic_setup
          |mtrr_init
          |sysctl_init
          |pci_init
          |sock_init
          |start_context_thread
          |do_init_calls
             |(*call())-> kswapd_init
       |prepare_namespace
       |free_initmem
       |unlock_kernel
       |execve

Next Previous Contents