最后分析最终调用用户空间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. Spark MLlib框架详解

    1. 概述 1.1 功能 MLlib是Spark的机器学习(machine learing)库,其目标是使得机器学习的使用更加方便和简单,其具有如下功能: ML算法:常用的学习算法,包括分类.回归.聚 ...

  2. vue-router原理分析

    本文整理总结自: https://zhuanlan.zhihu.com/p/27588422 单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面, 实现这一点主要是两种方式: 1.Hash: ...

  3. 第二篇 dom内容操作之value

    一.内容操作的三种方式 . 详情看第一篇 innerText innerHtml . value ==>表单类的标签 input >text passwd textarea . check ...

  4. Group By 和 Having, Where ,Order by执行顺序

    1.Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by. 首先where将最原始 ...

  5. linux挂载/卸载优盘

    linux载入优盘 查看优盘 ls /dev/ sdb1 挂载到/mnt/usb目录 mount /dev/sdb1 /mnt/usb ntfs优盘需要安装ntfs-3g mount -t ntfs- ...

  6. Java -- 表达式类型的自动提升

    1. 提升规则: a. 所有byte型,short型和char型将被提升到int型. b. 整个算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型. 例1: short val = 5; ...

  7. JS正则表达式,记录自己所学所用的内容

    还没接触正则表达式感觉确实有那么点难度,但接触到后自己琢磨了几天也没发现那么难. 现在教教刚学的或者还没接触正则表达式的同学们入入门,一起学习. 正则表达式基本语法 ***************** ...

  8. ajax经典案例--省市联动

    ajax的省市联动案例 如果我们的代码比较复杂,可以通过file_put_contents来输出信息到某个日志. 在一个元素中添加另一个元素使用的方法是:appendChild(). 函数append ...

  9. 查询速度优化用not EXISTS 代替 not in

    1,not in 速度奇慢,要用 not EXISTS ,速度奇快! 大表效果尤其明显 sql中exists,not exists的用法 exists()后面的子查询被称做相关子查询,他是不返回列表的 ...

  10. 双系统重装win7和ubuntu修复win7引导方法介绍(来源百度经验)

    很多朋友喜欢为电脑安装win7和ubuntu双系统,当我们重装双系统时,可能会出现win7引导不见的情况,接下来就告诉大家双系统重装win7和ubuntu修复win7引导的方法. 1.win7和ubu ...