Linux系统快速启动方案
========================= 基本常识 =========================
Linux系统基本启动流程:
1、 CPU从ROM(如果有的话)的0x0地址开始读取代码,执行loader;
2、 Loader初始化ram,从rom中拷贝uboot或kernel的镜像到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、 拷贝uboot或kernel及dtb到ram; à必须,从ROM读值,IO时间;
3、 Uboot(如果有)拷贝kernel和dtb; à可去除,直接跳过;
4、 设置bootargs,kernel启动; à非必须,不占IO时间;
5、 Kernel自解压; à可精简,但会加长2的IO时间;
6、 Kernel初始化; à必须;
7、 Kernel加载内置驱动程序,启动硬件设备; à可精简,占大量IO时间;
8、 扫描ROM; à可去除;
9、 挂载文件系统; à必须,但为了8,可调整到2;
10、 读取并执行/etc/inittab. à必须;
三、 基本思路
1、 Loader
- Loader存在的目的就是为了引导系统;
- 除非必要,不需要loader来驱动硬件,否则linux就没有存在的必要;
2、 Kernel
- 必要的常识:Kernel的启动只与CPU及ram有关;
- Kernel内嵌驱动,是为了应对固件挂载前必须要做的硬件IO操作;
3、 文件系统
- Kernel启动时,文件系统不一定要从rom中读取,也可以在ram中读取;
- Rom在loader中已经能够使用,可以趁这个时候把需要的东西一次性读出,没有必要占用kernel启动的宝贵时间;
- 为了加速loader加载文件系统的速度,文件系统又可分为通用部分(<3mb)、固件部分,由kernel中的cramfs驱动加载启动文件系统,先完成启动任务,再从启动文件系统中加载rom设备的驱动,再加载固件文件系统;
四、 调整后的启动流程
1、 0x0,一级loader,配置ram;
2、 拷贝kernel(精简),dtb,文件系统镜像(精简)到ram;
3、 设置bootargs,kernel启动;
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(即制作通用部分)
思路:
只保留:1、busybox;2、通用的/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
Linux系统快速启动方案的更多相关文章
- CentOS(四)--Linux系统的启动级别
对于绝大多数Linux程序员来说,进入Linux系统后一般看到的是黑乎乎的界面(开发模式),因为系统如果启动选择开发模式,会减少启动时间,优化内存等.但是通常我们刚安装完Linux系统,然后进去以后是 ...
- 2021年3月-第01阶段-Linux基础-Linux系统的启动流程
Linux系统的启动流程 理解Linux操作系统启动流程,能有助于后期在企业中更好的维护Linux服务器,能快速定位系统问题,进而解决问题. 上图为Linux操作系统启动流程 1.加载BIOS 计算机 ...
- 探索 Linux 系统的启动过程
引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...
- 腾讯云Linux系统中启动自己安装的tomcat
腾讯云Linux系统中启动自己安装的tomcat 首先通过工具查看一下安装的tomcat的位置 进入命令行之后输入以下指令: 此时,tomcat已经启动了.
- [转] 浅谈Linux系统的启动流程
原文:http://blog.csdn.net/justdb/article/details/9621271 版权声明:本文为博主原创文章. Linux系统的启动时通过读取不同的配置文件,执行相应的S ...
- 详解linux系统的启动过程及系统初始化
一.linux系统的启动流程 关于linux系统的启动流程我们可以按步进行划分为如下: POST加电自检 -->BIOS(Boot Sequence)-->加载对应引导上的MBR(boot ...
- 浅谈Linux系统的启动流程
Linux系统的启动时通过读取不同的配置文件,执行相应的Shell脚本完成的.当然本文只是简单的从文件的角度分析,更深层次的本文没涉及. 主要读取了以下文件: /boot/grub/grub.con ...
- Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with
Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with 摘要 Li ...
- Linux系统的启动过程
Linux 系统启动过程 Linux系统的启动过程可以分为5个阶段: BIOS自检 内核的引导. 运行init. 系统初始化. 用户登录系统. BIOS自检: BIOS是英文"Basic I ...
随机推荐
- Studio-----快捷键大全
Ctrl+Alt+Space 类名或接口名提示; 补充布局的提示: 26. Ctrl+Alt+Space是类名自动完成 Ctrl+X 删除行 Ctrl+D 复制行 Alt+回车 导入包,自动修正 Cr ...
- LPC1768之中断
一外中断:只有特定的4个外中断引脚, 1 在特定的引脚上,引脚功能要选对应的外中断功能 2设定的触发条件(高低电平.上升/下降沿) 3 NVIC设定,特定的通道. 二GPIO中断: 1只有GPIO0和 ...
- Log4j乱码
在log4j.properties里添加encoding , 例如 : log4j.appender.fuscent=org.apache.log4j.DailyRollingFileAppender ...
- Python进阶02 文本文件的输入输出
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有基本的文本文件读写功能.Python的标准库提供有更丰富的读写功能 ...
- [Java] java中的异常处理
Java中的异常类都继承自Throwable类.一个Throwable类的对象都可以抛出(throw). Throwable对象可以分为两组.一组是unchecked异常,异常处理机制往往不用于这组异 ...
- C#将C++动态库的回调函数封装成事件
关于C#调用C++动态库的文章很多,调用动态库中回调函数的方法也不在少数.但大多数调用回调函数的方法依然保留了C++的语法特点. 比如有一段C++的回调函数代码,为了表达它的意思,我把注释也粘贴了进来 ...
- CLOB和BLOB的区别
BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的的,或者可以直接用LOB字段代替这两个.但是为了更好的管理ORACLE数据库,通常像图 ...
- C语言程序设计50例(二)(经典收藏)
[程序11]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1 ...
- 自己的3dmax作品RX-105柯西高达
背后视角带导弹仓. 侧面. 侧后视角. 前侧视角. 斜前上视角 使用关联实现骨骼功能,头.躯干.肩.上臂.前臂.手腕.手指.腰.髋关节.踝关节.脚掌皆由骨骼(是通过多边形关联实现骨骼功能,而不是使用3 ...
- webpack基础+webpack配置文件常用配置项介绍+webpack-dev-server
一.webpack基础 1.在项目中生成package.json:在项目根目录中输入npm init,根据提示输入相应信息.(也可以不生成package.json文件,但是package.json是很 ...