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

Linux学习之源码2:start_kernel流程

时间: 2024-10-03 07:00:13

Linux学习之源码2:start_kernel流程的相关文章

Linux学习之源码1:入口流程

有地方看到,启动流程是arch/arm/boot/compressed/head.s ----->调用arch/arm/boot/compressed/misc.c的decompress_kernel()函数解压内核.---->arch/arm/kernel/head-common.S初始化 ---->init/main.c的asmlinkage void __init start_kernel(void) 注意在arch/arm/kernel/smp.c文件中有一个启动多核处理器的函数

Linux学习之源码包安装与脚本安装(十八)

Linux学习之源码包安装与脚本安装 目录 源码包与RPM包的区别 源码包安装 脚本安装 源码包与RPM包的区别 1.区别 安装之前的区别:概念上的区别 安装之后的区别:安装位置不同 源码包: 开源的 安装更慢,更容易报错 安装更自由 安装完后效率更高 RPM包: 经过编译,能看到源代码 安装更快,报错容易解决 2.RPM包安装位置与源码包安装位置 RPM包安装位置: 源码包安装位置: 安装在指定位置当中,一般是/usr/local/软件名/  3.安装位置不同带来的影响 RPM包安装的服务可以

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

[本文为笔者在学习Linux 下的软件安装时,尝试使用源码安装Apache 的过程,事后进行一个小小的总结,发现错误望指正.] 一.典型的源码编译安装软件的过程包括以下3步: 1) 运行 configure 命令,并结合必要的参数以生成Makefile :(读者可以自行百度Makefile 相关知识) 2) 运行 make 命令生成各类模块和主程序: 3) 运行 make install 命令将必要的文件复制到安装目录中. (以上过程都在对应软件安装包的根目录中进行) 二.安装过程 Linux

linux学习笔记——源码编译安装Mysql

#######Redhat6.5源码编译安装Mysql########实验环境:1.IP:172.25.8.32.磁盘要大于20G先添加一块大于20G的磁盘fdisk /dev/vdb        ##得到/dev/vdb1 8e linuxpvcreate /dev/vdb1    ##把物理分区做成物理卷vgextend vg_server1 /dev/vdb1    ##把新建立的/dev/vdb1添加到vg_server1中lvextend -L 20G /dev/vg_server1

Linux编译安装源码包的流程

本文参考:http://www.linuxfromscratch.org/lfs/view/7.10-rc1/chapter05/generalinstructions.html 流程: 1.  下载并解压源码包2.  运行:configure3.  编译:make4.  安装:make install 编译时需要注意一个原则:不要在解压的包中直接执行./configure.make.make install等命令,需要在源码目录下另外新建一个目录,在新建的目录中执行以上命令. 例子:这里以源码

linux学习笔记——源码编译安装PHP

#######Redhat6.5源码编译安装php########实验环境:IP:172.25.8.3(已经安装了nginx.mysql服务并能正常使用) 实验内容:1.安装包php-5.6.20.tar.bz2re2c-0.13.5-1.el6.x86_64.rpm   ##PHP的词法解释器re2clibmcrypt-2.5.8-9.el6.x86_64.rpm   ##提供mcrypt,mcrypt是php中重要的加密支持扩展库libmcrypt-devel-2.5.8-9.el6.x86

数据库学习之--Linux下Mysql源码包安装

数据库学习之--Linux下Mysql源码包安装 系统环境: 操作系统:RedHat EL6 DB Soft:  Mysql 5.6.4-m7     Mysql 在linux下的安装方式有两种版本,一种为Binary(二进制),另外一种为Source(源码包),本文为Source Install方式. 1.安装前的准备 解压安装包 [[email protected] ~]$ ls mysql-5.6.4-m7  mysql-5.6.4-m7.tar.gz  mysql-5.6.4-m7.ta

linux卸载一个源码包安装的软件的流程

完全卸载memcached的方法(CentOS) 我的大内存vps(centos系统)曾经安装过memcached,想给论坛提速,实际上不但没有明显效果,反倒耗费内存,看着碍眼,于是想卸载,于是网上各种搜索+自己实践,搞出一个傻瓜方案来: 1.结束memcached进程# killall memcached 2.删除memcached目录及文件# rm -rf /usr/local/memcached# rm -f /etc/rc.d/init.d/memcached 3.关闭memcached

在 Linux 系统上源码安装 GTK+ 2.0

在 Linux 系统上源码安装 GTK+ 2.0==================================================Keywords: GTK+, Install, Linux, SourceAuthor:       whyglinux (whyglinux AT hotmail DOT com)Date:          2007-01-07==================================================目录0. 前言1.