CN107479920B - 一种单elf文件实现多操作系统加载的方法 - Google Patents
一种单elf文件实现多操作系统加载的方法 Download PDFInfo
- Publication number
- CN107479920B CN107479920B CN201710661884.9A CN201710661884A CN107479920B CN 107479920 B CN107479920 B CN 107479920B CN 201710661884 A CN201710661884 A CN 201710661884A CN 107479920 B CN107479920 B CN 107479920B
- Authority
- CN
- China
- Prior art keywords
- operating system
- elf file
- loading
- flash
- loading program
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种单ELF文件实现多操作系统加载的方法,其将同一操作系统的多份ELF文件以及加载程序ELF文件转化为单一ELF文件,该单一ELF文件可被一次性烧入FLASH中,并可一次性从FLASH被加载到内存中,从而使得加载程序在选择待加载操作系统时,不需要从FLASH中读取操作系统,即不需要包含FLASH驱动,最大程度减少了加载程序的体积,从而减少因加载程序自身所处的FLASH区错误而无法加载任何系统的概率。本发明可应用于在复杂环境,特别是FLASH易产生坏块或位反转的环境中实现多操作系统。
Description
技术领域
本发明属于嵌入式操作系统技术领域,具体涉及一种单ELF文件实现多操作系统加载的方法。
背景技术
ELF(Executable and Linkable Format)文件是一种可执行文件的格式,其包含了编译生成的二进制数据以及一些必要的段信息、符号表等信息,在嵌入式领域,ELF文件常作为最终编译生成的可烧写文件格式用于程序烧写及加载。
嵌入式多操作系统备份技术是指在一个嵌入式系统上安装多个操作系统,并利用加载程序加载合适的操作系统实例运行的技术,多种操作系统可以是同种操作系统,也可以是多种不同的系统,利用多操作系统技术可以实现操作系统冗余,这在一些FLASH易产生坏块的环境十分重要,可以有效防止FALSH坏块导致的整个嵌入式系统无法运行的情况。
传统实现多操作系统的方法主要是通过将FLASH进行分区,在不同分区事先安装好各个操作系统,然后加载程序通过外部指示或根据上一次系统异常的情况从FLASH中加载对应分区的操作系统进行运行;但传统方法采用的加载程序需包含FLASH驱动,故使得自身代码体积较大,且当加载程序自身所处的FLASH区出现错误时,则无法加载相应的操作系统。
发明内容
鉴于上述,本发明提供了一种单ELF文件实现多操作系统加载的方法,能够最大程度减少加载程序自身的代码体积,减少因加载程序自身所处的FLASH区错误而无法加载任何系统的概率。
一种单ELF文件实现多操作系统加载的方法,包括如下步骤:
(1)将各操作系统的ELF文件转换成C结构体数组;
(2)将各操作系统的C结构体数组与加载程序一同编译成单个ELF文件,并将该ELF文件烧入至FLASH中;
(3)利用单个ELF文件中的加载程序在内存中对预加载的操作系统进行重定位,使其正常运行从而完成加载。
进一步地,所述步骤(1)的具体实现过程为:首先,对各操作系统的ELF文件进行转化,即将其中有数据内容的各个段(如TEXT段、DATE段、RODATE段)内的二进制数据转化为C语言字节数组;然后,将ELF文件中关于这些段的核心信息(如加载地址、段大小等)抽取出来与C语言字节数组一起生成C结构体;最后,将同一操作系统各个段的C结构体组合在一起形成C结构体数组。
进一步地,所述步骤(2)中将各操作系统的C结构体数组加入至加载程序的源码树中,从而使得加载程序可以访问到所有操作系统的各段信息及内容,进而将加载程序与各C结构体数组一同编译成单个ELF文件烧入至FLASH中。
进一步地,所述步骤(3)中当系统加载时,将所述单个ELF文件从FLASH加载入内存中并跳转至该ELF文件中加载程序的入口地址,利用加载程序根据预加载的操作系统将其内容根据C结构体中记录的信息进行重定位,并跳转至该ELF文件中对应操作系统的入口地址,从而在内存中完成操作系统的加载。
本发明方法将操作系统ELF文件各个段的信息与内容转化为C语言结构体的表达方式,从而可以利用C语言对各个段进行编译处理,将加载程序与预加载的多个操作系统一起编译成单一ELF文件,对外表现为一个程序,FLASH不需要针对多个操作系统进行分区,而是将该单一ELF文件直接烧在FLASH的一个连续区域中;系统加载后固件将一次性将加载程序以及多个操作系统的内容全部从FLASH拷贝到内存中,从而不需要操作系统加载程序再去外存读取相应操作系统,加载程序不再需要包含FLASH驱动,而是直接从内存中读取对应操作系统的各个段内容以及加载信息,直接在内存中对其进行重定位,从而实现系统加载。
由此可见,本发明方法可以实现多个操作系统选择性加载,且加载程序无需包含FLASH驱动,只需要通过直接内存拷贝进行操作系统各段重定位即可完成加载,这使得加载程序的体积大大减小,进而也减少因加载程序自身所处的FLASH区错误而无法加载任何系统的概率。
附图说明
图1为本发明方法中ELF文件转C结构体的流程示意图。
图2为本发明方法中加载操作系统的流程示意图。
具体实施方式
为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。
为了最大程度减少加载程序自身的代码体积,本发明提供了一种单ELF文件实现多操作系统加载的方法,其采用的技术方案如下:
首先,设计一个工具程序对各个操作系统的ELF文件进行转化,将其中有数据内容的各个段(如TEXT段、DATE段、RODATE段)内的二进制内容转化为C语言字节数组,然后将ELF文件中关于这些段的核心信息(如加载地址、段大小等信息)抽取出来与C字节数组一起生成C结构体,用于表示一个操作系统中一个段的信息与内容;再将同一操作系统的各个段组合在一起形成结构体数组,用于表示整个操作系统的二进制内容及各个段的信息,这样我们就把操作系统的二进制内容及各个段信息从ELF文件格式转化成了C源码的组织方式,可用于二次开发。
然后,将生成的C源码加入加载程序的源码树中,从而使得加载程序的代码可以访问到所有操作系统的各段信息及内容;进而将写好的加载程序与生存的C源码一同编译成单个ELF文件,并将该ELF文件作为单一程序烧入FLASH。
加载时,固件将该单个ELF文件内容从FLASH加载入内存并跳到ELF中加载程序入口地址,加载程序根据具体需要加载的操作系统将其内容根据结构体中记录的信息进行重定位,并跳到操作系统入口地址,从而在内存中完成操作系统的加载。
以下实施例采用C6747平台,所有操作系统使用浙江大学ESE工程中心研发的Smart OS实时系统,利用上述技术方案实现双操作系统加载,具体流程为:
(1)首先设计了一个工具程序,该程序将可以将操作系统ELF文件转化为类似以下C语言数据结构,可参见图1。
上述是工具生成的text段的二进制字节数组,由于内容过多,为了说明方便,省略了其中一部分。
上述生成的结构体中包含该操作系统的入口地址、段数目、各段的二进制字节数组以及各段的加载地址、段大小。
(2)加载程序只需要根据具体情况将对应的操作系统各个段进行重定位即可。
上述根据情况选择要加载的操作系统,利用bin_load加载,利用bin_go跳转到操作系统入口运行操作系统。
bin_load循环将各段拷贝到内存的对应位置。
bin_go根据操作系统入口地址进行跳转。
(3)将该程序编译生成ELF文件,烧入C6747的FLASH中,上电后C6747自带的固件就会将该ELF文件从FLASH加载到内存中,而加载程序则会根据上述代码的原理进行操作系统的加载,具体可参见图2所示的加载流程。
上述对实施例的描述是为便于本技术领域的普通技术人员能理解和应用本发明。熟悉本领域技术的人员显然可以容易地对上述实施例做出各种修改,并把在此说明的一般原理应用到其他实施例中而不必经过创造性的劳动。因此,本发明不限于上述实施例,本领域技术人员根据本发明的揭示,对于本发明做出的改进和修改都应该在本发明的保护范围之内。
Claims (1)
1.一种单ELF文件实现多操作系统加载的方法,包括如下步骤:
(1)将各操作系统的ELF文件转换成C结构体数组,具体实现过程为:首先,对各操作系统的ELF文件进行转化,即将其中有数据内容的各个段内的二进制数据转化为C语言字节数组;然后,将ELF文件中关于这些段的核心信息抽取出来与C语言字节数组一起生成C结构体;最后,将同一操作系统各个段的C结构体组合在一起形成C结构体数组;
(2)将各操作系统的C结构体数组与加载程序一同编译成单个ELF文件,并将该ELF文件烧入至FLASH中;即将各操作系统的C结构体数组加入至加载程序的源码树中,从而使得加载程序可以访问到所有操作系统的各段信息及内容,进而将加载程序与各C结构体数组一同编译成单个ELF文件烧入至FLASH中;
(3)利用单个ELF文件中的加载程序在内存中对预加载的操作系统进行重定位,使其正常运行从而完成加载;即当系统加载时,将所述单个ELF文件从FLASH加载入内存中并跳转至该ELF文件中加载程序的入口地址,利用加载程序根据预加载的操作系统将其内容根据C结构体中记录的信息进行重定位,并跳转至该ELF文件中对应操作系统的入口地址,从而在内存中完成操作系统的加载。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710661884.9A CN107479920B (zh) | 2017-08-04 | 2017-08-04 | 一种单elf文件实现多操作系统加载的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710661884.9A CN107479920B (zh) | 2017-08-04 | 2017-08-04 | 一种单elf文件实现多操作系统加载的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107479920A CN107479920A (zh) | 2017-12-15 |
CN107479920B true CN107479920B (zh) | 2020-05-29 |
Family
ID=60597593
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710661884.9A Active CN107479920B (zh) | 2017-08-04 | 2017-08-04 | 一种单elf文件实现多操作系统加载的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107479920B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117421056B (zh) * | 2023-12-18 | 2024-03-05 | 美智纵横科技有限责任公司 | 系统加载方法及装置、存储介质、计算机程序产品和芯片 |
CN117435257B (zh) * | 2023-12-18 | 2024-02-27 | 美智纵横科技有限责任公司 | 系统加载方法及装置、存储介质、计算机程序产品和芯片 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101334737A (zh) * | 2008-07-31 | 2008-12-31 | 深圳市同洲电子股份有限公司 | 一种嵌入式设备的启动或复位方法 |
CN101452402A (zh) * | 2008-11-28 | 2009-06-10 | 珠海金山软件股份有限公司 | 软件运行系统和软件运行方法 |
CN102609284A (zh) * | 2012-02-01 | 2012-07-25 | 上海游安网络科技有限公司 | 可执行文件安全加载的方法 |
CN103824018A (zh) * | 2012-11-19 | 2014-05-28 | 腾讯科技(深圳)有限公司 | 一种可执行文件处理方法以及可执行文件监控方法 |
CN105335656A (zh) * | 2015-11-02 | 2016-02-17 | 南京大学 | 基于二进制改写和动态随机化的软件安全增强方法 |
-
2017
- 2017-08-04 CN CN201710661884.9A patent/CN107479920B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101334737A (zh) * | 2008-07-31 | 2008-12-31 | 深圳市同洲电子股份有限公司 | 一种嵌入式设备的启动或复位方法 |
CN101452402A (zh) * | 2008-11-28 | 2009-06-10 | 珠海金山软件股份有限公司 | 软件运行系统和软件运行方法 |
CN102609284A (zh) * | 2012-02-01 | 2012-07-25 | 上海游安网络科技有限公司 | 可执行文件安全加载的方法 |
CN103824018A (zh) * | 2012-11-19 | 2014-05-28 | 腾讯科技(深圳)有限公司 | 一种可执行文件处理方法以及可执行文件监控方法 |
CN105335656A (zh) * | 2015-11-02 | 2016-02-17 | 南京大学 | 基于二进制改写和动态随机化的软件安全增强方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107479920A (zh) | 2017-12-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2005032259A (ja) | 共有ライブラリーシステム及び前記システム構築方法 | |
CN102156661B (zh) | 在线补丁的激活方法、装置及系统 | |
US20080072211A1 (en) | Method and system for firmware image size reduction | |
CN105164641A (zh) | 扩展开发环境 | |
CN111061638B (zh) | 一种iOS系统调试的方法、装置及服务器 | |
KR20190104329A (ko) | 내장형 라운딩 규칙을 갖는 부동 소수점 명령어 포맷 | |
CN105224370A (zh) | 一种加载elf文件的方法和装置 | |
CN103440156A (zh) | 一种能用于多种系统下的Linux软件包制作方法 | |
CN107479920B (zh) | 一种单elf文件实现多操作系统加载的方法 | |
CN102141923B (zh) | 内存文件系统加载方法及装置 | |
CN102147743A (zh) | 加快嵌入式系统应用程序启动速度的方法 | |
CN107357622B (zh) | 热补丁实现方法及通信设备 | |
CN101763273B (zh) | 一种在嵌入式系统的扩展存储器中动态装入代码的方法 | |
CN103218428B (zh) | 一种动态链接方法及系统 | |
CN106201608A (zh) | 计算机uefi固件更新方法 | |
CN103218262A (zh) | 在线补丁的激活方法、装置及系统 | |
CN101334737A (zh) | 一种嵌入式设备的启动或复位方法 | |
CN105677348A (zh) | 一种boot程序的存储方法及装置、启动方法及装置 | |
CN112394928B (zh) | 一种嵌入式系统中多级菜单构建方法与计算机存储介质 | |
CN105874429A (zh) | 用于将代码注入到应用程序中的系统和方法 | |
CN108897576A (zh) | 一种基于arm芯片的快速启动boot的方法 | |
US10445074B2 (en) | Method of optimally compiling PLC command | |
CN105824750A (zh) | 一种在NorFlash程序空间调试的软断点模拟方法 | |
CN103077066A (zh) | 一种编译时嵌入产品关键信息的方法和系统 | |
CN112199121A (zh) | Dsp按需扩容加载程序方法 |
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 |