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

Linux学习之源码2:start_kernel流程相关推荐

  1. Linux学习日记——源码编译Apache

    [本文为笔者在学习Linux 下的软件安装时,尝试使用源码安装Apache 的过程,事后进行一个小小的总结,发现错误望指正.] 一.典型的源码编译安装软件的过程包括以下3步: 1) 运行 config ...

  2. linux access源码,从零开始学习Linux:Day04 源码安装Nginx 。acess/status/referer

    从零开始学习Linux:Day04 源码安装Nginx .acess/status/referer 常见web服务器有IIS,apche,nginx,tomcat,tengine等等,现在nginx使 ...

  3. 小姐姐笔记:我是如何学习简单源码拓展视野的

    大家好,我是若川.这是我上周组织的源码共读纪年小姐姐的笔记,写得很好.所以分享给大家.欢迎加我微信 ruochuan12,进源码共读群.其他更多人的笔记可以阅读原文查看. 川哥的源码解读文章:据说 9 ...

  4. 我该如何学习spring源码以及解析bean定义的注册

    如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...

  5. TLD(Tracking-Learning-Detection)学习与源码理解之(二)

    TLD(Tracking-Learning-Detection)学习与源码理解之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 OpenTLD下载与编译 ...

  6. [系统安全] 六.逆向分析之条件语句和循环语句源码还原及流程控制

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. [安全攻防进阶篇] 四.逆向分析之条件语句和循环语句源码还原及流程控制逆向

    从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...

  8. 学习 vuex 源码整体架构,打造属于自己的状态管理库

    前言 这是学习源码整体架构第五篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现.本篇文章学习的是实际仓库的代码. 其余四篇分别是: ...

  9. 学习 redux 源码整体架构,深入理解 redux 及其中间件原理

    如果觉得内容不错,可以设为星标置顶我的公众号 1. 前言 你好,我是若川.这是学习源码整体架构系列第八篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是 ...

  10. 学习 sentry 源码整体架构,打造属于自己的前端异常监控SDK

    前言 这是学习源码整体架构第四篇.整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现.文章学习的是打包整合后的代码,不是实际仓库中的拆分 ...

最新文章

  1. 爱奇艺才被做空又爆裁员,技术研发为裁员重灾区
  2. android应用兼容报告,手机资讯导报:华为发布国内首份Android7.0应用兼容报告
  3. 首批49个国家绿色数据中心名单公布
  4. JavaScript学习笔记(5)
  5. HDU3389(阶梯博弈)
  6. 数模笔记_单变量最优化
  7. 279. 完全平方数 golang
  8. Atitit常见的标准化组织与规范数量jcp ecma iso
  9. ESET NOD32 升级 激活码 用户名和密码~MF111
  10. linux 6.4 multipath.conf跟其他版本的区别,宏杉与其他厂商存储共用multipath的配置方法...
  11. 喜大普奔!ios原生键盘终于支持自然码双拼了!
  12. shader基础学习摘要(一)
  13. [wpa_supplicant]基于ubuntu的wpa_supplicant工具的安装与使用
  14. sublimetext text3比较两个文档的不同
  15. 一致性检验Kappa 与 混淆矩阵
  16. 德兰梅尔-诚邀您参加2022生物发酵展(济南),7月14日与您相约
  17. Swoole vs Workman
  18. 合理利用“泛在式” - 手机促使人群分化
  19. 零基础入门学习Python视频(全42集)
  20. 同步磁阻电机simulink仿真下载

热门文章

  1. MVC进阶学习--HtmlHelper控件解析(五)
  2. CKEditor4x word导入不保存格式的解决方案
  3. 冒泡排序的实现和优化及其与插入,选择排序的比较
  4. django 模型-----模型查询
  5. Go Get设置代理
  6. css 3 制作水波状进度条
  7. 某大型电商云平台实践
  8. linux mint 向“显示(display)”面板添加没有提供的分辨率选项,使虚拟机中的linux mint可以全屏显示...
  9. scvmm管理hyper-v克隆主机(二)
  10. 【hdu - 2568】ACM程序设计期末考试081230