- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
=5内核启动流程之(init_post)[在rest_init中被调用]
韦东山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函数使用它的参数所指定的程序来创建一个用户进程。
您可能关注的文档
- 09山东申论真题解析.doc
- 2013年电子商务行业参考报告(15页).doc
- 09届高二语文暑假复习金钥匙5病句辨析和修改.doc
- 2013版八上英语unit1Wheredidyougoonvacation教材电子版.doc
- 2015中文版3dsMax2012完全自学手册(附DVD-ROM光盘1张).pdf
- 2013电教工作年终统计表.doc
- 09初中复赛试题.doc
- 09年中考数学模拟试卷17.doc
- 1.-----PSIM仿真(一)01.doc
- 2013高考电极反应式的书写技巧.doc
- 全国青少年(毒品预防教育)知识考试题库与答案 .pdf
- 2023年山东胶州市领军计划自主招生历史试题真题(含答案详解) .pdf
- 【人教版八年级生物】第六单元 第二章 认识生物的多样性 .pdf
- 冀人版-第三单元 电(提升卷)-四年级科学上册单元培优进阶练.docx
- 新郑市事业单位统考真题 .pdf
- 冀人版-第三单元动物的生长与繁殖(单元测试)四年级下册科学.docx
- CLCN4基因变异相关癫痫的临床表型及基因变异特点 .pdf
- 【《“双减”背景下小学中年级语文自主阅读策略探究》6500字】 .pdf
- 高一语文开学第一课+课件+2024-2025学年统编版高中语文必修上册 .pdf
- 密山市事业单位统考真题 .pdf
文档评论(0)