以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。

一、init进程详解1

1、init进程完成了从内核态向用户态的转变

(1)一个进程先后两种状态

  • init进程刚开始运行的时候是内核态,它属于一个内核线程,然后运行一个用户态下面的程序后,把自己强行转成了用户态(后面的进程需要工作在用户态下)。
  • 因为init进程自身完成了从内核态到用户态的过渡,因此后续的其他进程都可以工作在用户态。

(2)init进程在内核态下的工作内容

  • 主要是挂载根文件系统,并试图找到用户态下的那个init程序。
  • init进程要把自己转成用户态就必须运行一个用户态的应用程序(这个应用程序名字一般也叫init),要运行这个应用程序就必须得找到这个应用程序,要找到这个应用程序就必须得挂载根文件系统,因为所有的应用程序都在文件系统中。
  • 内核源代码中的所有函数都处于内核态,执行其中任何一个都不能脱离内核态。应用程序必须不属于内核源代码,这样才能保证应用程序处于用户态。这里执行的init程序和内核不在一起,由根文件系统另外提供。

(3)init进程在用户态下的工作内容

  • init进程大部分有意义的工作都是在用户态下进行的。
  • init进程对操作系统的意义在于:其他所有的用户进程都直接或者间接派生自init进程

(4)init进程如何从内核态跳跃到用户态?还能回来不?

  • init进程处于内核态时,通过函数kernel_execve来执行一个用户空间编译连接的应用程序就跳跃到用户态了。
  • 跳跃过程中进程号没有改变,一直是进程1。
  • 跳跃过程是单向的,一旦执行init程序转到用户态,整个操作系统就算真正运转起来了,以后只能在用户态下工作,用户态下想要进入内核态只能通过调用API。

2、init进程构建了用户交互界面

(1)init进程是其他用户进程的老祖宗。

  • linux系统中一个进程的创建是通过其父进程创建出来的。根据这个理论只要有一个父进程就能生出一堆子孙进程了。

(2)init启动了login进程(用户登录进程)、命令行进程(提供命令行环境)、shell进程(提供命令解释和执行)

(3)shell进程启动了其他用户进程

  • 命令行和shell一旦工作,用户就可以在命令行下通过./xx的方式来执行其他应用程序,每一个应用程序的运行就是一个进程。

二、init进程详解2

1、打开控制台

(1)linux系统中每个进程都有自己的一个文件描述符表,表中存储的是本进程打开的文件。

(2)linux系统中一切皆是文件,因此设备也是以文件的方式来访问的。

  • 要访问一个设备,就要打开此设备对应的文件描述符。譬如/dev/fb0这个设备文件就代表LCD显示器设备,/dev/buzzer代表蜂鸣器设备,/dev/console代表控制台设备。

(3)这里打开了/dev/console文件,并且复制了2次文件描述符,一共得到了3个文件描述符。

  • 这三个文件描述符分别是0、1、2,就是所谓的标准输入、标准输出、标准错误这3个文件描述符。

(4)进程1打开了这3个文件描述符,因此进程1衍生出来的所有的进程默认都具有这3个文件描述符。

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本身制作失败的。

3、执行用户态下的进程1程序

(1)一旦挂载rootfs成功,则进入rootfs中寻找应用程序的init程序(在init_post()函数中),找到后用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。如果以上都不成功,则没有办法了。

init进程(即进程1,或者说linuxrc)的详解相关推荐

  1. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  2. python创建进程的方法_python进程的状态、创建及使用方法详解

    本文实例讲述了python进程的状态.创建及使用方法.分享给大家供大家参考,具体如下: 进程以及状态 1. 进程 程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资 ...

  3. linux进程文件描述符 vnode,Linux C编程详解:进程原理分析、文件描述符和文件记录表、文件句柄和文件原理...

    一.引言 文件操作是Linux C编程中其中的一项核心技术,实际上也相当重要,这里并不是说狭义上的那种文件操作,它也非常有助于理解和学习Linux系统.为什么这样说呢?因为在Unix/Linux的世界 ...

  4. 系统服务管理与控制程序(Init System/初始化系统)-- Systemd 的 Unit 配置文件详解

    文章目录 一.Service 的配置文件 (一)[Unit] 区块 (二)[Service] 区块 1.启动命令 2.启动类型 3.重启行为 (三)[Install] 区块 二.Target 的配置文 ...

  5. apache 工作模式prefork进程模式和worker线程模式参式详解和推荐设置

    一apache工作模式: 1.prefork进程模式: prefork模式参数说明: prefork模式推荐设置: 二.apache worker模式: 1. 参数 三.prefork和worker模 ...

  6. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

    一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...

  7. php fpm子进程数配置,php-fpm进程管理方式以及子进程数量配置原则详解

    php-fpm的进程管理方式pm是一个重要的参数,主要来控制子进程的数量. pm进程管理方式有三种: static: 表示在php-fpm运行时直接fork出 pm.max_chindren个子进程 ...

  8. Conhost.exe是什么进程?为什么会启动运行?图文详解

    为什么80%的码农都做不了架构师?>>>    如果你使用的是微软的Vista或者Win7系统,当你打开命令行cmd.exe的窗口后,你会在Windows任务管理器中发现有一个Con ...

  9. Linux进程top命令作用是,linux top命令详解

    top 命令主要用于查看进程的相关信息,同时它也会提供系统平均负载,cpu 信息和内存信息.下面的截图展示了 top 命令默认提供的信息: 系统平均负载 top 命令输出中的第一行是系统的平均负载,这 ...

  10. Android - 跨进程通信(IPC) 另一种便捷实现 详解

    文章目录 1. 写在前面 2. 跨进程通信的实现 3. 扩展思考 4. 参考资料 1. 写在前面 看到此图有何感想,这是另一种便捷的实现方式,我们先来看看其它的几种方式. Android 进程间通信 ...

最新文章

  1. ios中利用NSDateComponents、NSDate、NSCalendar判断当前时间是否在一天的某个时间段内。...
  2. oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志
  3. matlab有限元分析与应用_专栏 | UEL用户子程序开发步骤—有限元理论基础及Abaqus内部实现方式研究系列20...
  4. java io字符流_Java IO流字符流简介及基本使用
  5. SpringCloud学习笔记008---杂七杂八002_spring 注解@Value详解_@Value(quot;#{}quot;)与@Value(quot;${}quot;)的区别
  6. mysql配置优化ya_mysql性能调优工具之mytop
  7. CentOS上安装Selenium和google Driver的过程以及问题记录
  8. Gears Android WIFI/基站定位源代码分析
  9. [重要]宝塔面板Linux7.4.3/Windows6.8紧急更新
  10. 2022·09·漏洞众测平台·企业应急响应中心SRC·大集合·不定时更新
  11. 苹果账号安全提示问题忘了怎么办?
  12. 把读书当做信仰的民族:犹太民族
  13. 前端实现内网在线excel编辑和word在线编辑相关建议
  14. 为何现在欠钱的人,都不爱还钱,太气人了...
  15. Leetcode力扣 VS Code插件——面向新手
  16. 【笔记整理 - 操作系统】(时间较早)
  17. Java基础 -> 独享锁 VS 共享锁
  18. (三)棋盘覆盖问题(思路)
  19. Minitab 21 功能列表
  20. c语言a a- a*a,详解a、a、*a、**a

热门文章

  1. django URL路由基础
  2. Java 设计模式-【单例模式】
  3. Bash判断文件夹(目录)是否存在
  4. 进程间通信之共享内存
  5. 数据结构排序法之插入法
  6. Hadoop localhost: frankxulei@localhost: Permission denied (publickey,password)
  7. zookeeper伪集群(在一台机器上集群)
  8. Linux统计文件行数、字数、字节数
  9. 【No.1 Ionic】基础环境配置
  10. Spring web应用最大的败笔