文档详情

=5内核启动流程之(init_post)[在rest_init中被调用].doc

发布:2017-04-24约6.7千字共5页下载文档
文本预览下载声明
韦东山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函数使用它的参数所指定的程序来创建一个用户进程。
显示全部
相似文档