首页 > 代码库 > Linux学习之源码2:start_kernel流程
Linux学习之源码2:start_kernel流程
一、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初始化,内存管理初始化,进程管理,文件系统,中断,同步互斥,时钟,调试等等方面,伤脑筋啊