CN111240765B - 一种linux压缩应用程序的加载方法 - Google Patents
一种linux压缩应用程序的加载方法 Download PDFInfo
- Publication number
- CN111240765B CN111240765B CN202010040067.3A CN202010040067A CN111240765B CN 111240765 B CN111240765 B CN 111240765B CN 202010040067 A CN202010040067 A CN 202010040067A CN 111240765 B CN111240765 B CN 111240765B
- Authority
- CN
- China
- Prior art keywords
- application program
- page
- file
- linux
- loading
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及应用程序压缩和加载领域,具体公开了一种LINUX压缩应用程序的加载方法,包括以下步骤:从存储区读取压缩文件,解压到系统缓存,解析应用程序文件,读取应用文件里面各个段和节表头的内容,计算各个段以及相关链接库占用内存的总长度,在当前进程创建一个新的线性区,通过清零为该线性区分配物理内存空间,将应用程序各个段的内容拷贝到该线性区,将应用程序链接的动态库加载到该线性区,释放压缩文件所占的缓存,找到加载的应用程序的函数入口地址,获取应用程序在线性区的偏移地址,跳转到该偏移地址执行,本发明能够实现将压缩的应用程序从存储区加载到内存,在程序加载完成后,避免产生额外的内存开销。
Description
技术领域
本发明涉及应用程序压缩和加载技术领域,尤其涉及一种LINUX压缩应用程序的加载方法。
背景技术
随着物联网技术的飞速发展,其应用也越来越多,因而设备上的应用程序也随之变得庞大,占用更多的存储空间。对应这个问题,一是直接升级硬件,扩大系统存储容量,二是将应用程序压缩后存储于系统的存储区。第一个方案比较直接,但会导致硬件成本增高。第二种方法能在不增加硬件成本的前提下达到同样的效果。
对于压缩程序的加载,很多方案通过不同的方式,将压缩程序文件解压到系统的缓存,然后直接将其加载运行。这会导致系统内存上多了一份应用程序的副本,占用了大量内存空间。这些方案是通过增大内存的开销来减少应用程序在存储区的占用,产生额外的内存开销。
发明内容
本发明的目的是为了解决现有技术中存在的将压缩程序文件解压到系统的缓存,然后直接将其加载运行会产生额外的内存开销的缺点,而提出的一种LINUX压缩应用程序的加载方法。
为了实现上述目的,本发明采用了如下技术方案:
一种LINUX压缩应用程序的加载方法,包括以下步骤:
步骤S1、从存储区读取压缩文件,并解压到系统缓存;
步骤S2、解析应用程序文件,读取应用程序文件里面各个段和节表头的内容,计算各个段以及相关链接库占用内存的总长度,然后在当前进程创建一个新的线性区,通过清零为该线性区分配物理内存空间,将应用程序各个段的内容拷贝到该线性区,并将应用程序链接的动态库加载到该线性区;
步骤S3、释放压缩文件所占的缓存;
步骤S4、找到加载的所述应用程序的函数入口地址,获取所述应用程序在线性区的偏移地址,并跳转到该偏移地址执行。
优选的,所述Linux进程启动之后拥有一个连续完整的线性地址空间,所述线性地址空间是分段的,包括数据段,代码段,bss段,堆,栈。
优选的,所述Linux下的目标文件和可执行文件都按照ELF格式进行存储。
优选的,所述ELF格式的文件包括ELF头、程序头表、节和节头表。
优选的,所述步骤S1中压缩文件采用无损压缩算法。
优选的,所述无损压缩算法包括BZIP2,GZIP,LZ4,LZMA,LZMO和XZ。
优选的,所述Linux创建进程时采用写时复制的方法,在加载进程时,采用按需加载的方法。
优选的,所述写时复制的方法是指父进程通过fork()系统调用创建子进程,子进程复制父进程的页目录和页表结构,同时将对应的物理页设为只读,当其中的一个进程在自己的虚拟地址范围内进行写操作的时候,就会产生异常,引起中断,中断处理函数就会在物理内存中再分配一个空闲页,并将引起异常的这个页的内容拷贝进去,并修改对应的页表项,同时将这两个页修改为可读写,使得这两个进程各自拥有一个物理页。
优选的,所述按需加载的方法是指在一个新进程后,execve系统删除进程原有的数据段和代码段占用的页表项,随后系统为加载进来的环境参数和命令行参数分配一定物理页和对应的页表,从程序的开始处执行、访问代码和数据的时候,引起缺页中断,中断处理将在内存中申请一页内存存放数据,并在设置页表中的对应的页表项,如果不存在页表的话,申请一页内存存放页表,最后将请求的代码或者数据以块为单位从磁盘上复制到内存中。
优选的,所述程序运行的过程中,进程的线性地址空间和程序文件始终保持映射关系。
本发明的有益效果是:
本发明提出的Linux压缩应用程序的加载方法,能够实现将压缩的应用程序从存储区加载到内存,并且在程序加载完成之后,内存上不会有多出来的应用程序的副本,避免产生额外的内存开销。
附图说明
为了使本发明的内容更容易被清楚的理解,下面根据本发明的具体实施例并结合附图,对本发明作进一步详细的说明,其中
图1是本发明一个实施例的一种LINUX压缩应用程序的加载方法的逻辑示意图
具体实施方式
为了便于理解本发明,下面将参照相关附图对本发明进行更全面的描述。附图中给出了本发明的较佳实施方式。但是,本发明可以以许多不同的形式来实现,并不限于本文所描述的实施方式。相反地,提供这些实施方式的目的是使对本发明的公开内容理解的更加透彻全面。
需要说明的是,当元件被称为“固定于”另一个元件,它可以直接在另一个元件上或者也可以存在居中的元件。当一个元件被认为是“连接”另一个元件,它可以是直接连接到另一个元件或者可能同时存在居中元件。本文所使用的术语“垂直的”、“水平的”、“左”、“右”以及类似的表述只是为了说明的目的,并不表示是唯一的实施方式。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述具体的实施方式的目的,不是旨在于限制本发明。本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。
实施例
请参照图1,一种LINUX压缩应用程序的加载方法,包括以下步骤:
步骤S1、从存储区读取压缩文件,并解压到系统缓存;
步骤S2、解析应用程序文件,读取应用文件里面各个段和节表头的内容,计算各个段以及相关链接库占用内存的总长度,然后在当前进程创建一个新的线性区,通过清零为该线性区分配物理内存空间,将应用程序各个段的内容拷贝到该线性区,并将应用程序链接的动态库加载到该线性区;
步骤S3、释放压缩文件所占的缓存;
步骤S4、找到加载的所述应用程序的函数入口地址,获取所述应用程序在线性区的偏移地址,并跳转到该偏移地址执行。
具体的,首先对Linux系统进行说明和介绍。
对于Linux进程线性地址空间的说明:
每个linux进程启动之后都会拥有一个连续完整的线性地址空间,这个空间的大小由操作系统的位数和CPU的地址总线宽度所决定。例如32位硬件平台的线性地址空间是4GB。这些空间并没有直接关联到物理内存,而是操作系统提供了内存的一种抽象概念,使得每个进程都有一个连续完整的地址空间,在程序的运行过程,再完成虚拟地址到物理地址的转换。这个地址空间是分段的,存在数据段,代码段,bss段,堆,栈等等。每个段都有特定的作用。
对于ELF文件的说明:
ELF是Executable and Linking Format的缩写,即可执行链接格式,最初由UNIX实验室开发发布的,作为应用程序二进制接口的一部分。Linux下的目标文件和可执行文件都按照该格式进行存储。ELF有四种不同的类型:
1)可重定位文件(Relocatable):编译器和汇编器产生的.o文件,需要被Linker进一步处理;
2)可执行文件(Executable):完成所有重新定位并解析所有符号(除了可能在运行时解析的共享库符号)的目标应用程序;
3)共享对象文件(Shared Object):即动态库文件(.so);
4)核心转储文件(Core File)。
ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program headertable)、节(Section)和节头表(Section header table)。一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。
最开头是16个字节的e_ident,其中包含用以表示ELF文件的字符,以及其他一些与机器无关的信息。开头的4个字节值固定不变,为0x7f和ELF三个字符。
e_type它标识的是该文件的类型。
e_machine表明运行该程序需要的体系结构。
e_version表示文件的版本。
e_entry程序的入口地址。本文的第四步将把当前进程的计数器地址跳转到该地址。
e_phoff表示Program header table在文件中的偏移量(以字节计数)。
e_shoff表示Section header table在文件中的偏移量(以字节计数)。
e_flags对IA32而言,此项为0。
e_ehsize表示ELF header大小(以字节计数)。
e_phentsize表示Program header table中每一个条目的大小。
e_phnum表示Program header table中有多少个条目。
e_shentsize表示Section header table中的每一个条目的大小。
e_shnum表示Section header table中有多少个条目。
e_shstrndx包含节名称的字符串是第几个节(从零开始计数)
Program header描述的是一个段在文件中的位置、大小以及它被放进内存后所在的位置和大小。
对Linux系统默认的应用程序加载过程的说明:
linux在创建进程时,采用写时复制(copy on write)的方法,在加载进程时,采用按需加载的方法。
写时复制的方法:父进程通过fork()系统调用创建子进程,子进程复制父进程的页目录和页表结构,同时将对应的物理页设为只读。当其中的一个进程在自己的虚拟地址范围内进行写操作的时候,就会产生异常,引起中断,中断处理函数就会在物理内存中再分配一个空闲页,并将引起异常的这个页的内容copy进去,并修改对应的页表项,同时将这两个页修改为可读写,这样这两个进程就各自拥有了一个物理页了。这就是写时复制机制。
按需加载的方法:在fork出一个新进程后,通常会伴随着execve系统调用,为这个进程加载内容。这个时候,execve会删除这个进程原有的数据段和代码段占用的页表项,随后系统会为加载进来的环境参数和命令行参数分配一定物理页和对应的页表。除此之外,这个进程的代码和数据没有占用物理内存的任何空间,它门还在磁盘上。但一旦从程序的开始处执行的时候,访问代码和数据的时候,就会发现它们没在内存中,这个时候就会引起缺页中断,中断处理会将在内存中申请一页内存存放数据,并在设置页表中的对应的页表项,如果不存在页表的话,还要申请一页内存存放页表,最后将请求的代码或者数据以块为单位从磁盘上复制到内存中。这就是需求加载机制。
在linux下执行某程序,通常采用如下方式:
Linux>./a.out
操作系统首先判断此命令并非shell命令,于是把它当做linux可执行文件处理。shell父进程调用fork,创建一个新进程,该新进程即为可执行文件的进程,fork调用完成后,新进程获得了新的页目录项,除此之外与shell父进程共享同一套页表结构。此时切换到新进程执行,执行execve系统调用,获取可执行文件的header信息,将其拷贝到主存中,并为之建立新的页表结构。通过header信息,建立新进程的进程地址空间与可执行文件的映射关系。此时新进程的进程地址空间视图中代码段、数据段仍为空,可执行文件相应的数据仍未拷贝到主存中,通过header中指定的执行程序入口,逐步将相应的段数据拷贝到主存中,并利用缺页中断位置建立相应的页表结构。除了一些header信息,在整个加载过程中没有任何从磁盘到主存的数据拷贝,直到CPU引用一个未被映射的虚拟页导致缺页中断的发生,才会进行拷贝,此时linux利用页框调度机制自动将页面从磁盘拷贝到主存储器中。
在程序运行的过程中,进程的线性地址空间和程序文件始终保持映射关系,如果此时强行将程序文件删除掉,程序就有可能在缺页中断时,无法将对应的页框从程序文件里拷贝到进程的线性地址空间中,进而导致不可预料的错误。
需要说明的是,本发明中加载器第一步所涉及的文件压缩方法需为无损压缩算法,Linux当前主要支持6种压缩算法:BZIP2,GZIP,LZ4,LZMA,LZMO和XZ。本文所述加载器使用的压缩算法包括但不限于这六种压缩算法。
本实施方式中,采用xz压缩算法,并在Linux系统上实施如下压缩程序的加载方法:
按照如上加载器的源码解析后实施的Linux压缩应用程序的加载方法后,目标应用程序已经开始运行,同时用于保存解压后应用程序文件的缓存也已经被全部释放。
本发明提出的Linux压缩应用程序的加载方法,能够实现将压缩的应用程序从存储区加载到内存,并且在程序加载完成之后,内存上不会有多出来的应用程序的副本,避免产生额外的内存开销。
显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。
Claims (9)
1.一种LINUX压缩应用程序的加载方法,其特征在于,包括以下步骤:
步骤S1、从存储区读取压缩文件,并解压到系统缓存;
步骤S2、解析应用程序文件,读取应用程序文件里面各个段和节表头的内容,计算各个段以及相关链接库占用内存的总长度,然后在当前进程创建一个新的线性区,通过清零为该线性区分配物理内存空间,将应用程序各个段的内容拷贝到该线性区,并将应用程序链接的动态库加载到该线性区;
步骤S3、释放压缩文件所占的缓存;
步骤S4、找到加载的所述应用程序的函数入口地址,获取所述应用程序在线性区的偏移地址,并跳转到该偏移地址执行;
其中,所述LINUX 创建进程时采用写时复制的方法,在加载进程时,采用按需加载的方法。
2.根据权利要求1所述的LINUX压缩应用程序的加载方法,其特征在于,所述LINUX 进程启动之后拥有一个连续完整的线性地址空间,所述线性地址空间是分段的,包括数据段,代码段,bss段,堆,栈。
3.根据权利要求1所述的LINUX压缩应用程序的加载方法,其特征在于,所述LINUX 下的目标文件和可执行文件都按照ELF格式进行存储。
4.根据权利要求3所述的LINUX压缩应用程序的加载方法,其特征在于,所述ELF格式的文件包括ELF头、程序头表、节和节头表。
5.根据权利要求1所述的LINUX压缩应用程序的加载方法,其特征在于,所述步骤S1中压缩文件采用无损压缩算法。
6.根据权利要求5所述的LINUX压缩应用程序的加载方法,其特征在于,所述无损压缩算法包括BZIP2,GZIP,LZ4,LZMA,LZMO和XZ。
7.根据权利要求6所述的LINUX压缩应用程序的加载方法,其特征在于,所述写时复制的方法是指父进程通过fork()系统调用创建子进程,子进程复制父进程的页目录和页表结构,同时将对应的物理页设为只读,当其中的一个进程在自己的虚拟地址范围内进行写操作的时候,就会产生异常,引起中断,中断处理函数就会在物理内存中再分配一个空闲页,并将引起异常的这个页的内容拷贝进去,并修改对应的页表项,同时将这两个页修改为可读写,使得这两个进程各自拥有一个物理页。
8.根据权利要求7所述的LINUX压缩应用程序的加载方法,其特征在于,所述按需加载的方法是指在一个新进程后,execve系统删除进程原有的数据段和代码段占用的页表项,随后系统为加载进来的环境参数和命令行参数分配一定物理页和对应的页表,从程序的开始处执行、访问代码和数据的时候,引起缺页中断,中断处理将在内存中申请一页内存存放数据,并在设置页表中的对应的页表项,如果不存在页表的话,申请一页内存存放页表,最后将请求的代码或者数据以块为单位从磁盘上复制到内存中。
9.根据权利要求1所述的LINUX压缩应用程序的加载方法,其特征在于,所述程序运行的过程中,进程的线性地址空间和程序文件始终保持映射关系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010040067.3A CN111240765B (zh) | 2020-01-15 | 2020-01-15 | 一种linux压缩应用程序的加载方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010040067.3A CN111240765B (zh) | 2020-01-15 | 2020-01-15 | 一种linux压缩应用程序的加载方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111240765A CN111240765A (zh) | 2020-06-05 |
CN111240765B true CN111240765B (zh) | 2023-02-03 |
Family
ID=70874560
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010040067.3A Active CN111240765B (zh) | 2020-01-15 | 2020-01-15 | 一种linux压缩应用程序的加载方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111240765B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114020709A (zh) * | 2021-09-29 | 2022-02-08 | 联想(北京)有限公司 | 文件处理方法及装置 |
CN114168224B (zh) * | 2021-12-06 | 2024-02-20 | 杭州筑龙信息技术股份有限公司 | 应用程序的启动方法、装置、电子设备及存储介质 |
CN117234963B (zh) * | 2023-11-14 | 2024-01-23 | 海马云(天津)信息技术有限公司 | 动态库处理方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6131192A (en) * | 1998-06-18 | 2000-10-10 | Microsoft Corporation | Software installation |
CN101246427A (zh) * | 2007-02-15 | 2008-08-20 | 凌阳科技股份有限公司 | 应用程序可重定位加载的方法及地址重定位装置 |
CN106126241A (zh) * | 2016-06-29 | 2016-11-16 | 上海友衷科技有限公司 | 一种Linux系统启动方法及系统 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7536683B2 (en) * | 1999-01-15 | 2009-05-19 | Adobe Systems Incorporated | Method of dynamically appending a library to an actively running program |
CN101470619A (zh) * | 2007-12-29 | 2009-07-01 | 安凯(广州)软件技术有限公司 | 一种基于微核操作系统的应用程序动态加载方法 |
CN101706754A (zh) * | 2009-09-08 | 2010-05-12 | 厦门敏讯信息技术股份有限公司 | 嵌入式系统中连续物理内存分配方法和装置 |
CN108427571A (zh) * | 2018-02-07 | 2018-08-21 | 深圳市雁联计算系统有限公司 | 一种动态链接库更新方法及服务器 |
-
2020
- 2020-01-15 CN CN202010040067.3A patent/CN111240765B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6131192A (en) * | 1998-06-18 | 2000-10-10 | Microsoft Corporation | Software installation |
CN101246427A (zh) * | 2007-02-15 | 2008-08-20 | 凌阳科技股份有限公司 | 应用程序可重定位加载的方法及地址重定位装置 |
CN106126241A (zh) * | 2016-06-29 | 2016-11-16 | 上海友衷科技有限公司 | 一种Linux系统启动方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111240765A (zh) | 2020-06-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111240765B (zh) | 一种linux压缩应用程序的加载方法 | |
JP5255348B2 (ja) | クラッシュダンプ用のメモリアロケーション | |
EP0870235B1 (en) | Apparatus and method for preprocessing computer programs prior to transmission across a network | |
EP1588265B1 (en) | Method and apparatus for morphing memory compressed machines | |
US6496882B2 (en) | Method and system for virtual memory compression in an embedded system | |
US8176142B2 (en) | Shared JAVA jar files | |
JP4601665B2 (ja) | 条件付で実行可能モジュールを縮小するシステムおよび方法 | |
EP1580664B1 (en) | Computing device with relatively limited storage space and operating / file system thereof | |
JP2007501450A (ja) | コンピュータ装置のデータにアクセスする方法 | |
US7676800B2 (en) | Method and apparatus for reducing the storage overhead of portable executable (PE) images | |
US6195107B1 (en) | Method and system for utilizing virtual memory in an embedded system | |
JP2007535241A5 (zh) | ||
US8788799B2 (en) | Server computer, computer system, and file management method | |
EP1899799A2 (en) | Storage architecture for embedded systems | |
EP3446221A1 (en) | Adapted block translation table (btt) | |
US8131918B2 (en) | Method and terminal for demand paging at least one of code and data requiring real-time response | |
CN102792296B (zh) | 移动终端中请求页面调度方法、控制器以及移动终端 | |
CN115640078B (zh) | 基于虚拟文件系统数据智能预取的安卓应用加载优化方法 | |
US20220276889A1 (en) | Non fragmenting memory ballooning | |
CN115292721A (zh) | 一种安卓兼容环境适配多Linux内核的启动方法 | |
JP4504756B2 (ja) | Java(登録商標名)実行環境におけるメモリ管理方法及びメモリ管理プログラム | |
US20050289288A1 (en) | Compression and decompression of expansion read only memories | |
Noble et al. | Patterns for managing limited memory | |
JP6080491B2 (ja) | 情報処理装置、起動方法およびプログラム | |
WO2010113380A1 (ja) | 計算機システム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |