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