http://www.cnblogs.com/cuckoocommon/p/3926864.html
一、X86的流程可以參考http://www.kerneltravel.net/kernel-book/第十三章%20啓動系統/13.5.htm
二、arm的流程,在http://www.cnblogs.com/gangsaleisi/archive/2013/01/09/2851734.html基礎上進行分析。
並且是在3.9.7版本上進行分析的,差別不是太大。
1.lockdep_init():lockdep哈希表初始化,lockdep是linux內核的一個調試模塊,用來檢查內核互斥機制尤其是自旋鎖潛在的死鎖問題,在kernel/lockdep.c中實現
2.smp_setup_processor_id():多CPU架構的初始化,空函數 ,這個怎麼是空函數,在arch/arm/kernel/setup.c中有這個函數的實現,不過在init/main.c中這個函數確實是空函數,那應該還是調用本文件的這個空函數
3. debug_objects_early_init():空函數,在lib/debugobjects.c中有實現
4. boot_init_stack_canary():初始化棧canary值,canary值用於防止棧溢出攻擊的堆棧的保護字,在arch/arm/include/asm/stackprotector.h中有實現,而在include/linux/stackprotector.h中是空函數,而在
main.c中包含的是#include <linux/stackprotector.h>,爲啥調用的不是這裏的空函數呢???
5. cgoup_init_early():空函數,在include/linux/cgroup.h中直接return0,而在kernel/cgroup.c中有實現的,如何判斷這些調用關係呢?
6. local_irq_disable():關閉系統總中斷,在include/linux/irqflags.h中
7. early_boot_irqs_disabled = true;
8. tick_init():初始化內核時鐘系統,空函數,在include/linux/tick.h中是空函數,在kernel/time/tick-common.c中有實現,初始化時鐘控制,註冊時鐘事件的回調函數
9. boot_cpu_init():激活當前cpu,在init/main.c中有實現
10. page_address_init():空函數,在include/linux/mm.h中是空函數,在mm/highmem.c中有實現,
11. printk(KERN_NOTICE '%s",linux_banner):打印內核版本信息,(串口打印第1行)
12.setup_arch(&command_line):內核架構相關初始化函數,在arch/arm/kernel/setup.c中有這個函數的實現
13.mm_init_owner(&init_mm,&init_task):初始化init_mm結構體,空函數,在include/linux/sched.h中是空函數,在kernel/fork.c中有實現,
14.mm_init_cpumask(&init_mm); 在include/linux/mm_types.h中有實現
15.setup_command_line(command_line):對cmdline進行備份和保存,在init/main.c中有實現
16.setup_nr_cpu_ids():空函數,在init/main.c中是空函數,在kernel/smp.c中有實現
17.setup_per_cpu_areas():設置SMP體系每個CPU使用的內存空間,同時拷貝初始化段裏數據,在mm/percpu.c中有實現,
18.smp_prepare_boot_cpu():空函數,在include/linux/smp.h中是空函數,在arm/kernel/smp.c中有實現,
19.build_all_zonelists(NULL):初始化所有內存管理節點列表,以便後面進行內存管理初始化
20.page_alloc_init():設置內存分頁分配通知器,在mm/page_alloc.c中有實現,
21.printk(KERN_NOTICE "Kernel command line:%s\n",boot_command_line):輸出命令參數到顯示終端,printk函數在kernel/printk.c中實現
22.parse_early_param():分析命令行最早使用的參數,在init/main.c中實現
23.parse_args(....):對傳入內核參數進行解釋,如果不能識別的命令就調用最後參數的函數,在kernel/params.c中實現
24.jump_label_init();在include/linux/jump_label.h中是空函數,在kernel/jump_label.c中有實現,
25.setup_log_buf(0);在include/linux/printk.h中是空函數,在kernel/printk.c中有實現,
26.pidhash_init():進程hash表的初始化,linux裏有四種類型的PID,因此有四種HASH表相對應##http://www.cnblogs.com/xuxm2007/archive/2011/04/15/2016735.html(thx)
在kernel/pid.c中實現。
27.vfs_caches_init_early():虛擬文件系統的早期初始化,包括dentry和inode的hash表初始化工作,在fs/dcache.c中實現
28.sort_main_extable():對內核異常表進行排序,在kernel/extable.c中實現
29.trap_init():對異常進行初始化,空函數,在arch/arm/kernel.c中實現
30.mm_init():內存分配器初始化,在init/main.c中實現
31.sched_init():初始化調度器數據結構並創建運行隊列,在kernel/sched/core.c中實現
32.preempt_disable():禁用搶佔和中斷,早期啓動時期,調度是極其脆弱的,在include/linux/preempt.h中實現
33.確認是否中斷關閉(irqs_disabled),若沒有關閉則再local_irq_disable
34.idr_init_cache(); 在lib/ldr.c中實現
35.perf_event_init(); 在include/linux/perf_event.h中爲空,在kernel/events/core.c中有實現
36.rcu_init():初始化直接讀拷貝更新的鎖機制,RCU主要提供在讀取數據機會比較多,但更新比較少的場合,這樣減少讀取數據鎖性能低下的問題
在include/linux/rcutiny.h中爲空,在kernel/rcutree.c中有實現
37.radix_tree_init():初始化radix樹算法初始化,在lib/radix_tree.c中實現
38.early_irq_init():早期外部中斷描述初始化,在kernel/irq/irqdesc.c中有實現,在kernel/softirq.c中直接return0
39.init_IRQ():架構相關中斷初始化,在arch/arm/kernel/irq.c中實現
40.init_timers():初始化引導CPU的時鐘相關的數據結構,在kernel/timer.c中實現
41.hrtimers_init():初始化高精度的定時器,在kernel/hrtimer.c中實現
42.softirq_init():初始化軟件軟件中斷,在kernel/softirq.c中實現
43.timekeeping_init():初始化系統時鐘計時,在kernel/time/timekeeping.c中實現
44.time_init():初始化系統時鐘,在arch/arm/kernel/time.c中實現
45.profile_init():分配內核性能統計,在include/linux/profile.h中直接return0,在kernel/profile.c中有實現
46.call_function_init(); 在include/linux/amp.h中爲空, 在kernel/smp.c中有實現
47.確認是否中斷關閉(irqs_disabled),若沒有關閉則再local_irq_disable
48.early_boot_irqs_disabled = false;設置內核還在早期初始化階段的標誌,以便用來調試時輸出信息,空函數
49.local_irq_enable():打開此CPU的中斷,即允許此CPU處理中斷事件,在include/linux/irqflags.h中
50.kmem_cache_init_late():slab分配器後期初始化,在mm/slob.c、slub.c、slab.c中有實現
51.console_init():初始化控制檯,在include/linux/tty.h中爲空,在drivers/tty/tty_io.c中實現
52.lockdep_info():打印鎖的依賴信息,用來調試鎖,在include/linux/lockdep.h中爲空,在kernel/lockdep.c中有實現
53.locking_selftest():測試鎖的API是否正常使用,空函數,在include/linux/debug_locks.h中爲空,在lib/locking-selftest.c中實現
54.page_cgroup_init():容器組的頁面內存分配,空函數,在include/linux/page_cgroup.h中爲空,在mm/page_cgroup.c中實現
55.debug_objects_mem_init():創建調試對象內存緩存,空函數,在include/linux/debugobjects.h爲空,在lib/debugobjects.c中實現
56.kmemleak_init():內存泄漏檢測機制的初始化,空函數,在include/linux/kmemleak.h中爲空,在mm/kmemleak.c中實現
57.setup_per_cpu_pageset():創建每個CPU的高速緩存集合數組,在mm/page_alloc.c中實現
58.numa_policy_init():初始化NUMA的內存訪問策略,在include/linux/mempolicy.h中爲空,在mm/mempolicy.c中實現
59.sched_clock_init():初始化調度時鐘,在kernel/sched/clock.c中實現
60.calibrate_delay():計算CPU需要校準的時間,在init/calibrate.c中實現
61.pidmap_init():PID分配映射初始化,在kernel/pid.c中實現
62.anon_vma_init():匿名虛擬內存域初始化,在include/linux/rmap.h中爲空,在mm/rmap.c中實現
63.thread_info_cache_init():線程信息的緩存初始化,在init/main.c中爲空,在kernel/fork.c中實現
64.cred_init():任務信用系統初始化,在kernel/cred.c中實現
65.fork_init(totalram_pages):進程創建機制初始化,在kernel/fork.c中實現
66.proc_caches_init():進程緩存初始化,在kernel/fork.c中實現
67.buffer_init():文件系統的緩存區初始化,在include/linux/buffer_head.h中爲空,在fs/buffer.c中實現
68.key_init():內核密鑰管理系統初始化,在include/linux/key.h中爲空,在security/keys/key.c中實現
69.security_init():內核安全框架初始化,在include/linux/security.h中爲空,在security/security.c中實現
70.dbg_late_init():內核調試系統後期初始化,在include/linux/kgdb.h中爲空,在kernel/debug/debug_core.c中實現
71.vfs_caches_init():虛擬文件系統緩存初始化,在fs/dcache.c中實現
72.signals_init():信號管理系統初始化,在kernel/signal.c中實現
73.page_writeback_init():頁回寫機制初始化,在mm/page-writeback.c中實現
74.proc_root_init():proc文件系統初始化,在fs/proc/root.c中實現
75.cgroup_init():進程控制組的初始化,在include/linux/cgroup.h中直接return0,在kernel/cgroup.c中實現
76.cpuset_init():CPUSET初始化,在include/linux/cpuset.h中直接return0,在kernel/cpuset.c中實現
77.taskstats_init_early():任務狀態早期初始化,在include/linux/taskstats_kern.h中爲空,在kernel/taskstats.c中實現
78.delayacct_init():任務延遲機制初始化,在include/linux/delayacct.h中爲空,在kernel/delayacct.c中實現
79.check_bugs():檢查CPU配置等是否非法使用不具備的功能,在arch/arm/include/asm/bugs.h中實現
80.acpi_early_init():初始化ACPI電源管理,在include/linux/acpi.h中爲空,在drivers/acpi/bus.c中實現
81.sfi_init_late():simple fireware interface 初始化在include/linux/sfi.h中爲空,在drivers/sfi/sfi_core.c中實現
82.如果EFI_RUNTIME_SERVICES則進行一些操作,貌似目前只支持x86
83.ftrace_init():初始化內核跟蹤模塊,在include/linux/ftrace.h中爲空,在kernel/trace/ftrace.c中實現
84.rest_init():後繼初始化,在init/main.c中實現,創建並啓動內核線程
rest_init -> kernel_thread -> kernel_init ->kernel_init_freeable -> do_basic_setup ->do_initcalls, 然後do_initcalls就初始化各個設備和驅動.
一堆的初始化函數,涵蓋了CPU初始化,內存管理初始化,進程管理,文件系統,中斷,同步互斥,時鐘,調試等等方面,傷腦筋啊