CN108255526B - 一种系统启动及运行的方法、装置 - Google Patents

一种系统启动及运行的方法、装置 Download PDF

Info

Publication number
CN108255526B
CN108255526B CN201611244019.6A CN201611244019A CN108255526B CN 108255526 B CN108255526 B CN 108255526B CN 201611244019 A CN201611244019 A CN 201611244019A CN 108255526 B CN108255526 B CN 108255526B
Authority
CN
China
Prior art keywords
codes
segment
sub
memory
code
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
Application number
CN201611244019.6A
Other languages
English (en)
Other versions
CN108255526A (zh
Inventor
吴宏雷
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sanechips Technology Co Ltd
Original Assignee
Sanechips Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Sanechips Technology Co Ltd filed Critical Sanechips Technology Co Ltd
Priority to CN201611244019.6A priority Critical patent/CN108255526B/zh
Priority to EP17886706.5A priority patent/EP3564814A4/en
Priority to PCT/CN2017/082283 priority patent/WO2018120548A1/zh
Publication of CN108255526A publication Critical patent/CN108255526A/zh
Application granted granted Critical
Publication of CN108255526B publication Critical patent/CN108255526B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0862Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping
    • G06F9/4403Processor initialisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping
    • G06F9/4406Loading of operating system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44557Code layout in executable memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0238Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
    • G06F12/0246Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory in block erasable memory, e.g. flash memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0804Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with main memory updating
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/12Replacement control
    • G06F12/121Replacement control using replacement algorithms
    • G06F12/126Replacement control using replacement algorithms with special data handling, e.g. priority of data or instructions, handling errors or pinning

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Memory System (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种系统启动及运行的方法及装置,所述方法包括:将存储设备划分成多个存储区,将系统代码划分成多个段代码;将所述多个段代码存储至所述存储设备中对应的存储区中;启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行。

Description

一种系统启动及运行的方法、装置
技术领域
本发明涉及通信终端的系统启动运行技术,尤其涉及一种系统启动及运行的方法、装置。
背景技术
有些嵌入式芯片具有很小且分布怪异的地址空间。一个几十K或者几百K的地址空间可能会包括高速的片内随机存取存储器(RAM,Ramdom Access Memory),低速的片外RAM。也可能会存在多个不连续的RAM区域,比如有的嵌入式芯片存在多个几十K或者几百K的不连续地址空间,每个地址空间都包括高速的片内RAM,低速的片外RAM。
面对这种分布怪异且很小的内存地址空间,传统的系统是无法加载到内存运行的。这是因为传统的系统一般加载的地址和运行的地址是连续的,并且代码的大小大于内存容量。基于此,如何把操作系统挤入容量更小和地址不连续的内存运行是有待解决的问题。
发明内容
为解决上述技术问题,本发明实施例提供了一种系统启动及运行的方法、装置。
本发明实施例提供的系统启动及运行的方法,包括:
将存储设备划分成多个存储区,将系统代码划分成多个段代码;
将所述多个段代码存储至所述存储设备中对应的存储区中;
启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行。
本发明实施例中,所述将存储设备划分成多个存储区,将系统代码划分成多个段代码,包括:
将存储设备划分成如下存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区;
将系统代码划分成如下段代码:一级启动段代码、通用段代码、异常中断处理段代码、二级启动段代码、调度运行段代码、高速运行段代码和功能段代码。
本发明实施例中,所述将系统代码划分成多个段代码,还包括:
将所述功能段代码按照功能划分成多个子段代码,其中,每个子段代码对应一个功能。
本发明实施例中,所述方法还包括:
根据子段代码的使用频率和/或使用时间指标为各个所述子段代码设置相应的优先级。
本发明实施例中,所述功能段代码中的子段代码满足以下至少之一:
在子段代码中使用局部变量;
将常量存放在子段代码中,伴随子段代码进出内存;
不同子段代码之间无引用关系;
子段代码之间的引用关系所确定出的子段代码总容量小于等于空闲的内存容量;
不同子段代码之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址,其中,所述函数指针数组钩子存放至所述通用段代码中,所述指针数组钩子由所述调度运行段代码管理。
本发明实施例中,将所述多个段代码存储至所述存储设备中对应的存储区时,将各个段代码以及子段代码按照页对齐的方式进行存储。
本发明实施例中,启动系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行,包括:
将所述一级启动段代码复制至内置内存中;
运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;
运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;
运行所述通用段代码,从而初始化系统,完成系统启动。
本发明实施例中,运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行,包括:
系统启动后,运行所述调度运行段代码,按照预设策略调度所述功能段代码中的子段代码至内存中运行。
本发明实施例中,所述方法还包括:
系统启动时,将优先级高于第一门限值的子段代码加载至内存中;
系统运行时,将待被调用的子段代码加载至内存中。
本发明实施例中,按照预设策略调度所述功能段代码中的子段代码至内存,包括:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,建立内存管理单元中的地址映射表;
判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
本发明实施例中,按照预设策略调度所述功能段代码中的子段代码至内存,包括:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
重定位所述子段代码至内存;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
本发明实施例中,所述方法还包括:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
删除内存管理单元中的地址映射表;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
本发明实施例中,所述方法还包括:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
本发明实施例中,所述方法还包括:
启动系统时,清除虚拟内存区的数据;
在内存不足的情况下,将优先级小于第二门限值的子段代码存入所述虚拟内存区,并释放相应的内存空间;清除内存空间并删除内存管理单元中的地址映射表或者清除内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;标记所述虚拟内存区的使用信息;将所述子段代码标记为已导出;
在内存足够的情况下,判断虚拟内存区是否有子段代码需要加载;如果有子段代码需要加载,则判断所述子段代码是否已经加载至内存;如果所述子段代码没有加载至内存,则建立内存管理单元中的地址映射表并分配内存空间以及加载所述子段代码至内存,或者分配内存空间并通过重定位方式加载所述子段代码至内存;在通用段代码的函数指针数组中添加相应的函数钩子;清除所述虚拟内存区中的所述子段代码以及所述虚拟内存区的使用信息;将所述子段代码标记为已经加载。
本发明实施例提供的系统启动及运行的装置,包括:
划分单元,用于将存储设备划分成多个存储区,将系统代码划分成多个段代码;
存储单元,用于将所述多个段代码存储至所述存储设备中对应的存储区中;
处理单元,用于启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行。
本发明实施例中,所述划分单元,具体用于:将存储设备划分成如下存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区;
将系统代码划分成如下段代码:一级启动段代码、通用段代码、异常中断处理段代码、二级启动段代码、调度运行段代码、高速运行段代码和功能段代码。
本发明实施例中,所述划分单元,具体用于:将所述功能段代码按照功能划分成多个子段代码,其中,每个子段代码对应一个功能。
本发明实施例中,所述装置还包括:
设置单元,用于根据子段代码的使用频率和/或使用时间指标为各个所述子段代码设置相应的优先级。
本发明实施例中,所述功能段代码中的子段代码满足以下至少之一:
在子段代码中使用局部变量;
将常量存放在子段代码中,伴随子段代码进出内存;
不同子段代码之间无引用关系;
子段代码之间的引用关系所确定出的子段代码总容量小于等于空闲的内存容量;
不同子段代码之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址,其中,所述函数指针数组钩子存放至所述通用段代码中,所述指针数组钩子由所述调度运行段代码管理。
本发明实施例中,将所述多个段代码存储至所述存储设备中对应的存储区时,将各个段代码以及子段代码按照页对齐的方式进行存储。
本发明实施例中,所述处理单元,具体用于:将所述一级启动段代码复制至内置内存中;运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;运行所述通用段代码,从而初始化系统,完成系统启动。
本发明实施例中,所述处理单元,具体用于:系统启动后,运行所述调度运行段代码,按照预设策略调度所述功能段代码中的子段代码至内存中运行。
本发明实施例中,所述处理单元,还用于系统启动时,将优先级高于第一门限值的子段代码加载至内存中;系统运行时,将待被调用的子段代码加载至内存中。
本发明实施例中,所述处理单元包括:第一加载子单元,用于执行如下流程:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,建立内存管理单元中的地址映射表;
判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
本发明实施例中,所述处理单元包括:第二加载子单元,用于执行如下流程:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
重定位所述子段代码至内存;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
本发明实施例中,所述处理单元包括:第一删除子单元,用于执行如下流程:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
删除内存管理单元中的地址映射表;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
本发明实施例中,所述处理单元包括:第二删除子单元,用于执行如下流程:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
本发明实施例中,所述处理单元还包括:
清除子单元,用于启动系统时,清除虚拟内存区的数据;
导出子单元,用于在内存不足的情况下,将优先级小于第二门限值的子段代码存入所述虚拟内存区,并释放相应的内存空间;清除内存空间并删除内存管理单元中的地址映射表或者清除内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;标记所述虚拟内存区的使用信息;将所述子段代码标记为已导出;
第三加载子单元,用于在内存足够的情况下,判断虚拟内存区是否有子段代码需要加载;如果有子段代码需要加载,则判断所述子段代码是否已经加载至内存;如果所述子段代码没有加载至内存,则建立内存管理单元中的地址映射表并分配内存空间以及加载所述子段代码至内存,或者分配内存空间并通过重定位方式加载所述子段代码至内存;在通用段代码的函数指针数组中添加相应的函数钩子;清除所述虚拟内存区中的所述子段代码以及所述虚拟内存区的使用信息;将所述子段代码标记为已经加载。
本发明实施例的技术方案中,将存储设备划分成多个存储区,将系统代码划分成多个段代码;将所述多个段代码存储至所述存储设备中对应的存储区中;启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行。采用本发明实施例的技术方案,能够把操作系统挤入容量更小和地址不连续的内存运行。从另一个方面来说本发明实施例的方案可以有效地利用嵌入芯片的内存空间来启动并运行系统,节省了内存容量,降低了成本。
附图说明
附图以示例而非限制的方式大体示出了本文中所讨论的各个实施例。
图1为本发明实施例的存储设备中的分区示意图;
图2为本发明实施例的系统分段示意图;
图3为本发明实施例的功能段组成结构图;
图4为本发明实施例的系统启动过程代码搬移示意图;
图5为本发明实施例的系统调度运行段功能示意图;
图6为本发明实施例的系统启动及运行的方法的流程图;
图7为本发明实施例的子段加载入内存流程图一。
图8为本发明实施例的子段加载入内存流程图二。
图9为本发明实施例的子段导出内存的流程图一。
图10为本发明实施例的子段导出内存的流程图二。
图11为本发明实施例的管理虚拟内存区(swap)流程图;
图12为本发明实施例的系统启动及运行的装置的结构组成示意图。
具体实施方式
为了能够更加详尽地了解本发明实施例的特点与技术内容,下面结合附图对本发明实施例的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本发明实施例。
为了把操作系统挤入容量更小和地址不连续的内存运行,本发明实施例提出了一种从存储设备引导系统分段启动运行的方案。本发明实施例的技术方案通过链接器指明被链接程序在内存布局上的大量细节,分配特定类型的代码和数据,并根据功能把代码分成不同的段。系统启动运行时根据使用的功能把相应段加载到内存中运行,未用到的功能不加载。通过本发明实施例的技术方案,可以使操作系统在分布怪异且很小的内存地址空间运行。
本发明实施例的技术方案,从存储设备引导系统分段启动并运行,包括以下内容:
第一步:如图1所示,把存储设备分成若干存储区(如图1中把存储设备分为七个存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区),用于存放系统代码的相应段。其中,各个存储区之间页对齐。
第二步:如图2所示,把系统代码分成若干段(如图2中把系统代码分为七个大段:一级启动段、通用段、异常中断处理段、调度运行段、高速运行段和功能段)。这里,系统代码一般都是模块化的,根据代码不同的作用划分成不同的模块。比如引导系统启动模块、异常中断处理模块、内存管理模块、网络通信模块等。通过链接器把这些具有不同作用的模块放入相应段里。
第三步:系统中有部分代码,从功能上看相对较独立,且在系统运行时,会不时的调用。比如:各个外设驱动模块、以及不同文件系统模块等。这部分代码(在系统中所占比例比较大)也可以使用链接器,按照功能分成若干段。然后这些段全部放在功能段中,如图3所示。每个功能对应一子段,n个功能就对应n个子段。各子段之间页对齐。由于各子段相对较独立,所以没有必要同时加载到内存中运行。可以按照一定的规则调度到内存中运行,这样就节省了内存空间。
第四步:把第二步和第三步划分的系统不同段,存放在存储设备的相应存储区中(段与存储区一一对应)。此时系统代码的链接地址与存储地址不同。系统启动运行时通过代码的链接地址计算出各个段的存储地址。
第五步:上电,系统按照如图4所示,把相应段复制到内存中运行。启动过程简介如下:
1.很多嵌入式芯片都带有固件的bootrom,bootrom启动后会把一级启动段复制到内置RAM中运行。
2.运行一级启动段代码。一级启动段的作用是初始化外置RAM,并把二级启动段复制到外置RAM中运行。
3.运行二级启动段代码。二级启动段里的代码主要作用是把第一步中划分的各段复制到内存中(除了功能段外)运行。最终完成启动流程。此时被复制到内存中运行的各段代码的加载地址与运行地址相同。
4.二级启动段代码运行完后,会跳到内存的通用段里开始初始化并运行系统。
第六步:系统启动后,调度运行段里的代码会按照一定规则调度功能段里的子段到内存中运行,如图5所示。
第七步:在存储介质(也即存储设备)里划分一个虚拟内存区(Swap)。当内存被占满,且需要继续分配内存时时,会启动Swap区。调度运行段按照一定的规则使用swap区,如图5所示。
图6为本发明实施例的系统启动及运行的方法的流程图,如图6所示,所述系统启动及运行的方法包括以下步骤:
步骤601:将存储设备划分成多个存储区,将系统代码划分成多个段代码。
本发明实施例中,所述将存储设备划分成多个存储区,将系统代码划分成多个段代码,包括:
将存储设备划分成如下存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区;
将系统代码划分成如下段代码:一级启动段代码、通用段代码、异常中断处理段代码、二级启动段代码、调度运行段代码、高速运行段代码和功能段代码。
进一步地,所述将系统代码划分成多个段代码,还包括:
将所述功能段代码按照功能划分成多个子段代码,其中,每个子段代码对应一个功能。
本发明实施例中,根据子段代码的使用频率和/或使用时间指标为各个所述子段代码设置相应的优先级。
本发明实施例中,所述功能段代码中的子段代码满足以下至少之一:
在子段代码中使用局部变量;
将常量存放在子段代码中,伴随子段代码进出内存;
不同子段代码之间无引用关系;
子段代码之间的引用关系所确定出的子段代码总容量小于等于空闲的内存容量;
不同子段代码之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址,其中,所述函数指针数组钩子存放至所述通用段代码中,所述指针数组钩子由所述调度运行段代码管理。
步骤602:将所述多个段代码存储至所述存储设备中对应的存储区中。
本发明实施例中,将所述多个段代码存储至所述存储设备中对应的存储区时,将各个段代码以及子段代码按照页对齐的方式进行存储。
步骤603:启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行。
本发明实施例中,启动系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行,包括:
将所述一级启动段代码复制至内置内存中;
运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;
运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;
运行所述通用段代码,从而初始化系统,完成系统启动。
本发明实施例中,运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行,包括:
系统启动后,运行所述调度运行段代码,按照预设策略调度所述功能段代码中的子段代码至内存中运行。
此外,系统启动时,将优先级高于第一门限值的子段代码加载至内存中;系统运行时,将待被调用的子段代码加载至内存中。
在本发明第一实施方式中,子段代码加载至内存的过程包括:判断是否有子段代码需要加载至内存;如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;当成功为所述子段代码分配内存空间时,建立内存管理单元中的地址映射表;判断所述虚拟内存区是否存有所述子段代码;如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;在所述通用段代码的函数指针数组中添加函数钩子;将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;将所述子段代标记为已经加载。
在本发明第二实施方式中,子段代码加载至内存的过程包括:判断是否有子段代码需要加载至内存;如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;当成功为所述子段代码分配内存空间时,判断所述虚拟内存区是否存有所述子段代码;如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;重定位所述子段代码至内存;在所述通用段代码的函数指针数组中添加函数钩子;将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;将所述子段代标记为已经加载。
在本发明第一实施方式中,子段代码从内存中删除的过程包括:判断是否有子段代码需要导出内存;如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;删除内存管理单元中的地址映射表;在通用段代码的函数指针数组中删除相应的函数钩子;将所述子段代码标记为已经删除。
在本发明第二实施方式中,子段代码从内存中删除的过程包括:判断是否有子段代码需要导出内存;如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;将所述子段代码标记为已经删除。
本发明实施例中,存储设备具有虚拟内存区(swap),虚拟内存区的处理流程包括:启动系统时,清除虚拟内存区的数据;在内存不足的情况下,将优先级小于第二门限值的子段代码存入所述虚拟内存区,并释放相应的内存空间;清除内存空间并删除内存管理单元中的地址映射表或者清除内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;标记所述虚拟内存区的使用信息;将所述子段代码标记为已导出;在内存足够的情况下,判断虚拟内存区是否有子段代码需要加载;如果有子段代码需要加载,则判断所述子段代码是否已经加载至内存;如果所述子段代码没有加载至内存,则建立内存管理单元中的地址映射表并分配内存空间以及加载所述子段代码至内存,或者分配内存空间并通过重定位方式加载所述子段代码至内存;在通用段代码的函数指针数组中添加相应的函数钩子;清除所述虚拟内存区中的所述子段代码以及所述虚拟内存区的使用信息;将所述子段代码标记为已经加载。
下面结合具体应用实例对本发明实施例的方案做进一步详细描述。
本发明实施例中,因为对存储设备读写操作都需要页对齐,所以一级启动段、二级启动段和调度运行段的代码中对存储设备的操作都需要注意页对齐。为了减少页对齐操作所耗费的时间,要求所有段的起始地址都页对齐存放。功能段里的各个子段也页对齐存放。
如图3所示:功能段根据代码的功能划分为n个子段,每个子段占有n个页,保证子段之间页对齐。子段之间根据使用的频率高低和时间要求严格程度划分优先级。使用的越频繁或者对时间要求越严格其优先级越高反之越低。比如:在uboot的命令模式下,系统会频繁通过串口获取和输出信息,因此串口驱动功能对应的子段优先级要高于其它外设驱动功能对应的子段。
本发明实施例中,功能段中划分各子段时,需要考虑如下因素:
1.尽可能使用局部变量,即:尽量把变量放在栈上,降低重定位的难度。
2.全局变量存放在通用段中。通用段常住内存,所以可以固定位置寻址(通用段在内存中的加载地址与运行地址相同)。
3.常量存放在各子段中,伴随子段一起进出内存。常量的寻址,由重定位确定。
4.减少不同子段之间的引用关系。理想状态是,每个子段相互独立,不存在引用关系。即:尽量减少需同时在内存中运行的子段数量。
5.如果无法避免相互引用,应尽量保证引用深度所涉及到的子段总大小不要大于可供使用的内存容量。
6.不同子段之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址。函数指针数组钩子存放在通用段中。指针数组钩子由调度运行段管理。
7.每个子段都有自己的栈。由通用段管理不同子段之间栈的切换。
基于以上方案,系统启动的流程如图4所示:
1.系统上电芯片固件bootrom开始运行,并复制存储设备里的一级启动段代码到内置RAM中,然后跳到内置RAM运行一级启动段代码。
2.一级启动段初始化外置RAM,并把二级启动段代码复制到外置RAM中。然后跳到外置RAM运行二级启动段代码。
3.二级启动段代码把通用段代码复制到内置RAM中。通用段主要存放了全局变量数据、常量数据、CPU初始化和异常中断向量表代码等。内置RAM比较紧张时,可以把通用段代码放到外置RAM中。因系统启动后通用段会把内存中一级启动段(系统启动后该段不再使用)代码覆盖。所以它们的运行地址有重叠。通过连接脚本的覆盖图定义代码运行地址的重叠区间。
4.二级启动段代码把异常中断处理段代码复制到内置RAM中。异常中断处理函数被调用的比较频繁所以单独放到一个段,并且该段常驻内存中。很多中断处理函数对实时性具有严格的要求,所以建议放在内置RAM中。
5.二级启动段代码把调度运行段代码复制到内置RAM中。因调度运行段代码运行比较频繁并且会直接影响系统的性能,所以建议放在内置RAM中。
6.二级启动段代码把高速运行段代码复制到内置RAM中。高速运行段存放的是对时间要求最严格的代码,比如网络数据处理相关的代码。因高速运行段对时间要求非常严格,所以一定要放在内置RAM中。条件允许的情况下可以直接锁定在cache中运行。
7.跳入通用段代码运行。通用段的作用是初始化cpu、配置使能中断等。为系统的运行做好准备。
8.跳入调度运行段代码运行。自此系统启动流程成功完成。
本发明实施例中,调度运行段代码具有如下功能特征:
1对功能段的子段预取功能。
1)上电启动时,把优先级高的子段先加载到内存中。
2)运行时把将要被调用的子段提前加载到内存中。
2.调度子段进出内存的功能。
1)子段加载入内存的调度流程:(调度的触发方法:1.定时器中断定时触发;2.相应段代码运行时主动请求触发(此种情况下,被加载子段的优先级变为最高)。)
第一种方式:使用内存管理单元(MMU),通过内存管理单元(MMU)实现虚拟地址到物理地址的映射。不同子段的虚拟地址连续(即:链接地址连续),物理地址不连续。如图7所示,包括:
a)判断是否有子段需要加载到内存(通过加载标记判断),没有则什么也不做直接退出,否则继续运行。如果有多个子段需要加载时,先加载优先级高的。相同优先级的,按使用时间的先后顺序加载。
b)判断该子段是否已经加载到内存,已经加载则增加加载次数标记并报错,然后直接退出,否则继续运行。
c)分配内存空间。空闲内存不够用,导致内存分配不成功时。触发管理虚拟内存区(swap)功能函数,释放优先级小于该子段的子段所占用的内存。如果最终内存没有分配成功,则直接退出(当子段优先级的提升后会分配成功)。分配成功则继续运行。
d)建立内存管理单元(MMU)地址映射表。
e)判断虚拟内存区(swap)是否有该子段的代码。有则从虚拟内存区(swap)加载,无则从功能段中加载。
f)如果从虚拟内存区(swap)加载的子段代码,则清除虚拟内存区(swap)里的子段代码,并清除相应标记。
g)在通用段的函数指针数组中添加新的函数钩子,供其他段调用。
h)把该子段会调用到的子段,标记为需要加载到内存中的子段。
i)标记该子段代码已经加载。
第二种方式:不使用内存管理单元(MMU),调度运行段代码完成被加载子段的重定位功能。子段的加载地址与运行地址不同。不同子段的加载地址连续(即:链接地址连续),运行地址不连续。如图8所示,包括:
a)判断是否有子段需要加载到内存(通过加载标记判断),没有则什么也不做直接退出,否则继续运行。如果有多个子段需要加载时,先加载优先级高的。相同优先级的,按使用时间的先后顺序加载。
b)判断该子段是否已经加载到内存,已经加载则增加加载次数标记并报错,然后直接退出,否则继续运行。
c)分配内存空间。空闲内存不够用,导致内存分配不成功时。触发管理虚拟内存区(swap)功能函数,释放优先级小于该子段的子段所占用的内存。如果最终内存没有分配成功,则直接退出(当子段优先级的提升后会分配成功)。分配成功则继续运行。
d)判断虚拟内存区(swap)是否有该子段的代码。有则从虚拟内存区(swap)加载,无则从功能段中加载。
e)子段代码的加载与重定位。
f)如果从虚拟内存区(swap)加载的子段代码,则清除虚拟内存区(swap)里的子段代码,并清除相应标记。
g)在通用段的函数指针数组中添加新的函数钩子,供其他段调用。
h)把该子段会调用到的子段,标记为需要加载到内存中的子段。
i)标记该子段代码已经加载。
2)子段导出释放内存的调度流程:(定时中断定时触发)
第一种方式:使用内存管理单元(MMU),如图9所示,包括:
a)判断是否有子段需要导出内存(通过导出标记判断),没有则什么也不做直接退出,否则继续运行。如果有多个子段需要导出时,则一起导出内存。
b)判断该子段是否已经加载到内存,没有加载则增加导出次数标记并报错,然后直接退出,否则继续运行。
c)清除内存空间。
d)删除内存管理单元(MMU)地址映射表。
e)在通用段的函数指针数组中删除相应的函数钩子。
f)相应子段标记为已删除(即:标记为没有加载到内存)。
第二种方式:不使用内存管理单元(MMU),如图10所示:
a)判断是否有子段需要导出内存(通过导出标记判断),没有则什么也不做直接退出,否则继续运行。如果有多个子段需要导出时,则一起导出内存。
b)判断该子段是否已经加载到内存,没有加载则增加导出次数标记并报错,然后直接退出,否则继续运行。
c)释放并清除内存空间。
d)在通用段的函数指针数组中删除相应的函数钩子。
e)相应子段标记为已删除(即:标记为没有加载到内存)。
3.管理虚拟内存区(swap)的调度流程,调度的触发方法:1.定时器中断定时触发;2.调度段代码运行时主动请求触发。管理虚拟内存区的执行的流程如图11所示,包括:
1)上电启动初始化阶段,清除虚拟内存区(swap)的数据。
2)内存不足时:
(1)把优先级小于该要加载子段的子段导入虚拟内存区(swap)。
(2)把子段的栈上信息也一起保存到虚拟内存区(swap)。
(3)释放内存空间:使用内存管理单元(MMU),先清除内存空间,再删除内存管理单元(MMU)地址映射表;未使用内存管理单元(MMU),直接清除内存空间。
(4)在通用段的函数指针数组中删除相应的函数钩子。
(5)标记相应虚拟内存区(swap)的使用信息。
(6)相应子段标记为已导出。
3)当有足够的空闲内存时:
(1)判断虚拟内存区(swap)是否有子段,没有则什么也不做直接退出,否则继续运行。如果有多个子段时,先加载优先级高的。相同优先级的,按使用时间的先后顺序加载。
(2)判断该子段是否已经加载到内存,已经加载则增加加载次数标记并报错,同时清除虚拟内存区(swap)的子段,然后直接退出,否则继续运行。
(3)分配内存空间。使用内存管理单元(MMU),先建立内存管理单元(MMU)地址映射表,再分配内存空间;未使用内存管理单元(MMU),直接分配内存空间。
(4)加载子段代码和其栈上信息到内存:使用内存管理单元(MMU),直接加载;未使用内存管理单元(MMU),通过重定位方式加载。
(5)在通用段的函数指针数组中添加新的函数钩子。
(6)清除虚拟内存区(swap)里的子段代码。
(7)清除相应虚拟内存区(swap)的使用信息。
(8)标记该子段代码已经加载。
图12为本发明实施例的系统启动及运行的装置的结构组成示意图,如图12所示,所述装置包括:
划分单元1201,用于将存储设备划分成多个存储区,将系统代码划分成多个段代码;
存储单元1202,用于将所述多个段代码存储至所述存储设备中对应的存储区中;
处理单元1203,用于启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行。
本发明实施例中,所述划分单元1201,具体用于:将存储设备划分成如下存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区;
将系统代码划分成如下段代码:一级启动段代码、通用段代码、异常中断处理段代码、二级启动段代码、调度运行段代码、高速运行段代码和功能段代码。
本发明实施例中,所述划分单元1201,具体用于:将所述功能段代码按照功能划分成多个子段代码,其中,每个子段代码对应一个功能。
本发明实施例中,所述装置还包括:
设置单元1204,用于根据子段代码的使用频率和/或使用时间指标为各个所述子段代码设置相应的优先级。
本发明实施例中,所述功能段代码中的子段代码满足以下至少之一:
在子段代码中使用局部变量;
将常量存放在子段代码中,伴随子段代码进出内存;
不同子段代码之间无引用关系;
子段代码之间的引用关系所确定出的子段代码总容量小于等于空闲的内存容量;
不同子段代码之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址,其中,所述函数指针数组钩子存放至所述通用段代码中,所述指针数组钩子由所述调度运行段代码管理。
本发明实施例中,将所述多个段代码存储至所述存储设备中对应的存储区时,将各个段代码以及子段代码按照页对齐的方式进行存储。
本发明实施例中,所述处理单元1203,具体用于:将所述一级启动段代码复制至内置内存中;运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;运行所述通用段代码,从而初始化系统,完成系统启动。
本发明实施例中,所述处理单元1203,具体用于:系统启动后,运行所述调度运行段代码,按照预设策略调度所述功能段代码中的子段代码至内存中运行。
本发明实施例中,所述处理单元1203,还用于系统启动时,将优先级高于第一门限值的子段代码加载至内存中;系统运行时,将待被调用的子段代码加载至内存中。
本发明实施例中,所述处理单元1203包括:第一加载子单元12031,用于执行如下流程:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,建立内存管理单元中的地址映射表;
判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
本发明实施例中,所述处理单元1203包括:第二加载子单元12032,用于执行如下流程:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
重定位所述子段代码至内存;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
本发明实施例中,所述处理单元1203包括:第一删除子单元12033,用于执行如下流程:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
删除内存管理单元中的地址映射表;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
本发明实施例中,所述处理单元1203包括:第二删除子单元12034,用于执行如下流程:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
本发明实施例中,所述处理单元1203还包括:
清除子单元12035,用于启动系统时,清除虚拟内存区的数据;
导出子单元12036,用于在内存不足的情况下,将优先级小于第二门限值的子段代码存入所述虚拟内存区,并释放相应的内存空间;清除内存空间并删除内存管理单元中的地址映射表或者清除内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;标记所述虚拟内存区的使用信息;将所述子段代码标记为已导出;
第三加载子单元12037,用于在内存足够的情况下,判断虚拟内存区是否有子段代码需要加载;如果有子段代码需要加载,则判断所述子段代码是否已经加载至内存;如果所述子段代码没有加载至内存,则建立内存管理单元中的地址映射表并分配内存空间以及加载所述子段代码至内存,或者分配内存空间并通过重定位方式加载所述子段代码至内存;在通用段代码的函数指针数组中添加相应的函数钩子;清除所述虚拟内存区中的所述子段代码以及所述虚拟内存区的使用信息;将所述子段代码标记为已经加载。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

Claims (25)

1.一种系统启动及运行的方法,其特征在于,所述方法包括:
将存储设备划分成多个存储区,将系统代码划分成多个段代码;
将所述多个段代码存储至所述存储设备中对应的存储区中;
启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行;
所述将存储设备划分成多个存储区,将系统代码划分成多个段代码,包括:
将存储设备划分成如下存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区;
将系统代码划分成如下段代码:一级启动段代码、通用段代码、异常中断处理段代码、二级启动段代码、调度运行段代码、高速运行段代码和功能段代码;
启动系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行,包括:
将所述一级启动段代码复制至内置内存中;
运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;
运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;
运行所述通用段代码,从而初始化系统,完成系统启动。
2.根据权利要求1所述的系统启动及运行的方法,其特征在于,所述将系统代码划分成多个段代码,还包括:
将所述功能段代码按照功能划分成多个子段代码,其中,每个子段代码对应一个功能。
3.根据权利要求2所述的系统启动及运行的方法,其特征在于,所述方法还包括:
根据子段代码的使用频率和/或使用时间指标为各个所述子段代码设置相应的优先级。
4.根据权利要求2所述的系统启动及运行的方法,其特征在于,所述功能段代码中的子段代码满足以下至少之一:
在子段代码中使用局部变量;
将常量存放在子段代码中,伴随子段代码进出内存;
不同子段代码之间无引用关系;
子段代码之间的引用关系所确定出的子段代码总容量小于等于空闲的内存容量;
不同子段代码之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址,其中,所述函数指针数组钩子存放至所述通用段代码中,所述指针数组钩子由所述调度运行段代码管理。
5.根据权利要求2所述的系统启动及运行的方法,其特征在于,将所述多个段代码存储至所述存储设备中对应的存储区时,将各个段代码以及子段代码按照页对齐的方式进行存储。
6.根据权利要求1所述的系统启动及运行的方法,其特征在于,运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行,包括:
系统启动后,运行所述调度运行段代码,按照预设策略调度所述功能段代码中的子段代码至内存中运行。
7.根据权利要求2所述的系统启动及运行的方法,其特征在于,所述方法还包括:
系统启动时,将优先级高于第一门限值的子段代码加载至内存中;
系统运行时,将待被调用的子段代码加载至内存中。
8.根据权利要求6所述的系统启动及运行的方法,其特征在于,按照预设策略调度所述功能段代码中的子段代码至内存,包括:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,建立内存管理单元中的地址映射表;
判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
9.根据权利要求6所述的系统启动及运行的方法,其特征在于,按照预设策略调度所述功能段代码中的子段代码至内存,包括:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
重定位所述子段代码至内存;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
10.根据权利要求8所述的系统启动及运行的方法,其特征在于,所述方法还包括:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
删除内存管理单元中的地址映射表;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
11.根据权利要求9所述的系统启动及运行的方法,其特征在于,所述方法还包括:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
12.根据权利要求8或10所述的系统启动及运行的方法,其特征在于,所述方法还包括:
启动系统时,清除虚拟内存区的数据;
在内存不足的情况下,将优先级小于第二门限值的子段代码存入所述虚拟内存区,并释放相应的内存空间;清除内存空间并删除内存管理单元中的地址映射表或者清除内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;标记所述虚拟内存区的使用信息;将所述子段代码标记为已导出;
在内存足够的情况下,判断虚拟内存区是否有子段代码需要加载;如果有子段代码需要加载,则判断所述子段代码是否已经加载至内存;如果所述子段代码没有加载至内存,则建立内存管理单元中的地址映射表并分配内存空间以及加载所述子段代码至内存,或者分配内存空间并通过重定位方式加载所述子段代码至内存;在通用段代码的函数指针数组中添加相应的函数钩子;清除所述虚拟内存区中的所述子段代码以及所述虚拟内存区的使用信息;将所述子段代码标记为已经加载。
13.一种系统启动及运行的装置,其特征在于,所述装置包括:
划分单元,用于将存储设备划分成多个存储区,将系统代码划分成多个段代码;
存储单元,用于将所述多个段代码存储至所述存储设备中对应的存储区中;
处理单元,用于启动或运行系统时,将所述存储设备的存储区中存储的段代码复制至内存中运行;
其中,所述划分单元,具体用于:将存储设备划分成如下存储区:一级启动区、通用区、异常中断处理区、二级启动区、调度运行区、高速运行区和功能区;
将系统代码划分成如下段代码:一级启动段代码、通用段代码、异常中断处理段代码、二级启动段代码、调度运行段代码、高速运行段代码和功能段代码;
其中,所述处理单元,具体用于:将所述一级启动段代码复制至内置内存中;运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;运行所述通用段代码,从而初始化系统,完成系统启动。
14.根据权利要求13所述的系统启动及运行的装置,其特征在于,所述划分单元,具体用于:将所述功能段代码按照功能划分成多个子段代码,其中,每个子段代码对应一个功能。
15.根据权利要求14所述的系统启动及运行的装置,其特征在于,所述装置还包括:
设置单元,用于根据子段代码的使用频率和/或使用时间指标为各个所述子段代码设置相应的优先级。
16.根据权利要求14所述的系统启动及运行的装置,其特征在于,所述功能段代码中的子段代码满足以下至少之一:
在子段代码中使用局部变量;
将常量存放在子段代码中,伴随子段代码进出内存;
不同子段代码之间无引用关系;
子段代码之间的引用关系所确定出的子段代码总容量小于等于空闲的内存容量;
不同子段代码之间的引用函数的寻址,通过函数指针数组钩子的方式间接寻址,其中,所述函数指针数组钩子存放至所述通用段代码中,所述指针数组钩子由所述调度运行段代码管理。
17.根据权利要求14所述的系统启动及运行的装置,其特征在于,将所述多个段代码存储至所述存储设备中对应的存储区时,将各个段代码以及子段代码按照页对齐的方式进行存储。
18.根据权利要求13所述的系统启动及运行的装置,其特征在于,所述处理单元,具体用于:将所述一级启动段代码复制至内置内存中;运行所述一级启动段代码,初始化外置内存,并将所述二级启动段代码复制至外置内存中;运行所述二级启动段代码,将如下段代码分别复制至内置内存中:通用段代码、异常中断处理段代码、调度运行段代码、高速运行段代码;运行所述通用段代码,从而初始化系统,完成系统启动。
19.根据权利要求18所述的系统启动及运行的装置,其特征在于,所述处理单元,具体用于:系统启动后,运行所述调度运行段代码,按照预设策略调度所述功能段代码中的子段代码至内存中运行。
20.根据权利要求14所述的系统启动及运行的装置,其特征在于,所述处理单元,还用于系统启动时,将优先级高于第一门限值的子段代码加载至内存中;系统运行时,将待被调用的子段代码加载至内存中。
21.根据权利要求19所述的系统启动及运行的装置,其特征在于,所述处理单元包括:第一加载子单元,用于执行如下流程:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,建立内存管理单元中的地址映射表;
判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
22.根据权利要求19所述的系统启动及运行的装置,其特征在于,所述处理单元包括:第二加载子单元,用于执行如下流程:
判断是否有子段代码需要加载至内存;
如果有子段代码需要加载至内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码未加载至内存,则为所述子段代码分配内存空间;
如果内存空间不足,则触发虚拟内存区功能函数释放优先级小于所述子段代码的子段代码所占用的内存;
当成功为所述子段代码分配内存空间时,判断所述虚拟内存区是否存有所述子段代码;
如果所述虚拟内存区存有所述子段代码,则从所述虚拟内存区加载所述子段代码,并清除所述虚拟内存区中存储的所述子段代码;如果所述虚拟内存区未存有所述子段代码,则从所述功能段中加载所述子段代码;
重定位所述子段代码至内存;
在所述通用段代码的函数指针数组中添加函数钩子;
将所述子段代码调用的子段代码标记为需要加载到内存中的子段代码;
将所述子段代标记为已经加载。
23.根据权利要求21所述的系统启动及运行的装置,其特征在于,所述处理单元包括:第一删除子单元,用于执行如下流程:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
删除内存管理单元中的地址映射表;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
24.根据权利要求22所述的系统启动及运行的装置,其特征在于,所述处理单元包括:第二删除子单元,用于执行如下流程:
判断是否有子段代码需要导出内存;
如果有子段代码需要导出内存,则判断所述子段代码是否已经加载至内存;
如果所述子段代码已经加载至内存,则清除所述子段代码对应的内存空间;
在通用段代码的函数指针数组中删除相应的函数钩子;
将所述子段代码标记为已经删除。
25.根据权利要求21或23所述的系统启动及运行的装置,其特征在于,所述处理单元还包括:
清除子单元,用于启动系统时,清除虚拟内存区的数据;
导出子单元,用于在内存不足的情况下,将优先级小于第二门限值的子段代码存入所述虚拟内存区,并释放相应的内存空间;清除内存空间并删除内存管理单元中的地址映射表或者清除内存空间;在通用段代码的函数指针数组中删除相应的函数钩子;标记所述虚拟内存区的使用信息;将所述子段代码标记为已导出;
第三加载子单元,用于在内存足够的情况下,判断虚拟内存区是否有子段代码需要加载;如果有子段代码需要加载,则判断所述子段代码是否已经加载至内存;如果所述子段代码没有加载至内存,则建立内存管理单元中的地址映射表并分配内存空间以及加载所述子段代码至内存,或者分配内存空间并通过重定位方式加载所述子段代码至内存;在通用段代码的函数指针数组中添加相应的函数钩子;清除所述虚拟内存区中的所述子段代码以及所述虚拟内存区的使用信息;将所述子段代码标记为已经加载。
CN201611244019.6A 2016-12-28 2016-12-28 一种系统启动及运行的方法、装置 Active CN108255526B (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
CN201611244019.6A CN108255526B (zh) 2016-12-28 2016-12-28 一种系统启动及运行的方法、装置
EP17886706.5A EP3564814A4 (en) 2016-12-28 2017-04-27 METHOD AND DEVICE FOR STARTING AND OPERATING A COMPUTER STORAGE SYSTEM AND MEDIUM
PCT/CN2017/082283 WO2018120548A1 (zh) 2016-12-28 2017-04-27 一种系统启动及运行的方法、装置、计算机存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611244019.6A CN108255526B (zh) 2016-12-28 2016-12-28 一种系统启动及运行的方法、装置

Publications (2)

Publication Number Publication Date
CN108255526A CN108255526A (zh) 2018-07-06
CN108255526B true CN108255526B (zh) 2020-07-31

Family

ID=62707728

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611244019.6A Active CN108255526B (zh) 2016-12-28 2016-12-28 一种系统启动及运行的方法、装置

Country Status (3)

Country Link
EP (1) EP3564814A4 (zh)
CN (1) CN108255526B (zh)
WO (1) WO2018120548A1 (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110209434B (zh) * 2019-04-23 2022-04-22 努比亚技术有限公司 一种内存管理方法、装置及计算机可读存储介质
CN110286953B (zh) * 2019-07-03 2023-12-19 迈普通信技术股份有限公司 嵌入式系统的启动方法、装置、嵌入式设备及存储介质
CN116088883A (zh) * 2023-04-11 2023-05-09 北京朝歌数码科技股份有限公司 终端设备烧录方法、生产方法、终端设备及外部存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102902556A (zh) * 2012-09-06 2013-01-30 深圳市共进电子股份有限公司 一种嵌入式设备的多级引导加载方法
CN103677923A (zh) * 2013-12-13 2014-03-26 中国航空工业集团公司第六三一研究所 一种boot引导程序运行保护方法

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6973554B2 (en) * 2003-04-23 2005-12-06 Microsoft Corporation Systems and methods for multiprocessor scalable write barrier
KR100640389B1 (ko) * 2005-04-06 2006-10-30 삼성전자주식회사 Nand플래시 메모리를 구비한 장치에서 어플리케이션을실행하는 방법 및 그 장치
CN102043639A (zh) * 2009-10-12 2011-05-04 珠海全志科技有限公司 一种从nand flash启动处理系统的方法及装置
CN102308280B (zh) * 2011-07-27 2013-08-28 华为技术有限公司 基本输入/输出系统bios配置数据管理方法及系统
CN103853566B (zh) * 2012-11-30 2017-05-03 鸿富锦精密工业(深圳)有限公司 Bios更新系统及方法
TWI525542B (zh) * 2013-09-09 2016-03-11 Insyde Software Corp Uefi bios開機及更新之系統及方法、記錄媒體及電腦程式產品
CN104077167A (zh) * 2014-07-11 2014-10-01 杭州华三通信技术有限公司 基于nand flash的启动加载方法和装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102902556A (zh) * 2012-09-06 2013-01-30 深圳市共进电子股份有限公司 一种嵌入式设备的多级引导加载方法
CN103677923A (zh) * 2013-12-13 2014-03-26 中国航空工业集团公司第六三一研究所 一种boot引导程序运行保护方法

Also Published As

Publication number Publication date
WO2018120548A1 (zh) 2018-07-05
EP3564814A1 (en) 2019-11-06
CN108255526A (zh) 2018-07-06
EP3564814A4 (en) 2019-12-25

Similar Documents

Publication Publication Date Title
CN102981864B (zh) 信息处理装置和信息处理方法
CN103246610B (zh) 基于单类型存储器的嵌入式系统的动态存储管理方法
US8484631B2 (en) Supporting hardware configuration changes in a UEFI firmware component
CN108255526B (zh) 一种系统启动及运行的方法、装置
CN105335306A (zh) 一种内存控制方法和装置
US20050028159A1 (en) Memory managing system and task controller in multitask system
CN110647359A (zh) 半导体装置、其操作方法和具有其的层叠存储装置
US8726258B2 (en) Supporting multiple hardware components in UEFI
US7647482B2 (en) Methods and apparatus for dynamic register scratching
CN108459906B (zh) 一种vcpu线程的调度方法及装置
US20110296092A1 (en) Storing a Driver for Controlling a Memory
US20140025870A1 (en) Computer reprogramming method, data storage medium and motor vehicle computer
JP2008225576A (ja) Nand型フラッシュメモリの制御装置
CN103703449A (zh) 存储器合并的计算机实现方法、系统以及装置
CN104281587A (zh) 一种建立连接的方法及装置
CN102541743B (zh) 用于存储管理的方法、设备和系统
CN114327246B (zh) 存储介质内数据存储方法、存储介质及计算机设备
CN103593606A (zh) 上下文信息管理方法及系统
CN102999353A (zh) 创建设备节点的方法及装置
CN114116222A (zh) 一种嵌入式系统启动时内存布局动态规划的方法及装置
US20080072009A1 (en) Apparatus and method for handling interrupt disabled section and page pinning apparatus and method
US20050027940A1 (en) Methods and apparatus for migrating a temporary memory location to a main memory location
CN111124522A (zh) 一种微内核及宏内核混合的方法及系统
CN104751881A (zh) 快闪存储器烧录方法
KR100489044B1 (ko) 복수 패키지 관리 방법

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