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
- /*
- * 好了, 设备现在已经初始化完成。 但是还没有一个设备被初始化过,
- * 但是 CPU 的子系统已经启动并运行,
- * 且内存和处理器管理系统已经在工作了。
- *
- * 现在我们终于可以开始做一些实际的工作了..
- */
- static void __init do_basic_setup(void)
- {
- cpuset_init_smp();
点击(此处)折叠或打开
- 针对SMP系统,初始化内核control group的cpuset子系统。如果非SMP,此函数为空。
- cpuset是在用户空间中操作cgroup文件系统来执行进程与cpu和进程与内存结点之间的绑定。
- 本函数将cpus_allowed和mems_allwed更新为在线的cpu和在线的内存结点,并为内存热插拨注册了钩子函数,最后创建一个单线程工作队列cpuset。
- usermodehelper_init();
点击(此处)折叠或打开
- 创建一个单线程工作队列khelper。运行的系统中只有一个,主要作用是指定用户空间的程序路径和环境变量, 最终运行指定的user space的程序,属于关键线程,不能关闭。
- init_tmpfs();
点击(此处)折叠或打开
- 初始化内核tmpfs文件系统
- driver_init();
点击(此处)折叠或打开
- 初始化驱动模型中的各子系统,可见的现象是在/sys中出现的目录和文件
- init_irq_proc();
点击(此处)折叠或打开
- 在proc文件系统中创建irq目录,并在其中初始化系统中所有中断对应的目录。
- do_ctors();
点击(此处)折叠或打开
- 调用链接到内核中的所有构造函数,也就是链接进.ctors段中的所有函数。
- 在Linux-2.6.31开始内核启动增加了对构造函数的支持。
- git提交:
点击(此处)折叠或打开
- commit b99b87f70c7785ab1e253c6220f4b0b57ce3a7f7
- Author: Peter Oberparleiter<oberpar@linux.vnet.ibm.com>
- Date: Wed Jun 17 16:28:03 2009 -0700
- kernel: constructor support
内核:构造函数支持- Call constructors (gcc-generated initcall-like functions) during kernel
- start and module load. Constructors are e.g. used for gcov data
- initialization.
- 在内核启动和模块挂载时,调用构造函数(gcc生成的类初始化函数)。构造函数就是
- 比如用于初始化gcov数据的函数
- Disable constructor support for usermode Linux to prevent conflicts with
- host glibc.
- 对于Linux的用户模式禁用构造函数支持,以避免和glibc冲突。
- Signed-off-by: Peter Oberparleiter<oberpar@linux.vnet.ibm.com>
- Acked-by: Rusty Russell<rusty@rustcorp.com.au>
- Acked-by: WANG Cong<xiyou.wangcong@gmail.com>
- Cc: Sam Ravnborg<sam@ravnborg.org>
- Cc: Jeff Dike<jdike@addtoit.com>
- Cc: Andi Kleen<andi@firstfloor.org>
- Cc: Huang Ying<ying.huang@intel.com>
- Cc: Li Wei<w.li@sun.com>
- Cc: Michael Ellerman<michaele@au1.ibm.com>
- Cc: Ingo Molnar<mingo@elte.hu>
- Cc: Heiko Carstens<heicars2@linux.vnet.ibm.com>
- Cc: Martin Schwidefsky<mschwid2@linux.vnet.ibm.com>
- Cc: Al Viro<viro@zeniv.linux.org.uk>
- Signed-off-by: Andrew Morton<akpm@linux-foundation.org>
- Signed-off-by: Linus Torvalds<torvalds@linux-foundation.org>
$ git tag --contains b99b87f7v2.6.31v2.6.31-rc1v2.6.31-rc2v2.6.31-rc3v2.6.31-rc4v2.6.31-rc5v2.6.31-rc6v2.6.31-rc7v2.6.31-rc8v2.6.31-rc9v2.6.32v2.6.32-rc1v2.6.32-rc2v2.6.32-rc3v2.6.32-rc4v2.6.32-rc5v2.6.32-rc6v2.6.32-rc7v2.6.32-rc8
- do_initcalls();
点击(此处)折叠或打开
- 调用所有编译内核的驱动模块中的初始化函数。
- 这里就是驱动程序员需要关心的步骤,其中按照各个内核模块初始化函数所自定义的启动级别(1~7),按顺序调用器初始化函数。
- 对于同一级别的初始化函数,安装编译是链接的顺序调用,也就是和内核Makefile的编写有关。
在编写内核模块的时候需要知道这方面的知识,比如你编写的模块使用的是I2C的API,那你的模块的初始化函数的级别必须低于I2C子系统初始化函数的级别(也就是级别数(1~7)要大于I2C子系统)。如果编写的模块必须和依赖的模块在同一级,那就必须注意内核Makefile的修改了。这方面的知识会在有空的时候总结下,网上也有相关的文章。 - }
- /**
- * driver_init - 初始化驱动模型.
- *
- * 调用驱动模型初始化函数来初始化它们的子系统。
- * 由早期的init/main.c中调用。
- */
- void __init driver_init(void)
- {
- /* 它们为核心部件 */
- devtmpfs_init();
点击(此处)折叠或打开
- 初始化devtmpfs文件系统,驱动核心设备将在这个文件系统中添加它们的设备节点。
- 这个文件系统可以由内核在挂载根文件系统之后自动挂载到/dev下,也可以在文件系统的启动脚本中手动挂载。
- devices_init();
点击(此处)折叠或打开
- 初始化驱动模型中的部分子系统和kobject:
- devices
- dev
- dev/block
- dev/char
- buses_init();
点击(此处)折叠或打开
- 初始化驱动模型中的bus子系统
- classes_init();
点击(此处)折叠或打开
- 初始化驱动模型中的class子系统
- firmware_init();
点击(此处)折叠或打开
- 初始化驱动模型中的firmware子系统
- hypervisor_init();
点击(此处)折叠或打开
- 初始化驱动模型中的hypervisor子系统
- /* 这些也是核心部件, 但是必须
- * 在以上核心中的核心部件之后调用。
- */
- platform_bus_init();
点击(此处)折叠或打开
- 初始化驱动模型中的bus/platform子系统
- system_bus_init();
点击(此处)折叠或打开
- 初始化驱动模型中的devices/system子系统
- cpu_dev_init();
点击(此处)折叠或打开
- 初始化驱动模型中的devices/system/cpu子系统
- memory_dev_init();
点击(此处)折叠或打开
- 初始化驱动模型中的devices/system/memory子系统
- 虽然从代码上看这样,但是我在实际的系统中并没有找到/sys/devices/system/memory这个目录。
- }
Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】的更多相关文章
- 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07
百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...
- Linux内核源码分析 day01——内存寻址
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...
- Linux内核源码分析之setup_arch (四)
前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_ ...
- 鸿蒙内核源码分析(根文件系统) | 先挂到`/`上的文件系统 | 百篇博客分析OpenHarmony源码 | v66.01
百篇博客系列篇.本篇为: v66.xx 鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 百篇博客分析OpenHarmony源码 | v62.01
百篇博客系列篇.本篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 51.c.h.o 本篇开始说文件系统,它是内核五大模块之一,甚至有Linux的设计哲学是" ...
- 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01
百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04
百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...
- 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03
百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...
- 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02
百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...
- 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02
百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...
随机推荐
- 弟三周作业之VS2015
这周有个任务就是安装VS2015,然后进行简单的单元测试. 首先我上吴小勇同学给的MSDN官网(http://www.itellyou.cn/)下载VS2013, 然后装上后,在工具栏里,点击工具里的 ...
- Alpha冲刺第6天
Alpha第六天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...
- java自定义注解学习(一)_demo小练习
自定义注解 现在大家开发过程中,经常会用到注解. 比如@Controller 等等,但是有时候也会碰到自定义注解,在开发中公司的记录日志就用到了自定义注解.身为渣渣猿还是有必要学习下自定义注解的. 这 ...
- 【版本管理】git分支管理
创建与合并分支: 首先,我们创建dev分支,然后切换到dev分支: git checkout -b dev,命令加上-b参数表示创建并切换, 相当于以下两条命令: git branch dev: gi ...
- (NOI2014)(bzoj3669)魔法森林
LCT裸题,不会的可以来这里看看. 步入正题,现将边按a排序,依次加入每一条边,同时维护路径上的最小生成树上的最大边权,如果两点不连通,就直接连通. 如果两点已经连通,就将该边与路径上较小的一条比较, ...
- 【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
[BZOJ2084][Poi2010]Antisymmetry(manarcher) 题面 BZOJ 洛谷 题解 一眼马拉车吧...明显就是在回文串的基础上随便改了改. 似乎还可以魔改回文树,然而我这 ...
- 【转】Git 安装和使用教程
git 提交 全部文件 git add . git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件.注意 -A 选项后面还有一个 ...
- 【bzoj4516】 Sdoi2016—生成魔咒
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 (题目链接) 题意 依次向字符串末尾加上一个字符,每次求不同子串个数. Solution 如果 ...
- C++ ------ const迭代器 和 const_iterator的区别
const迭代器,顾名思义,就是不能改变的迭代器,是常量,其性质是由const决定的.比如说我们这样定义一个const迭代器. vector<,); const vector<int> ...
- node的path.join 和 path.resolve的区别
直接上图: join resolve 明显可以看出,join只会帮你把路径连接起来,而resolve会以当前路径为父路径来把你提供的路径连接起来