zoukankan      html  css  js  c++  java
  • linux kernel启动流程

    linux kernel启动是从./init/main.c中开始的,其大概流程是:
    1. 调用start_kernel()函数;
    2. start_kernel()调用rest_init()函数;
    3. rest_init()调用kernel_init()函数;
    4. kernel_init()调用init_post()函数;
    5. init_post()调用run_init_process()函数去创建init进程,
    这个函数中的代码如下:
    run_init_process("/init");
    run_init_process("/sbin/init");
    run_init_process("/etc/init");
    run_init_process("/bin/init");
    run_init_process("/bin/sh");
    这时因为run_init_process()函数创建init进程成功后就不会返回了。

    init程序会做哪些事呢?
    1. 读/etc/inittab,从中读取当前系统预设的run level,
    sh-# cat /etc/inittab
    # /etc/inittab: init(8) configuration.
    # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

    # The default runlevel.
    id:4:initdefault:
    ....
    sh-# exit
    exit
    INIT: Entering runlevel: 4

    2. 根据读出的run level的值,选择执行不同的服务,比如:
    如果系统预设的run level值为4,那么执行配置在/etc/rc4.d/下的服务;
    如果系统预设的run level值为5,那么执行配置在/etc/rc5.d/下的服务。
    用户自己的程序都是根据需要,进行相应的配置。

    以上,linux kernel就启动起来了。

    在shell下验证查看,init进程所执行的程序就是预设的/sbin/init程序。
    sh-# ls -l /sbin/init
    -rwxr-xr-x 1 root root 28323 Oct 10 03:00 /sbin/init
    sh-# ls -l /proc/1/exe
    lrwxrwxrwx 1 root root 0 Oct 10 06:19 /proc/1/exe -> /sbin/init
    sh-#

  • 相关阅读:
    旧文备份:CANopen协议PDO的几种传输方式
    CANopen 基础
    单片机FLASH与RAM、ROM的关系
    在CANopen网络中通过LSS服务设置节点地址和网络波特率
    STM32F103 CAN中断发送功能的再次讨论
    由RS-232串口到PROFIBUS-DP总线的转换接口设计
    profibus 的DPV0 和DPV1
    PROFIBUS-DP
    profibus总线和profibus dp的区别
    获取验证码倒计时
  • 原文地址:https://www.cnblogs.com/james1207/p/3362188.html
Copyright © 2011-2022 走看看