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

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

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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函数使用它的参数所指定的程序来创建一个用户进程。

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档