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
Copyright © 2010-2024 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout