Linux Kernel boot sequence

http://elmurod.net/en/index.php/archives/625

Execution in Assembly

Entry point for Kernel uncompressed – arch/arm/kernel/head.S
  1. Read processor ID in coprocessor and obtain proc_info_list pointer
  2. Lookup machine type based on mach-id passed by bootloader (R1), get the mach_desc pointer and save mach-id
  3. Determine vailidity of ATAGS pointer (R2) and save
  4. Setup minimal pagetable to get Kernel running on virtual address, also setup one-to-one mapping for the page that turns on MMU
  5. Initialize TLB, caches, setup MMU to be turned on
  6. Turn on MMU
  7. Branch to start_kernel

Execution in C

C entry point –  start_kernel() init/main.c
  1. Disable IRQ local_irq_disable()
  2. Print Linux banner
  3. Arch specific setup setup_arch() (arch/arm/kernel/setup.c)
    1. Using mach-id, get pointer to machine_desc (defined in board file)
    2. Using ATAG physical pointer, obtain virtual address
    3. Invoke machine specific fixup
    4. Save & parse ATAGS parse_atags() (arch/arm/kernel/setup.c)
    5. Parse early params parse_early_params
    6. arm_memblock_init (arch/arm/mm/init.c)
      1. Invoke machine specific reserve
    7. Setup pagetables paging_init (arch/arm/mm/mmu.c)
      1. prepare_pagetable
      2. Map memory banks
      3. Map machine vectors devicemaps_init
      4. Invoke machine specific map_io
      5. Allocate zero page
      6. bootmem_init (arch/arm/mm/init.c)
    8. Install vectors early_trap_init (arch/arm/kernel/traps.c)
    9. Invoke machine specific init_early
  4. Build memory zone list build_all_zonelists() (mm/pagealloc.c)
  5. Print Kernel command line
  6. Parse early params
  7. Parse commandline args parse_args (kernel/params.c)
  8. pid hashtable initialization
  9. Setup Kernel memory allocators mm_init
    1. Mark free areas in memory & print memory details
    2. Initialize page cache
    3. Initialize vmalloc
  10. Initialize scheduler sched_init
  11. Disable preemption
  12. Initialize RCU, radix tree
  13. early_irq_init (kernel/irq/irqdesc.c)
  14. Invoke machine specific init_irq
  15. Initialize software timers, soft irq init_timers (kernel/timer.c), softirq_init (kernel/softirq.c)
  16. Initialize clocksource & common timekeeping values timekeeping_init (kernel/time/timekeeping.c)
  17. time_init (arch/arm/kernel/time.c)
    1. Get machine specific timer
    2. Invoke machine specific timer->init
    3. sched_clock post init
  18. Enable IRQ
  19. Initialize console device (if console_initcall) console_init (drivers/tty/tty_io.c)
  20. kmem_leak_init (mm/kmemleak.c)
  21. Allocate per_cpu pagesets setup_per_cpu_pageset (mm/pagealloc.c)
  22. Initialize NUMA policy numa_policy_init (mm/mempolicy.c)
  23. calibrate_delay (init/calibrate.c)
  24. Initialize pid map pidmap_init (kernel/pid.c)
  25. Initialize anonymous vma anon_vma_init (mm/rmap.c)
  26. Initialize init process structure fork_init (kernel/fork.c)
  27. Initialize security framework security_init (security/security.c)
  28. Initialize kdb kdb_init (kernel/debug/kdb/kdb_main.c)
  29. Initialize caches for VFS vfs_caches_init (fs/dcache.c)
  30. Initialize proc FS proc_root_init (fs/proc/root.c)
  31. Initialize ftrace ftrace_init (kernel/trace/ftrace.c)
  32. rest_init (in non-init section)
    1. Spawn init process
    2. Spawn kthreadd
    3. Wait till kthreadd is setup
    4. Enable preemption
    5. schedule schedule (kernel/sched.c)
    6. Disable preemption
    7. cpu_idle (arch/arm/kernel/process.c)

process – 1 (init process) kernel_init (init/main.c)

  1. Wait till kthreadd is setup
  2. do_basic_setup
    1. Create usermode helper wq usermodehelper_init (kernel/kmod.c)
    2. Initialize tmpfs init_tmpfs (mm/shmem.c)
    3. Initialize driver model driver_init (drivers/base/init)
    4. Call initcalls as per the order (machine specific init_machine would get called due to this) do_initcalls
  3. prepare_namespace (init/do_mounts.c)
    1. Load initrd initrd_load (init/do_mounts_initrd.c)
      1. Identify decompressor method identify_ramdisk_image (init/do_mounts_initrd.c)
      2. Create memory for uncompressed FS
      3. Decompress FS and copy crd_load (init/do_mounts_rd)
    2. Mount root FS mount_root (init/do_mounts.c)
  4. init_post (in non-init section)
    1. Free memory in init section free_initmem (arch/arm/mm/init.c)
    2. Replace process – 1 (a kernel thread) with userspace init process, by exec in kernel run_init_process

Credit : Suresh Thiagarajan

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值