=5内核启动流程之(init_post)[在rest_init中被调用].doc
文本预览下载声明
韦东山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.c
Start_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) 0)【第756行】
printk(KERN_WARNING Warning: unable to open an initial console.\n);
(void) sys_dup(0);【第759行】
(void) sys_dup(0);【第760行】
current-signal-flags |= SIGNAL_UNKILLABLE;
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command); 【第763行】
printk(KERN_WARNING Failed to execute %s\n,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函数使用它的参数所指定的程序来创建一个用户进程。
显示全部