最后分析最终调用用户空间init进程的函数init_post().

static noinline int init_post(void)这是一个非_init函数。强制让它为非内联函数,以防gcc让它内联到init()中成为init.text段的一部分。

async_synchronize_full();

free_initmem();

这两行用于释放所有init.*段所占用内存。

unlock_kernel();

释放大内核锁,使该线程可以在其他处理器上运行。

mark_rodata_ro();

通过修改页表,保证只读数据段为只读属性。对ARM架构而言是空操作。

system_state=SYSTEM_RUNNING;

设置系统状态为运行状态。

numa_default_policy();

设定NUMA系统的内存访问策略为默认。对于2440/6410,是空操作。

if(sys_open((const char __user *) “/dev/console”,O_RDWR,0)<0)

  printk(KERN_WARNING "Warning;unable to open an initial console.\n");

这是kernel_init打开的第一个文件,也是该进程的标准输入。这里需要打开"/dev/console",如果没有这个节点,系统就出错。可能的原因是:

1)制作文件系统时,忘记 创建/dev/console节点。

2)文件系统挂载问题,挂载上的文件系统不是什么都没有,就是挂载错了节点。

(void) sys_dup(0);

(void) sys_dup(0);

复制两次标准输入(0)的文件描述符(它是上面打开的"/dev/console",即系统控制台):

一个作为标准输出(1),另一个作为标准出错(2)。现在标准输入、标准输出、标准出错都是"/dev/console"了。

该console在内核启动参数中可以配置为某个串口(ttySACn、ttySn等等),也可以是虚拟控制台(tty0)。因此在串口或者显示器上看到之后的系统登录提示。

current->signal->flags |=SIGNAL_UNKILLABLE;

设置当前进程(init)为不可以杀进程(忽略致命的信号)

if(ramdisk_execute_command)

{

  run_init_process(ramdisk_execute_command);

  printk(KERN_WARNING "Failed to execute %s\n",ramdisk_execute_command);

如果指定了ramdisk_execute_command,则执行它表示的内存磁盘的用户空间init进程。

if(execute_command)

{

  run_init_process(execute_command);

  printk(KERN_WARNING "Failed to execute %s. attempting" "default...\n",execute_command);

}

execute_command在init_setup()函数中被初始化,而后者会将命令行参数中"init="的参数值赋值给execute_command,因此,如果在命令行参数中设置了"init"参数,则执行该参数指定用户空间init进程。

run_init_process("/sbin/init");

run_init_process("/etc/init");

run_init_process("/bin/init");

run_init_process("/bin/sh");

panic("No init found.Try passing init=option to kernel.");

最后代码表示:在检查完ramdisk_execute_command和execute_command为空的情况下,顺序执行上述初始化程序,如果没有找到,就打印错误信息,并挂起内核。出现这个内核挂起错误的原因:

1)启动参数配置有问题,通过命令行参数指定的init程序系统没有找到,且默认的那4个程序也不在文件系统里。

2)文件系统挂载有问题,文件不存在。

3)init程序没有执行权限。

至此,内核的初始化结束,系统正式进入用户空间的init进程。

内核启动流程2-C语言部分的最后一个函数init_post()的更多相关文章

  1. Linux内核启动流程分析(一)【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...

  2. Tiny4412 Linux 内核启动流程

    Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...

  3. linux 内核启动流程分析,移植

    分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...

  4. linux 内核启动流程

    Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...

  5. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  6. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  7. Linux内核启动流程(简介)

    1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...

  8. Linux内核启动流程与模块机制

    本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...

  9. Linux内核启动流程分析(二)【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3380544.html S3C2410 Linux 2.6.35.7启动分析(第二阶段) 接着上面的分析,第 ...

随机推荐

  1. zabbix实现mysql数据库的监控(二)

    上章我们把zabbix的服务端和客户端都部署完成了,本章接着进行两部分的设置: 1  添加对mysql数据库主机的监控 2  添加对mysql数据库的监控 一.对数据库服务器主机监控 1 创建主机 步 ...

  2. 第十二、模块二、调用中国天气网和qqOnline及TrainTimeWebService接口来突出Json方法

    一. 浏览网页的时候,发送的请求.服务器反回来的永远是字符串,由于服务器后台使用的语言不通,所以就需要用工具反解,这里用到了json json方法一 json.loads()将字符串转化为python ...

  3. debian下配置dynamic printk以及重新编译内核

    在以前的一篇博文<编译debian内核>已经提过了重新编译内核的方法,但是整个过程花费时间较长,并且生成deb包. 这里我采用稍微简单一些的方法,因为我并没有对内核或者驱动代码做任何修改, ...

  4. 51nod 1525 && CF566D

    题意:给定n个元素,现在有2种合并操作和1种询问操作 1.单独合并两个元素所在的集合 2.合并一个区间内的元素所在的集合 询问:两个元素是否属于统一集合 神犇题解 感觉又涨了新姿势啊..我们最恼火的是 ...

  5. SpringCloud-服务的消费者(rest+ribbon)

    SpringCloud-服务的消费者(rest+ribbon) 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring Cloud有两种服务调用 ...

  6. 恢复delete删除的数据

    SELECT * FROM tablename AS OF TIMESTAMP TO_TIMESTAMP('2010-12-15 11:10:17', 'YYYY-MM-DD HH:MI:SS')

  7. NserviceBus过期处理

    NserviceBus不过期,修改注册表 HKEY_CURRENT_USER\Software\NServiceBus\3.3下的项TrailDate到2099-08-02

  8. C++内存使用机制基本概念详解

    .程序使用内存区 一个程序占用的内存区一般分为5种: ()全局.静态数据区:存储全局变量及静态变量(包括全局静态变量和局部静态变量) ()常量数据区:存储程序中的常量字符串等. ()代码区:存储程序的 ...

  9. ACM学习历程—POJ 3764 The xor-longest Path(xor && 字典树 && 贪心)

    题目链接:http://poj.org/problem?id=3764 题目大意是在树上求一条路径,使得xor和最大. 由于是在树上,所以两个结点之间应有唯一路径. 而xor(u, v) = xor( ...

  10. bzoj 4817: [Sdoi2017]树点涂色 LCT+树链剖分+线段树

    题目: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob可能会进 ...