原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja

转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html

    在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup。在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工作,详解如下:

  1. /*
  2. * 好了, 设备现在已经初始化完成。 但是还没有一个设备被初始化过,
  3. * 但是 CPU 的子系统已经启动并运行,
  4. * 且内存和处理器管理系统已经在工作了。
  5. *
  6. * 现在我们终于可以开始做一些实际的工作了..
  7. */
  8. static void __init do_basic_setup(void)
  9. {
  10. cpuset_init_smp();

    点击(此处)折叠或打开

    1. 针对SMP系统,初始化内核control group的cpuset子系统。如果非SMP,此函数为空。
    2. cpuset是在用户空间中操作cgroup文件系统来执行进程与cpu和进程与内存结点之间的绑定。
    3. 本函数将cpus_allowed和mems_allwed更新为在线的cpu和在线的内存结点,并为内存热插拨注册了钩子函数,最后创建一个单线程工作队列cpuset。
  11. usermodehelper_init();

    点击(此处)折叠或打开

    1. 创建一个单线程工作队列khelper。运行的系统中只有一个,主要作用是指定用户空间的程序路径和环境变量, 最终运行指定的user space的程序,属于关键线程,不能关闭。
  12. init_tmpfs();

    点击(此处)折叠或打开

    1. 初始化内核tmpfs文件系统
  13.     driver_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的各子系统,可见的现象是在/sys中出现的目录和文件
  14. init_irq_proc();

    点击(此处)折叠或打开

    1. 在proc文件系统中创建irq目录,并在其中初始化系统中所有中断对应的目录。
  15. do_ctors();

    点击(此处)折叠或打开

    1. 调用链接到内核中的所有构造函数,也就是链接进.ctors段中的所有函数。
    2. 在Linux-2.6.31开始内核启动增加了对构造函数的支持。
    3. git提交:

      点击(此处)折叠或打开

      1. commit b99b87f70c7785ab1e253c6220f4b0b57ce3a7f7
      2. Author: Peter Oberparleiter<oberpar@linux.vnet.ibm.com>
      3. Date: Wed Jun 17 16:28:03 2009 -0700
      4. kernel: constructor support
       内核:构造函数支持
      1. Call constructors (gcc-generated initcall-like functions) during kernel
      2. start and module load. Constructors are e.g. used for gcov data
      3. initialization.
      4. 在内核启动和模块挂载时,调用构造函数(gcc生成的类初始化函数)。构造函数就是
      5. 比如用于初始化gcov数据的函数
      6. Disable constructor support for usermode Linux to prevent conflicts with
      7. host glibc.
      8. 对于Linux的用户模式禁用构造函数支持,以避免和glibc冲突。
      9. Signed-off-by: Peter Oberparleiter<oberpar@linux.vnet.ibm.com>
      10. Acked-by: Rusty Russell<rusty@rustcorp.com.au>
      11. Acked-by: WANG Cong<xiyou.wangcong@gmail.com>
      12. Cc: Sam Ravnborg<sam@ravnborg.org>
      13. Cc: Jeff Dike<jdike@addtoit.com>
      14. Cc: Andi Kleen<andi@firstfloor.org>
      15. Cc: Huang Ying<ying.huang@intel.com>
      16. Cc: Li Wei<w.li@sun.com>
      17. Cc: Michael Ellerman<michaele@au1.ibm.com>
      18. Cc: Ingo Molnar<mingo@elte.hu>
      19. Cc: Heiko Carstens<heicars2@linux.vnet.ibm.com>
      20. Cc: Martin Schwidefsky<mschwid2@linux.vnet.ibm.com>
      21. Cc: Al Viro<viro@zeniv.linux.org.uk>
      22. Signed-off-by: Andrew Morton<akpm@linux-foundation.org>
      23. Signed-off-by: Linus Torvalds<torvalds@linux-foundation.org>
      $ git tag --contains b99b87f7
      v2.6.31
      v2.6.31-rc1
      v2.6.31-rc2
      v2.6.31-rc3
      v2.6.31-rc4
      v2.6.31-rc5
      v2.6.31-rc6
      v2.6.31-rc7
      v2.6.31-rc8
      v2.6.31-rc9
      v2.6.32
      v2.6.32-rc1
      v2.6.32-rc2
      v2.6.32-rc3
      v2.6.32-rc4
      v2.6.32-rc5
      v2.6.32-rc6
      v2.6.32-rc7
      v2.6.32-rc8
  16.     do_initcalls();

    点击(此处)折叠或打开

    1. 调用所有编译内核的驱动模块中的初始化函数。
    2. 这里就是驱动程序员需要关心的步骤,其中按照各个内核模块初始化函数所自定义的启动级别(1~7),按顺序调用器初始化函数。
    3. 对于同一级别的初始化函数,安装编译是链接的顺序调用,也就是和内核Makefile的编写有关。
      在编写内核模块的时候需要知道这方面的知识,比如你编写的模块使用的是I2C的API,那你的模块的初始化函数的级别必须低于I2C子系统初始化函数的级别(也就是级别数(1~7)要大于I2C子系统)。如果编写的模块必须和依赖的模块在同一级,那就必须注意内核Makefile的修改了。
      这方面的知识会在有空的时候总结下,网上也有相关的文章。
     
  17. }
上面的函数调用了driver_init函数,作用是驱动模型子系统的初始化,对于内核驱动工程师来说比较重要,详解如下:
drivers/base/init.c:

  1. /**
  2. * driver_init - 初始化驱动模型.
  3. *
  4. * 调用驱动模型初始化函数来初始化它们的子系统。
  5. * 由早期的init/main.c中调用。
  6. */
  7. void __init driver_init(void)
  8. {
  9. /* 它们为核心部件 */
  10. devtmpfs_init();

    点击(此处)折叠或打开

    1. 初始化devtmpfs文件系统,驱动核心设备将在这个文件系统中添加它们的设备节点。
    2. 这个文件系统可以由内核在挂载根文件系统之后自动挂载到/dev下,也可以在文件系统的启动脚本中手动挂载。
  11. devices_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的部分子系统和kobject:
    2. devices
    3. dev
    4. dev/block
    5. dev/char
  12. buses_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的bus子系统
  13. classes_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的class子系统
  14. firmware_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的firmware子系统
  15. hypervisor_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的hypervisor子系统
  16. /* 这些也是核心部件, 但是必须
  17. * 在以上核心中的核心部件之后调用。
  18. */
  19. platform_bus_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的bus/platform子系统
  20. system_bus_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的devices/system子系统
  21. cpu_dev_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的devices/system/cpu子系统
  22. memory_dev_init();

    点击(此处)折叠或打开

    1. 初始化驱动模型中的devices/system/memory子系统
    2. 虽然从代码上看这样,但是我在实际的系统中并没有找到/sys/devices/system/memory这个目录
  23. }

Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】的更多相关文章

  1. 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07

    百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...

  2. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  3. Linux内核源码分析之setup_arch (四)

    前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_ ...

  4. 鸿蒙内核源码分析(根文件系统) | 先挂到`/`上的文件系统 | 百篇博客分析OpenHarmony源码 | v66.01

    百篇博客系列篇.本篇为: v66.xx 鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  5. 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 百篇博客分析OpenHarmony源码 | v62.01

    百篇博客系列篇.本篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 51.c.h.o 本篇开始说文件系统,它是内核五大模块之一,甚至有Linux的设计哲学是" ...

  6. 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01

    百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  7. 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04

    百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...

  8. 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03

    百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  9. 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02

    百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  10. 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02

    百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...

随机推荐

  1. [Week17] 个人阅读作业

      个人阅读作业Week17 reading buaa software   解决的问题 这是提出问题的博客链接:http://www.cnblogs.com/SivilTaram/p/4830893 ...

  2. vs2013c#测试using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1_CXY { class Program { stati

    首先安装Unit Test Generator.方法为:工具->扩展和更新->联机->搜索“图标为装有蓝色液体的小试管.Unit Test Generator”, 编写代码,生成一个 ...

  3. appearance格式化表单元素的边框,在chrome和FF下鼠标点击时会多出一个蓝色边框

    可在元素上添加样式 -webkit-appearance: none; -moz-appearance:none;outline:none; 清除掉元素所有的外貌,以便自定义风格

  4. Solr查询语法

    基于solr版本:6.0.0 当配置好本地的环境之后,就访问http://localhost:8080/solr/index.html.或者是访问已经放在服务器上的solr环境,例如http://10 ...

  5. 6 vue-cli mock数据

    https://www.cnblogs.com/dengxiaolei/p/7338773.html //--------------------------------------const por ...

  6. 实现AJAX的基本步骤

    实现AJAX的基本步骤 要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤: (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象. (2)创建一个新的HTTP请求,并指 ...

  7. ZOJ1100 Mondriaan's Dream

    题目链接:QAQ 大致题意:有一个m行n列的矩阵,用1*2的骨牌(可横放或竖放)完全覆盖,骨牌不能重叠,有多少种不同的覆盖的方法? Solution: \(n,m\le11\),肯定是不能暴力的,又类 ...

  8. windows版本SourceTree免登陆初始设置

    xi 新版本的sourceTree安装之后需要使用账户登陆授权以后才可以使用,之前的旧版本可以不能登录直接使用. sourceTree免登陆跳过初始设置方法 1.安装完sourceTree以后先运行一 ...

  9. PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象

    PHP常用缓存方式:第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件.在需要缓存数据的时候,通过include方式引入,并使用.第二种,把需要的数据通过serialize函数序列化后直接 ...

  10. OpenStack 认证服务 KeyStone 服务注册(五)

    创建服务实体和API端点 创建服务 openstack service create --name keystone --description "OpenStack Identity&qu ...