Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

简介:

原文地址: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. }











本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4847416.html,如需转载请自行联系原作者

相关文章
|
7天前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
7天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
8天前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
8天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
10天前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
27 3
|
13天前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
29 6
|
12天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
24天前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
57 8
|
24天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
153 6
|
25天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
67 3