内核启动流程2-C语言部分的最后一个函数init_post()
最后分析最终调用用户空间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()的更多相关文章
- Linux内核启动流程分析(一)【转】
转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- linux 内核启动流程分析,移植
分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...
- linux 内核启动流程
Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- Linux内核启动流程(简介)
1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...
- Linux内核启动流程与模块机制
本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...
- Linux内核启动流程分析(二)【转】
转自:http://blog.chinaunix.net/uid-25909619-id-3380544.html S3C2410 Linux 2.6.35.7启动分析(第二阶段) 接着上面的分析,第 ...
随机推荐
- mysql高可用研究(一) 主从+MHA架构
最近在研究mysql的高可用架构,自己想总结下常用的高可用方案都有哪些.有哪些优缺点以及应用的场景?搞得是头昏脑涨,天昏地暗,看了诸多资料,每次都觉得公说公有理婆说婆有理.其实嘛,大家说的都有一定的道 ...
- Python 变量(赋值,数据类型,数据类型转换)
一.python 变量赋值方式有三种: 1.直接赋值:age = 28 2.多个变量赋值 age, sex = 28, 1 #每个变量都必须要有个对应的值 3.特殊形式的赋值(链式赋值) a = ...
- Vim 命令记录与回放
步骤如下: q+(a..z)寄存器名: 执行你要执行的操作: q 结束操作: 调用为@+寄存器: 列子如下: 在写PHP 程序时用的比较多的是创建函数: 如 function add_in(){ } ...
- Hadoop集群初始化启动
hadoop集群初始化启动 启动zookeeper ./zkServer.sh start 启动journalnode ./hadoop-daemon.sh start journalnode 格式化 ...
- 红米note.线刷
1.第一代 红米note 时间:20180121 这次 线刷之后,摄像头还是模糊,扫描小一点的二维码的时候 还是一片模模糊糊... 2.ZC:我下载的“通用刷机工具”名为:MiFlash2017-12 ...
- Linux虚拟机桥接网络
1.虚拟机网络设置为“桥接” 2.查看本机IP.Gateway.DNS 3.vi /etc/sysconfig/network-scripts/ifcfg-eth0,ONBOOT=“NO”改为“YES ...
- C++ 值传递、址传递、引用传递
一.值传递 int func(int p) 值传递会在栈中开辟一块空间 p,使得p和实参的a 同值. 此时你在函数func里面对p进行任何操作都不会对原值a产生任何影响.因为a 和p本就就是两个变 ...
- 10 - Django应用第七步
1 自定义管理表单 通过在admin.py注册之后可以在后台中管理相应注册的表 但是我们还学要更多的自定义操作 polls/admin.py from django.contrib import ad ...
- 【整理】如何选取后缀数组&&后缀自动机
后缀家族已知成员 后缀树 后缀数组 后缀自动机 后缀仙人掌 后缀预言 后缀Splay ? 后缀树是后缀数 ...
- ACM学习历程—HDU 5536 Chip Factory(xor && 字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题目大意是给了一个序列,求(si+sj)^sk的最大值. 首先n有1000,暴力理论上是不行的. ...