![=5内核启动流程之(init_post())[在rest_init()中被调用].doc_第1页](http://file.renrendoc.com/FileRoot1/2020-1/10/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c1.gif)
![=5内核启动流程之(init_post())[在rest_init()中被调用].doc_第2页](http://file.renrendoc.com/FileRoot1/2020-1/10/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c2.gif)
![=5内核启动流程之(init_post())[在rest_init()中被调用].doc_第3页](http://file.renrendoc.com/FileRoot1/2020-1/10/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c3.gif)
![=5内核启动流程之(init_post())[在rest_init()中被调用].doc_第4页](http://file.renrendoc.com/FileRoot1/2020-1/10/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c4.gif)
![=5内核启动流程之(init_post())[在rest_init()中被调用].doc_第5页](http://file.renrendoc.com/FileRoot1/2020-1/10/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c/6874cd5d-d7fc-40c0-bf0d-71cfea43c59c5.gif)
全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
韦东山342页init进程是由内核启动的第一个(也是唯一一个)用户进程(进程号ID=1),它根据配置文件决定启动哪些程序,比如执行某些脚本、启动shell、运行用户指定的程序等。Init进程是后续所有进程的发起者,也是后续进程的父进程。比如在init进程启动/bin/sh程序后,才能够在控制台上输入各种命令。init进程的执行程序通常是/sbin/init程序,上面讲述的init进程的作用只不过是/sbin/init这个程序的功能。我们完全可以编写自己的/sbin/init,或者传入命令行参数“init=xxxxx”指定某个程序作为init进程运行。一般而言,在Linux系统有两种init程序:BSD init和System V init。BSD和System V是两种版本的UNIX系统。这两种init程序各有优缺点,现在大多Linux的发行版本使用System V init。但是在嵌入式领域,通常使用BusyBox集成的init程序,下面基于它进行讲解。【busybox-1.7.0也是一套源码树,进入后可以执行make menuconfig调用Config.in文件进行配置,然后便已安装到指定的目录下你做的根文件系统目录。】1内核如何启动init进程第771行-第774行 来个四选一内核启动的最后一步就是启动init进程,代码在busybox-1.7.0/init/main.c文件中,如下所示:顺便罗列一下内核启动流程:/arch/arm/boot/compressed/head.S:Start:Decompressed_kernel()/位于/arch/arm/boot/compressed/misc.c解压缩内核Call_kernel()Stext:/init/main.cStart_kernel()Setup_arch()Rest_init()Init()Do_basic_setup()Prepare_namespace()看到了这里,我已激动得说不出话了,因为来到我与挂载根文件系统最重要的接口函数。static int noinline init_post(void)free_initmem();unlock_kernel();mark_rodata_ro();system_state = SYSTEM_RUNNING;numa_default_policy();if (sys_open(const char _user *) /dev/console, O_RDWR, 0) signal-flags |= SIGNAL_UNKILLABLE;if (ramdisk_execute_command) run_init_process(ramdisk_execute_command); 【第763行】printk(KERN_WARNING Failed to execute %sn,ramdisk_execute_command);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()实现代码在/init/main.c中 韦东山344也】【执行/sbin/init时,它的环境参数为”HOME=/”、”TERM=linux”】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.);【没有发现初始化命令,你可以通过控制台传入“init=XXX”命令。这不是内核启动终点,init_post()函数是被rest_init()函数调用的。】上面代码并不复杂,其中的run_init_process函数使用它的参数所指定的程序来创建一个用户进程。但需要注意,一旦run_init_process函数创建进程成功,他将不会返回。解析内核启动init进程的过程如下:(1) 打开标准输入文件(stdin)、标准输出文件(stdout)、标准错误文件(stderr),它们对应的文件描述符分别为0、1、2。所谓标准输入就是在程序中使用scanf()、fscanf(stdin,)获取数据时,从哪个文件(文件)读取数据;标准输出、标准错误都是输出设备,前者对应printf()、fprintf(stdout,),后者对应fprint(stderr,)。第756行尝试打开/dev/console设备文件,如果成功,它就是init进程标准输入设备。【前提:制作的minirootfs必须含有该设备文件,否则打不开控制台】第759、760行,将文件描述符0复制给文件描述符1、2,所以标准输入、标准输出、标准错误都对应同一个文件(设备)。在移植Linux内核时,如果发现打印信息“Warning:unable to open an initial console.”,其原因大多是:根文件系统虽然被正确挂载了,但是里面的内容不正确,要么是没有/dev/console这个设备文件,要么它没有对应的设备。(2) 如果ramdisk_execute_command变量指定了要运行的程序,启动它。ramdisk_execute_command的取值(代码也在init/main.c)分三种情况。1:如果命令行参数中制定了“rdinit=”,则ramdisk_execute_command等于这个参数指定的程序。【命令行指的是.config文件中CMDLINE=】2:否则,如果/init程序存在,ramdisk_execute_command就等于“/init”。3:否则,ramdisk_execute_command为空。本书指定的命令行没有设备“rainit=”,根文件系统中也没有/init程序,所以ramdisk_execute_command为空。【安装busybox时会在/sbin目录下生成init文件,也韦东山不一样哦!】【第763行:】run_init_process()函数会根据参数指定的程序来创建一个用户进程,参数是路径。(3) 如果execute_command变量指定了要运行的程序,启动它。如果命令行参数中制定了“init=”,则execute_command等于这个参数指定的程序,否则为空。韦东山使用的命令行CMDLINE没有设定“init=”。【一般情况下设定CMDLINE中init=linuxrc,你可以打开看看。】(4) 依次尝试执行/sbin/init、/etc/init、/bin/init、/bin/sh。安装busybox后,/sbin/init在我们的根文件系统中是存在的,所以init进程使用的就是/sbin/init。从此系统控制权交给/sbin/init,不再返回init_post函数。【这还不是内核启动终点哦,你可以打开看看init文件,它是个链接文件,链接到/bin/busybox可执行程序。】2BusyBox的init进程的启动进程BusyBox init程序对应的代码在busybox-1.7.0/init/init.c中,先概述其启动流程,再结合/etc/inittab文件讲述init进程的启动流程。开始(busybox-1.7.0/init/init.c)设置信号处理函数初始化控制台解析inittab执行inittab的SYSINIT命令执行inittab的WAIT命令执行inittab的ONCE命令执行inittab的RESPAWN命令执行inittab的ASKFIRST命令检测RESPAWN命令和ASKFIRST命令,如果有退出的则重新执行。以上是init_main.c函数内容以上流程中与根文件系统构建关系密切的是控制台的初始化,对inittab文件的解释及执行。内核启动init进程时已经打开“/dev/console”设备作为控制台,一般情况下busybox的init程序就使用/dev/console。但是如果内核启动init进程的同时设置了环境变量CONSOLE或console,则使用环境变量指定的设备。方法一:在编译内核前修改内核源码树下.config文件的CMDLINE参数,指定console=ttySCA0等;方法二:通过bootloader添加环境变量,在启动内核时传递给内核。在busybox的init程序中还会检测这个设备是否可以打开,如果打不开就是用“/dev/null”。【我明白了为啥国嵌视频制作根文件系统时要在/dev目录下建立两个设备文件(ttySCA0和null)了。】Busybox的init进程只是作为其它进程的发起者和控制着,并不需要控制台与用户交互,所以init进程会把它关掉,系统启动后运行命令“ls /proc/1/fd”可以看到该目录为空。【补充知识:ls /proc/1/fd是查看Proc文件系统的1号进程的fd文件,其中fs文件表示“一个包含所有文件描述符的目录”】init进程创建其他子进程时,如果没有在/etc/inittab文件中指明它的控制台,则使用当前确定的控制台。【看来initab就是进程管理的“基本”喽!】/etc/inittab文件的相关文档和示例代码都在busybox-1.7.0/examples/inittab文件里。如果/etc/inittab文件存在,busybox就去解析它,然后按照它的指示创建各种子进程;否则使用默认的配置创建子进程。/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下::举例:ttySAC0:askfirst:-/bin/sh表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备),如果省略,则等同init进程的控制台。运行级别,也是System V init和BSD init的区别之一,对于busybox程序而言,这个字段没有意义,可以省略。表示init进程想如何控制这个子进程,可取8种值,如下图:action名称执行条件说明sysinit系统启动后最先执行执行一次,init等待它结束才继续执行wait系统执行完sysinit后执行执行一次,init等待它结束才继续执行once系统执行完wait后执行执行一次,init不等待它结束respawn启动完once后执行Init进程检测发现子进程退出时,重新启动它askfirst启动完respawn后执行与respawn类似,不过init先输出“Please press ENTER to activate this console”,等用户输入回车键后才启动子进程shutdown当系统关机时即重启、关闭系统命令时restartBusybox中配置了CONFIG_FEATURE_USE_INITTAB,并且init进程接收到了SIGHUO信号时先重新读取、解析/etc/inittab文件,在执行restart程序ctrlaltdel按下ctrl+alt+del键时-要执行的程序,它可以是可执行程序,也可以是脚本。如果字段前面有-字符,这个程序称为“交互式”的。在/etc/inittab文件的控制下,init进程的行为总结为如下:1=在系统启动前期,init进程先启动为sysinit、wait、once的三类子进程。2=在系统正常运行期间,init进程首先启动为respawn、askfirst的两类子进程,并监视它们,发现某个子进程退出时重新启动它。3=在系统退出时,执行为shutdown、restart、ctraltdel的三类子进程(之一或全部)。如果根文件系统里没有/etc/inittab文件,busybox init程序将使用如下默认的inittab条目。:sysinit:/etc/init.d/rcS:askfirst:/bin/shtty2:askfirst:/bin/shtty3:askfirst:/bin/shtty4:askfirst:/bin/sh:ctraltdel:/sbin/reboot:shutdown:/sbin/swapoff a:shutdown:/bin/umount a r:restart:/sbin/init看一个/etc/inittab的实例吧!仿照busybox的examples/inittab文件,创建一个inittab文件,内容如下:/etc/inittab:sysinit:/etc/init.d/rcS【这是init进程启动的第一个子进程,他是一个脚本,可以在里面指定用户想要执行的操作,比如挂接其他文件系统、配置网络等】【rcS是一个脚本文件,可以在里面添加自动执行命令。具体能干那些事请看韦东山根文件系统制作过程之/etc/init.d/rcS文件的构建,韦东山354页】:askfirst:/bin/sh【启动shell,以下为控制台】:ctraltdel:/sbin/reboot【控制台不能输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业园区绿色制造与节能减排技术
- 工业废弃地生态修复与再利用
- 工业废水处理技术进展及政策解读
- 工业安全防护与自动化技术的融合
- 工业机器人技术的应用与发展
- 工业污染防治与环境教育案例分析
- 工业自动化中的数据驱动决策技术
- 工业物联网的实时数据传输与处理
- 工业机械设备的节能与环保改造
- 工业遗址改造为文创园区的策略
- 中国铁塔笔试题目及答案
- 银行支行安全防范教育培训制度
- 招投标员测试题及答案
- 工厂颜色标识管理制度
- 校园电脑维修团创业项目计划书(正式)
- JG/T 368-2012钢筋桁架楼承板
- DB31/T 1096-2018医院日间手术管理规范
- GB/T 14486-2008塑料模塑件尺寸公差
- 电力拖动自动控制系统-运动控制系统(第5版)习题答案
- 日本动漫介绍英文版(课堂PPT)
- Oracle_ERP_EBS_采购模块PO概要培训
评论
0/150
提交评论