上节课,我们就把内核的启动流程给彻底分析完了,我们知道,在内核的启动流程中,最终是要运行我们的系统应用程序,然后这些系统应用程序就帮我们构建一个根文件系统,实现人机交互。
我们从上节课的分析知道,当内核挂接(识别)好了根文件系统后,最后会执行下面的函数:
我们进入这个函数看看:
首先,它先打开了"/dev/console"这个文件,也就是我们的终端(控制台)。然后,我们把这个文件号进行复制两次(sys_dup为重定向),且这两个复制后的文件号都指向这个文件。其实,这里就是创建标准输入,标准输出,标准错误(0,1,2),后面ramdisk_execute_command的值是NULL(具体什么原因最近可以找搜索一下这个变量,这里就不分析了,它是和虚拟内存盘有关的。),所以if的语句块不会被执行,之后execute_command我们是有值的,我们看看它的值是什么:
可以看到,它后面也定义有__setup这个宏,而且参数是"init=",这个在我们命令行参数里面是有定义的,也就是我们第一个启动的应用程序。这样,我们就会第一个应用程序。如果我们没有定义我们的“init=”这个参数,或者这个程序不存在的话,我们就会执行后面的程序,也就是后面的四个run_init_process调用,如果这些程序都不存在,就会引发错误(一般来说,我们执行第一个程序后就一去不复反了。)
到此,第一个应用程序我们就分析完了!