zoukankan      html  css  js  c++  java
  • 《OpenWrt开发笔记》第13章 OpenWrt启动流程【转】

    转自:https://blog.csdn.net/bruceoxl/article/details/78707882

    13.1系统介绍

    任何系统的启动都是开发人员首要关注的问题,因为只有了解了系统的启动流程和启动机制,才能真正掌握一个系统,如果对启动的启动不熟悉的话,是不可能真正用好一个系统,openwrt系统也不例外,他的启动和一般的嵌入式系统启动还有所区别,现在咱们就分析一下openwrt的启动流程。

    13.2内核补丁

    在openwrt的官网上面下载的源码,其中包括了一些内核补丁,这里究竟为什么要给内核做补丁呢?因为openwrt为了支持更多的路由器,更多的操作和openwrt特有的一些内核功能,linux源码是不具备的,这样openwrt为了增加这些功能,就需要在linux官网上面下载的源代码中做一些修改,在这里体现为给linux源码打补丁。Openwrt源码中的linux补丁文件放在target/linux/generic文件下面,有对于不同版本的linux内核补丁文件。Rt5350采用的是3.10版本的内核,所以他的补丁文件在patches-3.10目录下面。这里是所有的内核补丁文件,在编译openwrt的时候,会首先把他们拷贝到内核目录下面,然后在内核上面打上这些补丁,然后再编译内核。咱们首先分析他对于linux启动的补丁,它的名字是921-use_preinit_as_init.patch(在Ubuntu源文件中),咱们可以看看他的内容。
    这里写图片描述
    可以看到他它修改linux内核中默认的启动项,可以看到它首先启动/etc/preinit(开发板的文件系统中),它是个脚本,咱们就从这个脚本说起。

    13.3 preinit

    preinit脚本在etc目录下面,首先先看看他的内容:
    这里写图片描述
    这里写图片描述
    这里写图片描述

    这就是个bash脚本,前半部分只是定义了一些变量,先记住他们的内容即可,有两个函数是我们需要了解的,boot_hook_init和boot_run_hook。他们定义在/lib/functions/preinit.sh文件中,boot_hook_init是初始化一个函数队列,boot_run_hook是运行一个函数队列,还有一个这个文件没有体现,后面的文件中会遇到,这里说明一下,boot_book_add这个是在一个函数队列中添加一个函数。然后就是执行:
    这里写图片描述

    循 环 执 行/lib/preinit 目录下面的脚本,这里简要分析/lib/preinit目录下的一个文件,循环执行/lib/preinit目录下面的脚本,这里简要分析一个,这里分析02_default_set_state,首先看看他的内容。
    这里写图片描述

    可以看到它就是在preinit_main函数队列中增加一个函数,这个函数就是简单的执行一个脚本。当运行preinit_main的时候,队列中的所有函数就会依次执行。其他文件可以自行分析,都比较简单。

    最后在preinit脚本中执行preinit_main。执行完这个脚本之后init进程会根据inittab文件执行其他的启动项。

    13.4 inittab

    inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令;开机、关机、重启对应的命令;各运行级登陆时所运行的命令。

    如果存在/etc/inittab文件,Busyboxinit程序解析它,然后按照它的指示创建各种子进程,否则使用默认的配置创建子进程。

    /etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下
    < id> : < runlevels>:< action>:< process>
    1、id:表示这个子进程要使用的控制台,如果省略,则使用与init进程一样的控制台.
    2、runlevels:这个字段没有意义,可以省略。在linux有意义.
    3、action:表示init进程如何控制这个子进程,具体取值见下表.
    4、process:要执行的程序,它可以是可执行程序,也可以是脚本.如果process字段前有“-”字符,这个程序被称为“交互的”.
    【attention】action取值

    表1

    这里写图片描述

    先肯看/etc/inittab中的内容:
    这里写图片描述

    从上面的分析可以看出它在开机启动的时候执行/etc/init.d/rcS脚本,以前是有/etc/init.d/rcS脚本的,现在的openwrt已经去掉了这个脚本文件,只要有rcSSboot这几个参数就可以,但是功能是有的就是按顺序执行/etc/rc.d下面的各个脚本,以S开头代表启动的时候执行的脚本,与命令行中的S对应,以K开头的代表关机的时候需要执行的脚本,与命令行中的K对应。

    13.5总结

    从上面的分析我们来总结一下openwrt的启动流,/etc/preinit->/lib/preinit/* ->/etc/inittab->/etc/rc.d/S*。

  • 相关阅读:
    ASP.NET MVC5 :Attribute路由使用详解
    C# 常用字符串加密解密方法
    C#获取当前主机硬件信息
    用C#调用Windows API向指定窗口发送按键消息
    Win32 编程消息常量(C#)
    C#程序员开发WinForm必须知道的 Window 消息大全
    C#通过SendMessage发送消息,改变其他程序的下拉框控件(ComboBox)的值
    C#常用 API函数大全
    SendKeys发送组合键
    webapi get请求 FromUri list参数传递
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13806018.html
Copyright © 2011-2022 走看看