LINUX學習之源碼2:START_KERNEL流程

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初始化,內存管理初始化,進程管理,文件系統,中斷,同步互斥,時鐘,調試等等方面,傷腦筋啊 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章