概述
本文经由过程扼要分析init过程源码,梳理其处理流程,重点存眷init过程若何启动应用法度榜样,总结启动脚本文件的编写思路
init过程源码分析
init过程是linux内核启动的第一个过程,怎么知道的?大年夜内核源码linux-2.6.xxx/init/main.c代码的kernel_init()函数分析,可以发明,内核会根据uboot传入的参数来启动第一个过程,一般都是init
怎么启动的呢,调用kernel_execve()函数完成的,猜测是大年夜根文件体系的/sbin/init来启动的,linux的任何应用法度榜样都是基于文件体系的,启动应用法度榜样前提是根文件体系已经挂载好了。好,那么根文件体系又是大年夜哪里来的呢,是由busybox这个对象设备编译生成的,所以要分析init源码,要去busybox里找init的源码
源码地位:/busybox/init/init.c,在个中查找main()函数,发明只有init_main(),没有main(),可以猜测busybox是经由过程一些办法将init过程的人口修改为init_main(),实际上所有busybox的敕令对象都是一个到busybox法度榜样的链接,
- cd /sbin
- ls -l init
- lrwxrwxrwx 1 root 0 14 Nov 16 2016 init -> ../bin/busybox
可以看到,init过程其实是到busybox的链接,不消管它,知道init过程的人口是init_main()函数就行了
- /* Check if we are supposed to be in single user mode */
- if (argv[1]
- && (strcmp(argv[1], "single") == 0 || strcmp(argv[1], "-s") == 0 || LONE_CHAR(argv[1], '1'))
- ) {
- /* ??? shouldn't we set RUNLEVEL="b" here? */
- /* Start a shell on console */
- new_init_action(RESPAWN, bb_default_login_shell, "");
- } else {
- /* Not in single user mode - see what inittab says */
- /* NOTE that if CONFIG_FEATURE_USE_INITTAB is NOT defined,
- * then parse_inittab() simply adds in some default
- * actions (i.e., INIT_SCRIPT and a pair
- * of "askfirst" shells) */
- parse_inittab();
- }
这一段代码是一个if断定,注释说如不雅是single user mode,则走上半段代码,如不雅不是single user mode,则调用parse_inittab() 函数,因为内核启动init过程没有传入附加参数,所以argv[1]不存在,法度榜样走parse_inittab()
在busybox中履行make meunconfig,进入熟悉的设备界面
大年夜概浏览一下,和init有关系的似乎有个Init Utilities项,进去
注释还说如不雅没有定义CONFIG_FEATURE_USE_INITTAB 这个宏,法度榜样会履行一些默认的action,那怎么知道这赋J定义了没有呢,猜测这个宏应当是对busybox设备时的选项,好,怎么查看busybox设备呢,和linux内核设备一样的事理,结合make menuconfig和各级config文件来看
推荐阅读
ES6,正式名称是ECMAScript2015,然则ES6这个名称加倍简洁。ES6已经不再是JavaScript最新的标准,然则它已经广泛用于编程实践中。如不雅你还没用过ES6,如今还不算太晚...下面是10个ES6最>>>详细阅读
地址:http://www.17bianji.com/lsqh/37057.html
1/2 1