zoukankan      html  css  js  c++  java
  • 2.16.11.init进程详解2

    2.16.11.1、打开控制台
    (1)linux系统中每个进程都有自己的一个文件描述符表,表中存储的是本进程打开的文件。
    (2)linux系统中有一个设计理念:一切届是文件。所以设备也是以文件的方式来访问的。我们要访问一个设备,就要去打开这个设备对应的文件描述符。譬如/dev/fb0这个设备文件就代表LCD显示器设备,/dev/buzzer代表蜂鸣器设备,/dev/console代表控制台设备。
    (3)这里我们打开了/dev/console文件,并且复制了2次文件描述符,一共得到了3个文件描述符。这三个文件描述符分别是0、1、2.这三个文件描述符就是所谓的:标准输入、标准输出、标准错误。
    (4)进程1打开了三个标准输出输出错误文件,因此后续的进程1衍生出来的所有的进程默认都具有这3个三件描述符。

    2.16.11.2、挂载根文件系统
    (1)prepare_namespace函数中挂载根文件系统
    (2)根文件系统在哪里?根文件系统的文件系统类型是什么? uboot通过传参来告诉内核这些信息。
    uboot传参中的root=/dev/mmcblk0p2 rw 这一句就是告诉内核根文件系统在哪里
    uboot传参中的rootfstype=ext3这一句就是告诉内核rootfs的类型。
    (3)如果内核挂载根文件系统成功,则会打印出:VFS: Mounted root (ext3 filesystem) on device 179:2.
    如果挂载根文件系统失败,则会打印:No filesystem could mount root, tried: yaffs2
    (4)如果内核启动时挂载rootfs失败,则后面肯定没法执行了,肯定会死。内核中设置了启动失败休息5s自动重启的机制,因此这里会自动重启,所以有时候大家会看到反复重启的情况。
    (5)如果挂载rootfs失败,可能的原因有:
    最常见的错误就是uboot的bootargs设置不对。
    rootfs烧录失败(fastboot烧录不容易出错,以前是手工烧录很容易出错)
    rootfs本身制作失败的。(尤其是自己做的rootfs,或者别人给的第一次用)

    2.16.11.3、执行用户态下的进程1程序
    (1)上面一旦挂载rootfs成功,则进入rootfs中寻找应用程序的init程序,这个程序就是用户空间的进程1.找到后用run_init_process去执行他
    (2)我们如果确定init程序是谁?方法是:
    先从uboot传参cmdline中看有没有指定,如果有指定先执行cmdline中指定的程序。cmdline中的init=/linuxrc这个就是指定rootfs中哪个程序是init程序。这里的指定方式就表示我们rootfs的根目录下面有个名字叫linuxrc的程序,这个程序就是init程序。
    如果uboot传参cmdline中没有init=xx或者cmdline中指定的这个xx执行失败,还有备用方案。第一备用:/sbin/init,第二备用:/etc/init,第三备用:/bin/init,第四备用:/bin/sh。
    如果以上都不成功,则认命了,死了。

  • 相关阅读:
    邻居子系统 之 更新neigh_update
    邻居子系统 之 邻居项查找neigh_lookup、___neigh_lookup_noref
    遍历集合的方法总结
    Java集合中List,Set以及Map等集合体系
    八大数据结构分类
    servlet和jsp的区别
    Web前端和Web后端的区分
    (转)为什么JavaWeb放弃jsp,去做前后端分离
    面向对象的三大基本特征和五大基本原则
    (转)2019年给Java编程初学者的建议(附学习大纲)
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9236227.html
Copyright © 2011-2022 走看看