zoukankan      html  css  js  c++  java
  • 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);
    ...
    
  • 相关阅读:
    php面向对象开发的学习
    我的php感悟
    说说面向对象
    session,上传文件
    PHP构造函数的用法分析
    生成图片
    上传文件
    fetch
    ajax2
    ajax1
  • 原文地址:https://www.cnblogs.com/dakewei/p/13261358.html
Copyright © 2011-2022 走看看