欢迎来到天天文库
浏览记录
ID:38579876
大小:59.50 KB
页数:5页
时间:2019-06-15
《=5内核启动流程之(init_post())[在rest_init()中被调用]》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、韦东山342页init进程是由内核启动的第一个(也是唯一一个)用户进程(进程号ID=1),它根据配置文件决定启动哪些程序,比如执行某些脚本、启动shell、运行用户指定的程序等。Init进程是后续所有进程的发起者,也是后续进程的父进程。比如在init进程启动/bin/sh程序后,才能够在控制台上输入各种命令。init进程的执行程序通常是/sbin/init程序,上面讲述的init进程的作用只不过是/sbin/init这个程序的功能。我们完全可以编写自己的/sbin/init,或者传入命令行参数“init=xxxxx”指定某个程序作为init进程运行。一般而言,在Linux系统有两种ini
2、t程序:BSDinit和SystemVinit。BSD和SystemV是两种版本的UNIX系统。这两种init程序各有优缺点,现在大多Linux的发行版本使用SystemVinit。但是在嵌入式领域,通常使用BusyBox集成的init程序,下面基于它进行讲解。【busybox-1.7.0也是一套源码树,进入后可以执行makemenuconfig调用Config.in文件进行配置,然后便已安装到指定的目录下[你做的根文件系统目录]。】1à内核如何启动init进程[第771行---第774行来个四选一]内核启动的最后一步就是启动init进程,代码在[busybox-1.7.0/init/m
3、ain.c]文件中,如下所示:顺便罗列一下内核启动流程:/arch/arm/boot/compressed/head.S:Start:Decompressed_kernel()//位于/arch/arm/boot/compressed/misc.c[解压缩内核]Call_kernel()Stext:/init/main.cStart_kernel()Setup_arch()…Rest_init()Init()Do_basic_setup()Prepare_namespace()看到了这里,我已激动得说不出话了,因为来到我与挂载根文件系统最重要的接口函数。staticintnoinline
4、init_post(void){free_initmem();unlock_kernel();mark_rodata_ro();system_state=SYSTEM_RUNNING;numa_default_policy();if(sys_open((constchar__user*)"/dev/console",O_RDWR,0)<0)【第756行】printk(KERN_WARNING"Warning:unabletoopenaninitialconsole.");(void)sys_dup(0);【第759行】(void)sys_dup(0);【第760行】current->
5、signal->flags
6、=SIGNAL_UNKILLABLE;if(ramdisk_execute_command){run_init_process(ramdisk_execute_command);【第763行】printk(KERN_WARNING"Failedtoexecute%s",ramdisk_execute_command);}if(execute_command){【重要的知识点,请看文章最后紫色部分。】run_init_process(execute_command);printk(KERN_WARNING"Failedtoexecute%s.Attempti
7、ng""defaults...",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("Noinitfound.Trypassinginit=optiontokernel.");
8、【没有发现初始化命令,你可以通过控制台传入“init=XXX”命令。这不是内核启动终点,init_post()函数是被rest_init()函数调用的。】}上面代码并不复杂,其中的run_init_process函数使用它的参数所指定的程序来创建一个用户进程。但需要注意,一旦run_init_process函数创建进程成功,他将不会返回。解析内核启动init进程的过程如下:(1)打开标准输入文件(stdin)、标准输出文件(stdo
此文档下载收益归作者所有