init进程(即进程1,或者说linuxrc)的详解
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。
一、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)的详解相关推荐
- 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...
- python创建进程的方法_python进程的状态、创建及使用方法详解
本文实例讲述了python进程的状态.创建及使用方法.分享给大家供大家参考,具体如下: 进程以及状态 1. 进程 程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资 ...
- linux进程文件描述符 vnode,Linux C编程详解:进程原理分析、文件描述符和文件记录表、文件句柄和文件原理...
一.引言 文件操作是Linux C编程中其中的一项核心技术,实际上也相当重要,这里并不是说狭义上的那种文件操作,它也非常有助于理解和学习Linux系统.为什么这样说呢?因为在Unix/Linux的世界 ...
- 系统服务管理与控制程序(Init System/初始化系统)-- Systemd 的 Unit 配置文件详解
文章目录 一.Service 的配置文件 (一)[Unit] 区块 (二)[Service] 区块 1.启动命令 2.启动类型 3.重启行为 (三)[Install] 区块 二.Target 的配置文 ...
- apache 工作模式prefork进程模式和worker线程模式参式详解和推荐设置
一apache工作模式: 1.prefork进程模式: prefork模式参数说明: prefork模式推荐设置: 二.apache worker模式: 1. 参数 三.prefork和worker模 ...
- 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)
一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...
- php fpm子进程数配置,php-fpm进程管理方式以及子进程数量配置原则详解
php-fpm的进程管理方式pm是一个重要的参数,主要来控制子进程的数量. pm进程管理方式有三种: static: 表示在php-fpm运行时直接fork出 pm.max_chindren个子进程 ...
- Conhost.exe是什么进程?为什么会启动运行?图文详解
为什么80%的码农都做不了架构师?>>> 如果你使用的是微软的Vista或者Win7系统,当你打开命令行cmd.exe的窗口后,你会在Windows任务管理器中发现有一个Con ...
- Linux进程top命令作用是,linux top命令详解
top 命令主要用于查看进程的相关信息,同时它也会提供系统平均负载,cpu 信息和内存信息.下面的截图展示了 top 命令默认提供的信息: 系统平均负载 top 命令输出中的第一行是系统的平均负载,这 ...
- Android - 跨进程通信(IPC) 另一种便捷实现 详解
文章目录 1. 写在前面 2. 跨进程通信的实现 3. 扩展思考 4. 参考资料 1. 写在前面 看到此图有何感想,这是另一种便捷的实现方式,我们先来看看其它的几种方式. Android 进程间通信 ...
最新文章
- ios中利用NSDateComponents、NSDate、NSCalendar判断当前时间是否在一天的某个时间段内。...
- oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志
- matlab有限元分析与应用_专栏 | UEL用户子程序开发步骤—有限元理论基础及Abaqus内部实现方式研究系列20...
- java io字符流_Java IO流字符流简介及基本使用
- SpringCloud学习笔记008---杂七杂八002_spring 注解@Value详解_@Value(quot;#{}quot;)与@Value(quot;${}quot;)的区别
- mysql配置优化ya_mysql性能调优工具之mytop
- CentOS上安装Selenium和google Driver的过程以及问题记录
- Gears Android WIFI/基站定位源代码分析
- [重要]宝塔面板Linux7.4.3/Windows6.8紧急更新
- 2022·09·漏洞众测平台·企业应急响应中心SRC·大集合·不定时更新
- 苹果账号安全提示问题忘了怎么办?
- 把读书当做信仰的民族:犹太民族
- 前端实现内网在线excel编辑和word在线编辑相关建议
- 为何现在欠钱的人,都不爱还钱,太气人了...
- Leetcode力扣 VS Code插件——面向新手
- 【笔记整理 - 操作系统】(时间较早)
- Java基础 -> 独享锁 VS 共享锁
- (三)棋盘覆盖问题(思路)
- Minitab 21 功能列表
- c语言a a- a*a,详解a、a、*a、**a