linux启动过程分析

  1. linux内核从哪里开始?
    start_kernel(),linux内核源码/init/main.c, 在此之前有些准备工作,先不分析
  2. linux内核是从哪里启动init程序的呢?
    start_kernel()-> arch_call_rest_init() -> rest_init()
  3. 具体看一下rest_init()
pid = kernel_thread(kernel_init, NULL, CLONE_FS); //这里启动线程(执行实体为kernel_init())
  1. 分析一下kernel_init()的关键代码
...
ret = run_init_process(ramdisk_execute_command);
...
ret = run_init_process(execute_command);
...
if (!try_to_run_init_process("/sbin/init") || //尝试执行/sbin/init
            !try_to_run_init_process("/etc/init") || //尝试执行/etc/init
            !try_to_run_init_process("/bin/init") || //尝试执行/bin/init
            !try_to_run_init_process("/bin/sh")) //尝试执行/bin/sh
...
  1. linux内核会从文件系统中找init这个用户空间程序,那么去哪里找呢?
    /sbin/init -> /etc/init -> /bin/init -> /bin/sh (如果这几个都没找到,内核就会直接执行panic,提示开发者,在根文件系统中没有找到init可执行程序)
  2. 那么/sbin/init都做了些什么呢?
    首先找到/sbin/init的源码,根据使用的发行版来选择,
    现在发行版使用的init程序有, busybox简化版init, sysvinit, upstart和systemd
  3. 哪里可以找到init的源码?
    busybox简化版init: https://git.busybox.net/busybox/tree/init/init.c
    sysvinit: http://download.savannah.gnu.org/releases/sysvinit/
    upstart: ttp://upstart.ubuntu.com/download.html
    systemd: https://github.com/systemd/systemd
  4. 以sysvinit(http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.97.tar.xz, src/init.c)为例
...
if (geteuid() != 0) { //检查当前是否为root用户
...
init_main()
...
read_inittab(), 读取并解析/etc/inittab文件和/etc/inittab.d目录
...
start_if_needed(), 这个函数就用来执行各种从/etc/inittab中解析出来的命令
    startup(ch);
...
原文地址:https://www.cnblogs.com/dakewei/p/13261358.html