一种加快Linux内核启动的自解压阶段的方法与流程

文档序号:25037569发布日期:2021-05-11 17:10阅读:423来源:国知局
一种加快Linux内核启动的自解压阶段的方法与流程

本发明涉及linux系统领域,特别涉及一种加快linux内核启动的自解压阶段的方法。



背景技术:

随着科学技术的不断发展,人们对计算机操作系统特别是linux的应用越来越普遍。通常简单地说,linux内核启动过程是通过引导程序先把flash中存储的zimage全部加载到ram中,然后解压ram中的zimage为vmlinux,最后执行vmlinux,其中的加载和解压是串行完成,如图1所示。

在linux内核启动过程中一般能看到如图2所示的内核自解压界面,下面是内核的自解压过程。通常,内核压缩和解压缩代码都在目录kernel/arch/arm/boot/compressed,编译完成后将产生head.o、misc.o、piggy.gzip.o、vmlinux、decompress.o这几个文件,head.o是内核的头部文件,负责初始设置;misc.o将主要负责内核的解压工作,它在head.o之后;piggy.gzip.o是一个中间文件,其实是一个压缩的内核(kernel/vmlinux),只不过没有和初始化文件及解压文件链接而已;vmlinux是没有(zimage是压缩过的内核)压缩过的内核,就是由piggy.gzip.o、head.o、misc.o组成的,而decompress.o是为支持更多的压缩格式而新引入的。

在bootloader完成系统的引导以后并将linux内核调入内存之后,调用do_bootm_linux(),这个函数将跳转到kernel的起始位置。如果kernel没有被压缩,就可以启动了。如果kernel被压缩过,则要进行解压,在压缩过的kernel头部有解压程序。压缩过的kernel入口第一个文件源码位置在arch/arm/boot/compressed/head.s。它将调用函数decompress_kernel(),这个函数在文件arch/arm/boot/compressed/misc.c中,decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置,然后打印出信息“uncompressinglinux...”后,调用gunzip()将内核放于指定的位置。

压缩过程,也就是函数decompress_kernel实现的功能:解压缩代码位于kernel/lib/inflate.c,inflate.c是从gzip源程序中分离出来的,包含了一些对全局数据的直接引用,在使用时需要直接嵌入到代码中。gzip压缩文件时总是在前32k字节的范围内寻找重复的字符串进行编码,在解压时需要一个至少为32k字节的解压缓冲区,它定义为window[wsize]。inflate.c使用get_byte()读取输入文件,它被定义成宏来提高效率。输入缓冲区指针必须定义为inptr,inflate.c中对之有减量操作。inflate.c调用flush_window()来输出window缓冲区中的解压出的字节串,每次输出长度用outcnt变量表示。在flush_window()中,还必须对输出字节串计算crc并且刷新crc变量。在调用gunzip()开始解压之前,调用makecrc()初始化crc计算表。gunzip()返回0表示解压成功。

因此,通常linux内核启动过程中的加载和解压是串行完成的,相对于并行完成串行所需要的时间更长,执行串行的设计一定程度上浪费了时间,不适应日益高效的工作节奏。

目前,本领域的技术术语包括:

linux:是一套免费使用和自由传播的类unix操作系统,是一个基于posix和unix的多用户、多任务、支持多线程和多cpu的操作系统。

操作系统内核:操作系统内核是指大多数操作系统的核心部分。它由操作系统中用于管理存储器、文件、外设和系统资源的那些部分组成。

zimage:linux内核的压缩文件。

vmlinux:解压后的linux内核执行文件。vmlinux文件生成,这个文件必然是核心的linux内核,但是它是elf格式的文件,其中包含了可执行的二进制指令(内核),调试信息,符号表等内容。vmlinux的生成是编译内核的关键,但是得到的vmlinux文件是不能烧写到flash中执行的。主要的问题是,没有一个环境来加载elf格式的文件。而zimage则是可以加载执行的二进制代码。

flash:闪存是一种非易失性(non-volatile)内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

ram:也叫主存,是与cpu直接交换数据的内部存储器。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。



技术实现要素:

为了解决上述问题,本发明的目的在于克服现有技术的不足,提供了一种加快linux内核启动的方法,缩短了linux内核加载解压过程的时间。

具体地,提供一种加快linux内核启动的自解压阶段的方法,包括以下步骤:

s1,确认flash中存储的zimage被分解成n块,其中,n为正整数;

s2,加载并行解压步骤:

s2.1,将第1个zimage块(zimage-1)从flash中加载到ram中;

s2.2,将第2个zimage块(zimage-2)从flash中加载到ram中,同时并行将已经加载到ram中的上一步骤s2.1中的第1个zimage块进行解压;

......以此类推,

s2.n,将第n个zimage块(zimage-n)从flash中加载到ram中,同时并行将已经加载到ram中的上一步骤s2.n-1中的第n-1个zimage块进行解压;

s2.n+1,将已经加载到ram中的第n个zimage块进行解压;

s3,还原文件步骤:ram中的第1个zimage块(zimage-1),第2个zimage块(zimage-2),......,第n个zimage块(zimage-n)解压后分别对应的是vmlinux-1,vmlinux-2,......,vmlinux-n,将vmlinux-1,vmlinux-2,......,vmlinux-n合并还原为vmlinux文件;

s4,完成解压步骤:执行vmlinux文件,完成自解压阶段。

所述的加载的任务由flash控制器完成,所述的解压的任务由cpu完成。

完成1块zimage的加载时间大于解压时间。

在并行执行所需的时间是加载时间t1与第n块zimage的解压时间t2-n的总和。

所述步骤s1中,每块zimage可独立加载到ram中。

所述步骤s3中的合并还原是增加一段合并连接模块,将所述的vmlinux-1,vmlinux-2,......,vmlinux-n重新合并成一个vmlinux文件。

所述的一段合并连接模块是将vmlinux-1,vmlinux-2,......,vmlinux-n按顺序连接成一个vmlinux文件。

由此,本申请的优势在于:linux内核启动过程中通过拆分还原的方法,linux内核启动的并行完成自解压,从而缩短linux内核启动中自解压阶段的时间,大大提高了效率。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。

图1是本发明涉及的现有技术的示意框图。

图2是本发明涉及的现有技术的解压内核的程序界面示意图。

图3是本发明涉及的方法中加载并行解压步骤的示意框图。

图4是现有技术和本发明所用时间比较的示意流程图。

图5是本发明的实施例具体方法的整个流程的示意图。

具体实施方式

为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。

在flash中存储的zimage被分解成n块,每块可独立加载到ram中,在加载完第1块后可并行解压之前加载到ramzimage块,如图3所示。加载和解压可以并行执行原因是加载的任务主要由flash控制器完成,解压的任务由cpu完成。

如图5所示,提供一种加快linux内核启动的自解压阶段的方法,包括以下步骤:

s1,确认flash中存储的zimage被分解成n块,其中,n为正整数,且通常情况下,n为大于2且并不太大的正整数,例如,9或10;

s2,加载并行解压步骤:

s2.1,将第1个zimage块(zimage-1)从flash中加载到ram中,每块zimage可独立加载到ram中;

s2.2,将第2个zimage块(zimage-2)从flash中加载到ram中,同时并行将已经加载到ram中的上一步骤s2.1中的第1个zimage块进行解压;

......以此类推,

s2.n,将第n个zimage块(zimage-n)从flash中加载到ram中,同时并行将已经加载到ram中的上一步骤s2.n-1中的第n-1个zimage块进行解压;

s2.n+1,将已经加载到ram中的第n个zimage块进行解压;

s3,还原文件步骤:ram中的第1个zimage块(zimage-1),第2个zimage块(zimage-2),......,第n个zimage块(zimage-n)解压后分别对应的是vmlinux-1,vmlinux-2,......,vmlinux-n,将vmlinux-1,vmlinux-2,......,vmlinux-n合并还原为vmlinux文件;

s4,完成解压步骤:执行vmlinux文件,完成自解压阶段。

所述步骤s3中的合并还原是增加一段合并连接模块,将所述的vmlinux-1,vmlinux-2,......,vmlinux-n重新合并成一个vmlinux文件。所述的一段合并连接模块是将vmlinux-1,vmlinux-2,......,vmlinux-n按顺序连接成一个vmlinux文件。例如,可以采用merge()函数,首先设置要合并的文件所在目录,用来获取需要合并的文件集合;然后设置合并后文件存放的位置;再获取需要合并的文件集合;最后循环每一个文件,合并到一个文件中,也可将读取出来的文件,采用追加的方式添加到文件中。

如图4所示,通常完成1块zimage的加载时间要大于解压时间,通过图4分析在并行执行所需的时间是加载时间t1与第n块的解压时间t2-n,而串行执行的时间是加载时间t1和解压时间t2,所以并行执行相对与串行执行可减少1到n-1块的解压时间。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1