zoukankan      html  css  js  c++  java
  • Linux系统快速启动方案

    =========================        基本常识       =========================

    Linux系统基本启动流程:

    1、 CPUROM(如果有的话)的0x0地址开始读取代码,执行loader

    2、 Loader初始化ram,从rom中拷贝ubootkernel的镜像到ram的指定地址并执行;

    3、 Uboot(如果有)拷贝kernel镜像和dtb文件到ram的指定地址,并运行kernel

    4、 设置bootargs会被覆盖,kernel启动;

    5、 Kernel自解压;

    6、 Kernel初始化;

    7、 Kernel加载内置驱动程序,启动硬件设备;

    8、 加载文件系统,读取并执行/etc/inittab.

    =========================      快速启动原理     =========================

    一、 基本原理

    1、 硬件IO时间;

    2、 流程精简;

    3、 内核精简;

    二、 启动流程分析

    1、 0x0,一级loader,配置ram à必须;

    2、 拷贝ubootkerneldtbram à必须,从ROM读值,IO时间;

    3、 Uboot(如果有)拷贝kerneldtb à可去除,直接跳过;

    4、 设置bootargskernel启动; à非必须,不占IO时间;

    5、 Kernel自解压; à可精简,但会加长2IO时间;

    6、 Kernel初始化; à必须;

    7、 Kernel加载内置驱动程序,启动硬件设备; à可精简,占大量IO时间;

    8、 扫描ROM à可去除;

    9、 挂载文件系统; à必须,但为了8,可调整到2

    10、 读取并执行/etc/inittab. à必须;

     

    三、 基本思路

    1、 Loader

    1. Loader存在的目的就是为了引导系统;
    2. 除非必要,不需要loader来驱动硬件,否则linux就没有存在的必要;

    2、 Kernel

    1. 必要的常识:Kernel的启动只与CPUram有关;
    2. Kernel内嵌驱动,是为了应对固件挂载前必须要做的硬件IO操作;

    3、 文件系统

    1. Kernel启动时,文件系统不一定要从rom中读取,也可以在ram中读取;
    2. Romloader中已经能够使用,可以趁这个时候把需要的东西一次性读出,没有必要占用kernel启动的宝贵时间;
    3. 为了加速loader加载文件系统的速度,文件系统又可分为通用部分(<3mb)、固件部分,由kernel中的cramfs驱动加载启动文件系统,先完成启动任务,再从启动文件系统中加载rom设备的驱动,再加载固件文件系统;

     

    四、 调整后的启动流程

    1、 0x0,一级loader,配置ram 

    2、 拷贝kernel(精简),dtb,文件系统镜像(精简)到ram

    3、 设置bootargskernel启动; 

    4、 Kernel自解压;

    5、 Kernel初始化;

    6、 Kernel加载必须的驱动程序备;

    7、 挂载通用文件系统;

    8、 读取并执行/etc/inittab

    9、 挂载固件,包括驱动程序、额外的应用软件及LIB

    =========================      快速启动配置     =========================

    一、 精简loader

    思路:

    1、 Loader的目的是为内核准备启动的条件;

    2、 Loader跳过准备运行环境的步骤,直接加载内核即可;

    方法:

    注:各大厂商的bootloader千差万别,只能介绍大概的办法

    1、 如果官方工程有跳过uboot的方法,那么直接采用这种方法;

    2、 1不可取,则删改uboot代码,在进入uboot,硬件初始化结束后,不进行uboot用户环境的初始化,直接使用源代码加载和启动镜像;

    效果:bootloader过程耗时减少;bootloader体积缩小;

     

    二、 精简kernel

    思路:只保留启动所必须的驱动程序即可,如cramfs的读写驱动,音频驱动(开机音乐),其余驱动做成ko文件,放到文件系统中;

    方法:

    1、 make ARCH=arm menuconfig,砍掉不会用到的驱动;

    2、 启动时不需要的,但应用程序需要的驱动程序,设置为module,从内核剥离,;

    3、 Busybox必须提供insmod功能;

    效果:内核体积缩小,loadder加载kernel的时间缩短,kernel解压缩时间缩短,kernel启动到挂载文件系统的时间缩短;

     

    三、 精简rootfs(即制作通用部分)

    思路:

    只保留:1busybox2、通用的/etc配置文件;3、加载固件所需的驱动程序(rom相关);4、启动任务所需要的文件(比如音频播放器);5、相关运行库;使用cramfs打包,体积约2.4mb

    效果:该文件系统可以直接在ram中运行,可以延迟加载rom驱动;

     

    四、 制作固件

    1、 剩余的所有文件全部封装到固件系统中(ext4格式或ubi格式);

    2、 但需要注意的是固件的/etc中需要有一个rc.local文件,当rootfs中定制的任务完成后,调用该文件启动固件的任务;

    3、 为了保持系统的正常运行,原/etc中的rcS文件在挂载固件后,要添加额外操作:

    # 挂载固件

    Mount /dev/*** /mnt

    # 用固件的etc覆盖通用的etc,应用固件的配置及恢复写权限

    Mount /mnt/etc /etc

    # 用固件的var覆盖通用的var,恢复读写权限

    Mount /mnt/var /var

    # 扩展lib搜索范围到固件的/lib/usr/lib,保证程序正常运行

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/lib:/mnt/usr/lib

    # 执行固件的启动配置脚本

    /etc/init.d/rc.local

  • 相关阅读:
    权限和分组
    验证与授权
    CSRF、XSS、clickjacking、SQL 的攻击与防御
    上下文处理器及中间件
    类和实例
    偏函数
    生成器
    迭代 复习
    函数调用 复习
    复习 条件判断,循环
  • 原文地址:https://www.cnblogs.com/chencanjian/p/5984041.html
Copyright © 2011-2022 走看看