下一个 上一个 目录

4. Linux 启动

我们首先从由 “startup_32:” 汇编标签执行的 C 代码启动 Linux 内核

|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

最后一个函数 “rest_init” 执行以下操作

  1. 启动内核线程 “init”
  2. 调用 unlock_kernel
  3. 使内核运行 cpu_idle 例程,这将是在没有任务调度时执行的空闲循环

实际上,start_kernel 过程永远不会结束。它将无限循环地执行 cpu_idle 例程。

以下是 “init” 的描述,它是第一个内核线程

|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

下一个 上一个 目录