主题 : 【补充】关于内核是如何启动第一个应用程序的 复制链接 | 浏览器收藏 | 打印
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
贡献值: 5 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
楼主  发表于: 2011-11-08 08:26

 【补充】关于内核是如何启动第一个应用程序的

上一篇帖子说到busybox中的init程序是内核启动后运行的第一个应用程序,现在补充解释一下为什么.

首先由内核启动的流程可知,最后是调用了在linux2.6.32/init/main.c中的init_post()函数,我们分析这个函数(下面的1.2.3.。。。按在代码中出现的次序来依次分析):

1. 打开一个设备,作为标准输入:
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");

2.复制两次标准输入(0),一个作为标准输入(1),一个作为标准出错(2)    
(void) sys_dup(0);
(void) sys_dup(0);
也就是说输入信息输出信息出错信息都是从/dev/console输出
对于我来说/dev/console是串口0。

3.如果是ramdisk启动,且指定了initrd=xxx,则执行进入下面的if
    if (ramdisk_execute_command)
{
        run_init_process(ramdisk_execute_command);
        printk(KERN_WARNING "Failed to execute %s\n",
                ramdisk_execute_command);
    }
4.是否执行uboot中bootargs指定的init=xxx
if (execute_command)
{
        run_init_process(execute_command);
        printk(KERN_WARNING "Failed to execute %s.  Attempting "
"defaults...\n", execute_command);

    }
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.");
如果bootargs传入的参数中有init=xxx的话则进入if语句;如果没定义则,执行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.");
注意run_init_process如果执行应用程序成功的话就不会再返回了!
到此为止init_post()就结束了!这就是内核启动第一个应用程序的流程,就这么简单。
好好学习,天天鲁管
级别: 侠客
UID: 47357
精华: 0
发帖: 76
金钱: 390 两
威望: 78 点
贡献值: 0 点
综合积分: 152 分
注册时间: 2011-05-21
最后登录: 2017-09-13
1楼  发表于: 2011-11-09 19:28
谢谢分享
级别: 新手上路
UID: 54082
精华: 0
发帖: 17
金钱: 95 两
威望: 19 点
贡献值: 0 点
综合积分: 34 分
注册时间: 2011-08-23
最后登录: 2012-03-12
2楼  发表于: 2011-12-14 23:27
楼主辛苦了,学习下!
级别: 新手上路
UID: 38526
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2011-02-26
最后登录: 2014-10-05
3楼  发表于: 2012-08-09 21:07

 回 楼主(wuweidong) 的帖子

在内核是如何启动第一个应用程序那块儿,
传入的参数中有init=XXX的话,execute_command怎么就等于这个XXX  ...,这是怎么实现的呀?