官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1793|回复: 1

构建根文件系统之init的启动过程

[复制链接]

7

主题

16

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2012-3-25 15:50:00 | 显示全部楼层 |阅读模式
        首先,重申下linux系统各部分的功能和目的。Uboot的目的是启动内核,内核的目的是启动文件系统,最终是启动应用程序。如果能够把这些步骤掌握了,那么就可以从无到有搭建linux系统。
一.Init进程介绍及用户程序启动过程
        内核的目的是启动应用程序,但是应用程序有那么多,但是是启动哪个第一个应用程序呢?那么就要定位到内核启动的最后一步,启动init进程,代码位于init/main.c
        813         if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
        814          printk(KERN_WARNING "Warning: unable to open an initial console.\n");
        815
        816         (void) sys_dup(0);
        817         (void) sys_dup(0);
        818
        819         current->signal->flags |= SIGNAL_UNKILLABLE;
        820
        821         if (ramdisk_execute_command) {
        822                 run_init_process(ramdisk_execute_command);
        823                 printk(KERN_WARNING "Failed to execute %s\n",
    824                                                                                        ramdisk_execute_command);
        825         }
        826
        827         /*
        828          * We try each of these until one succeeds.
        829          *
        830          * The Bourne shell can be used instead of init if we are
        831          * trying to recover a really broken machine.
        832          */
        833         if (execute_command) {
        834                 run_init_process(execute_command);
        835                 printk(KERN_WARNING "Failed to execute %s.  Attempting "
        836                                         "defaults...\n", execute_command);
        837         }
        838         run_init_process("/sbin/init");
        839         run_init_process("/etc/init");
        840         run_init_process("/bin/init");
        841         run_init_process("/bin/sh");
        842
        843         panic("No init found.  Try passing init= option to kernel.");
        844 }
        从上面代码我们可以知道内核启动init进程如下:
        打开标准输入,标准输出,标准错误输出
        756行尝试打开/dev/console设备文件,如果打开成功它就是启动标准输入设备。sys_dup(0);的意识是复制文件描述符0,这里两句的意思是复制文件描述符0给文件描述符1,2,也就是说这里标准输入,标准输出,标准错误输出都指向了同一个设备。这也是我们可以在终端上输入命令(标准输入),执行命令后的回传信息,包括正确信息,错误信息都在终端显示(标准输出,标准错误输出)。
        如果打开失败,将会打印Warning: unable to open an initial console。出现这个原因大部分是因为:跟文件系统虽然被正确挂接了,但是里面的内容不正确,要么没有/dev/console这个文件,要么就是它没有对应的设备。如果是开发板的话,这个设备就是串口,所以我们在uboot时,可以看到环境变量console=ttySAC0.但是,并不是一定是这两个问题,还有可能是生成image格式问题,其中有一点很重要,就是mkyaffs2image生成的image 文件的OOB区数据格式要与linux kernel对nand flash进行读取时的数据格式保持一致,如果不一致也会这个出现问题。我做的时候就是因为这个原因,详情见后面移植过程中的问题和解决办法。
2.如果ramdisk_execute_command指定了运行程序,则启动它。ramdisk_execute_command
  是什么呢?搜索内核源代码可以找到__setup("init",init_setup),这是在命令行参数设置的参
  数,在uboot命令参数中我设定了init=linuxrc,因此执行的一个程序是linuxrc。

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-28869.png

假如没有定义init=linuxrc,那么会依次尝试执行/sbin/init,/etc/init, /bin/init,/bin/sh。其中/sbin/init,确实是我们的根文件系统中是存在的,所以init进程所用的进程就是/sbin/init。这时就会把控制权交给/sbin/init,不再返回。但是,如果执行失败,将会打印No init found.  Try passing init= option to kernel.这个问题我也遇到了,真是什么好事都要碰到!!!详情见后面移植过程中的问题和解决办法
回复

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2012-4-6 07:55:00 | 显示全部楼层
非常不错!
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-12-18 19:45 , Processed in 0.225484 second(s), 19 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表