进程的实现源文件
与网络相关的命令,例如:、 等
与 相关的实现,例如:、 等
下常用的命令,主要是与文件系统相关的,例如:! 等
" 进程简介
Busybox 中最重要的程序自然是 init。
大家都知道 init 进程是由内核启动的第一个(也是唯一一个)用户进程(进程 ID 为 1),init 进
程根据配置文件决定启动哪些程序,例如:执行某些脚本、启动 shell 或运行用户程序等等。
Init 是后续所有进程的发起者,例如:init 进程启动/bin/sh 程序后,我们才能够在控制台上
输入各种命令。
Init 进程的执行程序通常都是/sbin/init,上述讲到的 init 进程的作用只不过是/sbin/init 这个
程序的功能。如果我们想让 init 执行自己想要的功能,那么有两种途径:第一,使用自己
的 init 程序,这包括使用自己的 init 替换/sbin/下的 init 程序或者修改传递给内核的参数,指
定”init=xxx”这个参数,让 init 环境变量指向自己的 init 程序;第二,就是修改 init 的配置文
件,因为 init 程序的很大一部分的功能都是按照其配置文件执行的。
一般而言,在 Linux 系统中有两种 init 程序:BSD init 和 System V init。BSD 和 System V
是两种版本的 UNIX 系统。这两种 init 程序各有优缺点,现在大多数 Linux 发行版本使用的
都是 System V init。但在嵌入式系统中常使用的是 Busybox 集成的 init 程序,下面基于它
进行介绍。
内核如何启动 进程
内核启动的最后一步就是启动 init 进程,代码在 init/main.c 文件中,如下所示:
代码并不复杂,与 init 启动最强相关的就是 run_init_process 这个函数了,它运行指定的
init 程序,注意:一旦 run_init_process 运行创建进程成功,它将不会返回,而是通过操作
内核栈进入用户空间。所以上面并不是运行了四个 init 进程,而是根据优先级,一旦某一
个运行成功,就不往下继续执行了。
下面详细描述一下该函数的执行过程:
(1)打开标准输入、标准输出和标准错误设备
Linux 中最先打开的 3 个文件分别称作标准输入(stdin)、标准输出(stdout)和标准错误
(stderr),它们对应的文件描述符分别是 0、1、2.。
如下代码就是执行这个操作,先打开文件/dev/console 作为保准输入,然后将文件描述符
复制给文件描述符 1、2,这样使得标准输入、标准输出以及标准错误都使用/dev/console
这个文件。注意代码上面的注释”该函数不能失败,也就是说至少/dev/console 必须存在”。
评论