首页> 中国专利> 应用程序可重定位加载的方法及地址重定位装置

应用程序可重定位加载的方法及地址重定位装置

摘要

本发明公开了一种应用程序可重定位加载的方法,该方法包括:调用应用程序;查询该应用程序的代码偏移和应用长度;根据内存的分配情况为应用程序分配长度大于或等于所述应用长度的空闲内存;创建进程控制块,保存所述空闲内存的起始地址、代码偏移和应用长度;将该应用程序的代码复制到所述空闲内存。本发明还公开了一种支持应用程序可重定位加载的地址重定位装置。使用本发明使得操作系统能够根据当前内存的分配情况加载应用程序,避免了对应用程序的页面的管理及对符号信息和地址重定位信息的解析,从而简化了应用程序的动态加载,使编译在同一地址的应用程序可以同时在操作系统上同时运行。

著录项

  • 公开/公告号CN101246427A

    专利类型发明专利

  • 公开/公告日2008-08-20

    原文格式PDF

  • 申请/专利号CN200710080255.3

  • 发明设计人 陈立勤;

    申请日2007-02-15

  • 分类号G06F9/445(20060101);G06F12/08(20060101);

  • 代理机构11018 北京德琦知识产权代理有限公司;

  • 代理人王一斌;王琦

  • 地址 台湾省新竹科学工业园区创新一路19号

  • 入库时间 2023-12-17 20:36:43

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-03-06

    未缴年费专利权终止 IPC(主分类):G06F9/445 授权公告日:20091028 终止日期:20170215 申请日:20070215

    专利权的终止

  • 2014-03-19

    专利权的转移 IPC(主分类):G06F9/445 变更前: 变更后: 登记生效日:20140227 申请日:20070215

    专利申请权、专利权的转移

  • 2009-10-28

    授权

    授权

  • 2008-10-15

    实质审查的生效

    实质审查的生效

  • 2008-08-20

    公开

    公开

说明书

技术领域

本发明涉及应用程序加载技术,具体涉及一种应用程序可重定位加载的方法及相应的地址重定位装置。

背景技术

操作系统在启动应用程序之前需要加载应用程序,也就是为应用程序预先准备运行环境,包括为应用程序运行前准备内存环境。

在现有的嵌入式操作系统中,加载应用程序的方式主要有两种:

第一种是在没有硬件存储器管理单元(MMU,Memory ManagementUnit)或不使用硬件MMU的方式下,嵌入式操作系统以下列方式加载应用程序:

嵌入式操作系统与所有预先设定的应用线程编译连接在一起。操作系统在运行时,根据需要从自身启动各应用程序执行。所以,这种情况下,操作系统与应用程序统一运行在同一内存地址空间,应用程序的崩溃将导致整个系统的瘫痪。并且,所有应用程序必须事先设定完成,与操作系统一起编译,从而不能在现有正在运行的系统中动态增加新的应用程序。

嵌入式操作系统将应用程序加载到内存的固定地址。由于操作系统在运行时可以为所有应用程序分配的地址空间不可以预先确定,所以导致操作系统只能够指定一段特定的内存地址空间作为应用程序的加载空间,并且预留空间必须足够运行最大的应用程序,且一次只能够运行一个应用程序。

嵌入式操作系统动态加载应用程序到任意的内存地址空间。但是,由于应用程序的运行地址空间在编译时确定,所以为了能够将已经编译完成的应用程序加载到任意的内存地址空间运行,必须根据应用程序的符号信息对应用程序进行地址重定位。这就要求应用程序在编译阶段携带所有符号信息和地址重定位信息,操作系统才可以根据加载时的运行状况,动态分配内存,解析应用程序携带的符号信息和地址重定位信息进行加载。但是带有符号信息和地址重定位信息的应用程序将至少比无符号信息和地址重定位信息的应用程序文件的长度大10倍以上,从而增大了应用程序的代码尺寸,增加了操作系统在加载应用程序时的时间,最终影响了操作系统的运行速度。

第二种,在使用硬件MMU的方式下,嵌入式操作系统可以实现完善的应用程序加载方案。每一个应用程序都有自己独立的地址空间,因此应用程序在崩溃时不会危害操作系统的运行。但是以这种运行方式执行应用程序时,操作系统需要为每一个应用程序保存其运行页面对照表。例如,典型的x86系统中,一旦启动应用程序就需要分配至少三个页面的空间3×4k做页表空间,包括一个一级页表和二个二级页表,并且随着应用程序的运行,操作系统会不断地为应用程序分配各级页表。而在有些系统中,每一个页表可能由二个页面组成,所以需要为新的应用程序分配2×3×4k的地址空间做页表使用。由于硬件MMU的复杂性,页表的管理在操作系统的管理中也相当复杂,需要花费操作系统大量的运行时间维护页面对照表的完整性和一致性,从而使得对页表的管理减慢了操作系统运行的速度。在一些实时性要求很高的嵌入式系统应用中,将直接影响实际的嵌入式应用效果。

在常见的精简指令集计算机(RISC,Reduced Instruction Set Computer)体系结构中,内存的存取方式已经由页模式取代段模式。在经典的x86等复杂指令集计算机(CISC,Complex Instruction Set Computer)体系结构的中央处理单元(CPU,Central Processing Unit)中,存在有明显的段概念,需要预先知道段的设置,在编译应用程序或初始化应用程序时,需要对段寄存器进行赋值,这使得过程变得复杂。在代码执行过程中产生的代码和数据地址都需要与这些段寄存器共同产生实际的物理地址,使得代码段在物理内存中只能从一个段移到另一个段,而不是灵活的移动。

发明内容

有鉴于此,本发明提供一种应用程序重定位加载的方法,简化了应用程序的动态加载,使编译在同一地址的应用程序可以同时在操作系统上同时运行。

本发明提供一种支持应用程序可重定位加载的地址重定位装置,简化了应用程序的动态加载,使编译在同一地址的应用程序可以同时在操作系统上同时运行。

为达到上述目的,本发明实施例的技术方案是这样实现的:

一种应用程序可重定位加载的方法,包括:

调用应用程序,查询该应用程序的代码偏移及应用长度;

根据内存分配情况为该应用程序分配长度大于或等于所述应用长度的空闲内存;

为该应用程序创建进程控制块,保存所述空闲内存的起始地址、代码偏移及应用长度;

将该应用程序代码复制到所述空闲内存。

所述将该应用程序代码复制到空闲内存之后,该方法可进一步包括:在进程切换的触发条件下,将进程控制块中保存的起始地址、代码偏移及应用长度设置到相应的硬件寄存器中;

在应用程序指令执行时,将应用程序的虚拟地址与硬件寄存器的起始地址相加;再减去应用程序的代码偏移得到应用程序的内存物理地址。

所述调用应用程序之前,该方法还可以进一步包括:

将操作系统的内存起始地址和代码偏移保存到暂存式存储器一中;

所述将该应用程序代码复制到空闲内存之后,该方法进一步包括:

在进程切换的触发条件下,将进程控制块中保存的应用程序内存起始地址和代码偏移设置到暂存式存储器二中;

在核心态切换到用户态执行应用程序时,将保存在暂存式存储器二中的内容设置到应用寄存器组中;将应用程序的虚拟地址与应用程序内存起始相加,减去应用程序的代码偏移得到应用程序的内存物理地址;

在用户态切换到核心态执行操作系统指令时,将保存在暂存式存储器一中的内容设置到应用寄存器组中;将操作系统的虚拟地址与操作系统的内存起始地址相加,减去操作系统的代码偏移得到操作系统的内存物理地址。

所述得到应用程序的内存物理地址之后,该方法进一步包括:

判断所述物理地址是否在根据所述空闲内存的起始地址、代码偏移及应用长度得到的应用程序运行的地址范围,如果在则继续执行指令;否则执行越界中断处理。

一种地址重定位装置,包括中央处理单元CPU核、地址加法器、应用基址寄存器和代码偏移寄存器,

所述CPU核,用于将虚拟地址输出到地址加法器;

所述应用基址寄存器,用于保存应用基址,所述应用基址为根据内存的分配情况为应用程序分配的空闲内存的起始地址;将所述应用基址发送并保持到与所述地址加法器相连的总线上;

所述代码偏移寄存器,用于保存代码偏移;将所述代码偏移发送并保持到与所述地址加法器相连的总线上;

所述地址加法器,用于将接收到的CPU核发送的虚拟地址与所述应用基址寄存器发送的应用基址相加,再减去所述代码偏移寄存器发送的代码偏移,得到内存的物理地址。

该装置进一步包括应用长度寄存器,用于保存应用程序的应用长度;将该应用长度发送到CPU核;

所述应用基址寄存器,进一步用于将保存的应用程序的应用基址发送到CPU核;

所述代码偏移寄存器,进一步用于将保存的应用程序的代码偏移发送到CPU核;

所述地址加法器,进一步用于将得到的应用程序的物理地址发送到CPU核;

所述CPU核,进一步用于根据接收到的应用基址、代码偏移和应用长度,得到应用程序运行的地址范围;判断所述接收到的物理地址是否在所述应用程序运行的地址范围之内,如果是,则执行应用程序;否则,执行越界中断处理。

所述应用基址寄存器与所述代码偏移寄存器为一个寄存器,用于保存应用基址与代码偏移之差;将该应用基址与代码偏移之差发送并保存到与所述地址加法器相连的总线上;

所述地址加法器,进一步用于接收所述寄存器发送的应用基址与代码偏移之差,将该应用基址与代码偏移之差与CPU核发送的虚拟地址相加,得到内存物理地址。

该装置进一步包括暂存式存储器一和暂存式存储器二,

所述暂存式存储器一,用于在系统初始化的时候,保存操作系统的应用基址与代码偏移;当由用户态向核心态切换时,在CPU核发送的触发信号的控制下,将保存的操作系统应用基址与代码偏移分别发送到所述应用基址寄存器和代码偏移寄存器;

所述暂存式存储器二,用于在进程切换的时候,保存应用程序的进程控制块中的应用基址与代码偏移;当由核心态切换到用户态的时候,在CPU核发送的触发信号的控制下,将保存的应用程序应用基址与代码偏移分别发送到所述应用基址寄存器和代码偏移寄存器;

所述应用基址寄存器,进一步用于接收并保存所述暂存式存储器一发送的操作系统应用基址与代码偏移;或接收并保存所述暂存式存储器二发送的应用程序应用基址与代码偏移;

所述CPU核,进一步用于向暂存式存储器一和暂存式存储器二发送触发信号。

所述暂存式存储器一包括操作系统应用基址寄存器和操作系统代码偏移寄存器;所述暂存式存储器二包括应用程序应用基址寄存器和应用程序代码偏移寄存器,

所述操作系统应用基址寄存器,用于保存操作系统的应用基址,当由户态切换到核心态的时候,在CPU核发送的触发信号的控制下,将所述操作系统的应用基址发送到所述应用基址寄存器;

所述操作系统代码偏移寄存器,用于保存操作系统的代码偏移,当由户态切换到核心态的时候,在CPU核发送的触发信号的控制下,将所述操作系统的代码偏移发送到所述代码偏移寄存器;

所述应用程序应用基址寄存器,用于保存应用程序的应用基址,当由核心态切换到用户态的时候,在CPU核发送的触发信号的控制下,将所述应用程序的应用基址发送到所述应用基址寄存;

所述应用程序代码偏移寄存器,用于保存应用程序的代码偏移,当由核心态切换到用户态的时候,在CPU核发送的触发信号的控制下,将所述应用程序的代码偏移发送到所述代码偏移寄存器;

所述应用基址寄存器,进一步用于接收所述操作系统应用基址寄存器发送的操作系统的应用基址;或接收所述应用程序应用基址寄存发送的应用程序的应用基址;

所述代码偏移寄存器,进一步用于接收所述操作系统代码偏移寄存器发送的操作系统代码偏移;或接收所述应用程序代码偏移寄存器发送的应用程序的代码偏移;

所述CPU核,进一步用于向操作系统应用基址寄存器、操作系统代码偏移寄存器、应用程序应用基址寄存器和应用程序代码偏移寄存器发送触发信号。

所述暂存式存储器包括寄存器一和存储操作系统应用基址及代码偏移的内存空间;所述暂存式存储器二包括寄存器二和存储应用程序应用基址及代码偏移的内存空间,

所述寄存器一,用于保存指向存储操作系统应用基址和代码偏移的内存地址的指针;

所述寄存器二,用于保存指向存储应用程序应用基址和代码偏移的内存地址的指针;

所述CPU核,进一步用于当由户态切换到核心态的时候,通过寄存器一中的指针调用保存在指针所指内存地址中的操作系统的应用基址和代码偏移,分别保存到所述应用基址寄存器及代码偏移寄存器;当由核心态切换到用户态的时候,通过寄存器二中的指针调用保存在指针所指内存地址中的应用程序的应用基址及代码偏移,分别保存到所述应用基址寄存器和代码偏移寄存器。

所述用于保存应用基址和代码偏移的内存空间为只有核心态才能访问的内存空间。

与现有技术相比,本发明实施例所提供的应用程序可重定位加载的方法及支持应用程序可重定位加载的地址重定位装置,有以下效果:

第一,通过将应用程序编译得到的代码偏移地址、应用程序虚拟地址以及当前操作系统检测到的空闲内存的起始地址进行相加减,得到应用程序执行时的内存物理地址,从而可以很方便的根据实际内存使用情况加载应用程序,实现了应用程序的动态加载;且使得操作系统不需要维护页面对照表,不需要解析应用程序中的符号信息和地址重定位信息,从而简化了应用程序的动态加载,提高了操作系统的运行速度。

第二,通过操作系统根据当前内存的分配情况为应用程序的加载分配内存地址空间,操作系统可以为应用程序分配自身运行地址空间之外的内存地址空间,从而使应用程序与操作系统各自运行在自身独立的内存空间,实现操作系统的保护。

第三,由于操作系统可以灵活地为应用程序分配加载的地址空间,因此所有应用程序可以编译在同一个起始地址,简化了应用程序的编译过程;并且多个应用程序可以同时运行。

第四,由操作系统为应用程序加载分配内存空间,因此,操作系统只需要修改应用基址就可以完成代码在物理空间的重定位,使得应用程序可以在整个物理内存中灵活移动,。

同时,本发明的设计方案中硬件开销及操作系统维护开销很小,尤其适合应用于嵌入式系统中。

附图说明

图1为本发明应用程序可重定位加载的方法流程图;

图2为本发明当前内存分配情况与应用程序A和应用程序B的编译情况示意图;

图3为本发明当前内存分配情况与应用程序A的加载情况示意图;

图4为本发明当前内存分配情况与应用程序B的加载情况示意图;

图5为本发明应用程序A与应用程序B切换的方法流程图;

图6为本发明实施例一支持应用程序可重定位加载的地址重定位装置结构示意图;

图7为本发明操作系统与应用程序运行情况示意图;

图8为本发明实施例二支持应用程序可重定位加载的地址重定位装置结构示意图;

图9为本发明实施例三支持应用程序可重定位加载的地址重定位装置结构示意图。

具体实施方式

下面结合附图及具体实施例对本发明进行详细说明。

本发明应用程序可重定位加载的方法提供了CPU的一种内存存取模式。在该模式下,所有的应用程序及编译器不需要知道应用基址寄存器的存在。编译器只需要将应用程序编译在相同的地址空间,操作系统在加载应用程序时根据当前内存分配情况,为应用程序分配空闲内存,即根据当前内存的分配情况,对应用基址寄存器的内容进行调整;执行应用程序时的内存物理地址则由应用程序运行的虚拟地址与操作系统为应用程序分配的应用基址相加,再减去应用程序编译时确定的代码偏移得到,也就是说通过修改指令的执行方式,可以使应用程序的编译地址和执行地址得到统一。因此,所有的应用程序可以编译在同一起始地址,只要由操作系统根据内存的分配情况,分配应用程序的加载空间即可。这样,在简化了应用程序编译的同时,由于为应用程序分配的内存空间由操作系统根据内存使用情况动态分配,操作系统在每次启动时可以将应用程序代码加载到物理内存的不同地址,从而实现了应用程序代码段在物理内存中的动态加载;操作系统还可以通过修改为应用程序分配的应用基址来完成应用程序代码在物理内存的重定位,实现应用程序代码在物理内存中的整体移动;操作系统通过为不同的应用程序分配不同的空闲内存的起始地址,还可以将不同的应用程序加载到不同的物理内存,使得多个应用程序可以同时运行。

图1所示为本发明应用程序可重定位加载的方法流程图,如图1所示,该方法包括以下步骤:

步骤100:调用应用程序。

步骤101:查询该应用程序的代码偏移(offset)和应用长度(len)。

步骤102:为该应用程序分配起始地址为应用基址(base),长度为len的空闲内存。

步骤103:为应用程序建立进程控制块,用于保存相应的应用基址、代码偏移和应用长度。

步骤104:将应用程序复制到从应用基址开始的空闲内存。

该方法进一步包括步骤105:在切换至应用程序进程的触发条件下,将进程控制块中保存的起始地址、代码偏移及应用长度直接或通过暂存式存储器间接的设置到相应的应用寄存器组中;在应用程序的指令执行时,将应用程序的虚拟地址与应用寄存器组中的起始地址相加,再减去应用程序的代码偏移得到应用程序的内存物理地址。

本方法还可以包括,在执行应用程序过程中,判断根据应用程序虚拟地址得到的实际内存物理地址,是否在根据应用程序代码偏移及应用长度得到的内存物理地址范围内,如果在,则继续执行指令;如果不在,则确定该应用程序越界,按照现有技术中的方法执行越界中断处理,以实现对操作系统及其它应用程序的保护。

以下以应用程序A和应用程序B的加载为例对本发明支持应用程序动态加载的方法进行详细说明。

图2为本发明当前内存分配情况与应用程序A和应用程序B的编译情况示意图,如图2所示,应用程序A编译后的起始地址,即代码偏移为0x0,3000,应用长度为0x1,0000;应用程序B编译后代码偏移为0x0,3000,应用长度为0x2,0000;当前物理内存中,操作系统分配从0x0000,0000到0x000D,0000的内存,当前可为应用程序分配的内存为从0x000D,0000到0x0100,0000中的空闲物理内存。

图3为本发明当前内存分配情况与应用程序A的加载情况示意图,如图3所示,操作系统根据当前内存的分配情况,检测到在物理内存0x0010,0000处存在空闲,且其空闲区的长度大于应用程序A的应用长度,所以操作系统将应用程序A加载到从0x0010,0000开始的空闲物理内存,并为A分配长度为0x1,0000的内存地址空间,即在内存0x0010,0000到0x0011,0000的空间加载应用程序A的代码;并创建应用程序A的进程控制块,除其他必需的进程信息外,还要保存应用程序A的应用基址0x0010,0000、代码偏移0x0,3000以及应用长度0x1,0000。

完成应用程序A的加载后,当从工作在核心态下的操作系统换到工作在用户态下的应用进程A时:

在收到进程切换的触发条件下,将应用程序A的进程控制块中保存的起始地址、代码偏移及应用长度保存到相应的硬件寄存器中;

操作系统在应用程序的指令执行时将产生的虚拟地址,包括应用程序的指令地址和应用程序指令执行中的数据存取地址,与硬件寄存器中的起始地址相加,再减去应用程序的代码偏移得到应用程序的内存物理地址;

在应用程序A运行过程中,判断根据应用程序A运行时的虚拟地址计算出的实际内存物理地址,是否在根据应用程序A的代码偏移及应用长度计算出的物理地址0x0010,0000到0x0011,0000的范围内,是则继续执行应用程序A的指令;否则确定应用程序A越界,按照现有技术中的方法执行越界中断程序,以实现对操作系统及其它应用程序的保护。

假设此时操作系统在运行应用程序A的同时,需要加载应用程序B,且切换到应用程序B运行,则加载应用程序B的情况如图4所示。图4为本发明当前内存分配情况与应用程序B的加载情况示意图,操作系统根据当前内存分配情况,检测到在物理内存0x0018,0000处存在空闲,且空闲区长度大于应用程序B的应用长度,所以操作系统将应用程序B加载到从0x0018,0000的开始的物理内存,并为应用程序B分配长度为0x2,0000的内存,即在内存0x0018,0000到0x001A,0000的空间加载应用程序B的代码;并创建应用程序B的进程控制块,除其他必需的进程信息外,还要保存应用程序B的应用基址为0x0018,0000,代码偏移为0x0,3000,应用长度为0x2,0000。

应用程序B加载完成后,操作系统由应用程序A切换到应用程序B运行,切换的方法流程如图5所示,包括以下步骤:

步骤500:操作系统将应用程序A的现场保存到应用程序A的进程控制块中。

本步骤中,应用程序A的现场包括系统上下文、各通用寄存器以及控制寄存器等的内容。

步骤501:操作系统从应用程序B的进程控制块恢复应用程序B的现场。

步骤502:操作系统从应用程序B的进程控制块中将应用基址、代码偏移和应用长度恢复到相应的硬件寄存器中。

以下以三个实施例对本发明支持应用程序可重定位加载的地址重定位装置进行详细说明。

实施例一:

本实施例对操作系统运行在除本发明提供的内存存取模式之外的其它模式下时,支持应用程序可重定位加载的地址重定位装置进行详细说明。

图6为本发明实施例一支持应用程序可重定位加载的地址重定位装置结构示意图,如图6所示,该装置包括CPU核、地址加法器和应用寄存器组。

其中,CPU核用于将应用程序的虚拟地址输出到地址加法器。

该虚拟地址为应用程序执行时的指令地址或数据存取地址。

应用寄存器组包括应用基址寄存器和代码偏移寄存器,应用基址寄存器用于保存CPU在运行时,检测到的可以用于加载应用程序的空闲内存的起始地址,即应用基址,将该应用基址输出到地址加法器,并保持在与地址加法器相连的总线上;代码偏移寄存器,用于保存应用程序在编译时确定的起始地址,即代码偏移,将该代码偏移输出到地址加法器,并保持在与地址加法器相连的总线上。

地址加法器,用于将接收到的CPU核发送的应用程序的虚拟地址和应用基址寄存器输出的应用基址相加,再与接收到的代码偏移寄存器发送的代码偏移相减,得到应用程序的内存物理地址,并输出到外部。

此时执行步骤105的过程包括:在切换至应用程序进程时,将为应用程序分配的空闲内存的起始地址和应用程序的代码偏移分别设置到应用基址寄存器和代码偏移寄存器中;然后在应用程序指令执行时,由加法器将应用程序虚拟地址与应用基址寄存器的内容相加,再与代码偏移寄存器中的内容相减,得到应用程序的内存物理地址。

本实施例的装置还可以在应用寄存器组中增加应用长度寄存器,用于保存应用程序在编译时确定的应用长度;将该应用长度输出到CPU核;

此时,应用基址寄存器和代码偏移寄存器进一步用于将自身保存的内容输入到CPU核;地址加法器进一步用于将得出的物理地址输入到CPU核;

CPU核进一步用于接收应用长度寄存器输出的应用长度、应用基址寄存器输出的应用基址、代码偏移寄存器输出的代码偏移和地址加法器输入的物理地址,根据应用长度、应用基址和代码偏移计算出应用程序运行的内存物理地址范围,并判断地址加法器得到的物理地址是否在该范围内,如果是,则执行应用程序,否则按照现有技术中的方法执行越界中断处理。

由于操作系统在加载应用程序时为应用程序分配的应用基址和应用程序编译时确定的代码偏移,在应用程序启动后不需要再修改,因此,实际应用中可以将应用基址寄存器与代码偏移寄存器合为一个寄存器,用于保存应用基址与代码偏移之差。

当应用基址寄存器和代码偏移寄存器合设为一个寄存器时,执行步骤105的过程包括:将为应用程序分配的空闲内存的应用基址与应用程序的代码偏移之差设置到该寄存器中;然后,由加法器将应用程序的虚拟地址与该寄存器中的内容相加,得到应用程序的内存物理地址。

以上所述的应用寄存器组可以选用CPU中任何能够将其自身保存的内容保持在输入到地址加法器的总线上的硬件寄存器,例如段基址寄存器。

本发明提供的内存存取模式也可以采用外接协议处理器的方法实现,以方便硬件功能的裁减。

另外,为了保护操作系统,防止应用程序对操作系统的破坏,在本发明实施例中,应用程序运行在CPU的用户态,操作系统则运行在CPU的核心态下。在执行应用程序时,系统需要在核心态与用户态之间不断切换。如图7所示,用户态和核心态之间通过指令进行切换,指令包括系统调用、中断、例外以及返回指令。用户态到核心态的切换通过中断、例外和系统调用指令实现;核心态到用户态的切换通过返回指令实现。

操作系统核心态的应用基址可以固定,也可以在操作系统启动时设定,因此本实施例提供的装置还可以包括内存存取模式寄存器,用于保存操作系统采用的内存存取模式,由操作系统在启动时设置完相应寄存器后,将保存的内存存取模式发送到CPU核。如表1所示,可利用00来标识内存连续存取模式,以01来标识本发明的内存存取模式,以10标识内存分页存取模式。

表1CPU可使用的内存存取模式

CPU核根据内存存取模式寄存器中的内容决定操作系统使用的内存存取模式。

当操作系统不使用本发明提供的内存存取模式时,在应用程序产生中断、例外或系统调用时,CPU切换到核心态运行操作系统。操作系统的运行只需要按照现有技术的方式即可。

由于本发明操作系统与应用程序运行在自己独立的地址空间,因此采用本发明提供的方法使得应用程序不可以存取自己段空间之外的内存,从而实现了对操作系统运行空间的保护。

当操作系统使用本发明提供的内存存取模式时,需要将操作系统和应用程序使用的应用基址、代码偏移和应用长度等地址长度信息暂存于某一暂存式存储器中,例如内存空间或硬件寄存器中,以便在用户态和核心态进行切换时,能够将地址长度信息赋给在执行指令时能够将其内容保持到地址总线上的应用寄存器组中。此时,本发明支持应用程序可重定位加载的地址重定位装置还包括用于保存操作系统的应用基址与代码偏移的暂存式存储器一和用于保存应用程序的应用基址与代码偏移的暂存式存储器二。以下以实施例二和实施例三对本发明提供的地址重定位装置进行详细说明。

实施例二:

本实施例对操作系统运行于本发明提供的内存存取模式下,支持应用程序可重定位加载的装置进行详细说明。本实施例中的暂存式存储器为暂存式寄存器。

图8为本发明实施例二支持应用程序可重定位加载的地址重定位装置结构示意图,如图8所示,该装置包括暂存式寄存器组一、暂存式寄存器组二、应用寄存器组、CPU核和地址加法器。本实施例提供的装置在实施例一提供的装置的基础上增加了暂存式寄存器一和暂存式寄存器二。

其中,暂存式寄存器组-包括操作系统应用基址寄存器和操作系统代码偏移寄存器,用于在系统初始化的时候,分别保存操作系统的应用基址和代码偏移,当由用户态向核心态切换时,在CPU核发送的触发信号的控制下,将各自保存的操作系统应用基址和操作系统代码偏移发送到应用寄存器组的对应寄存器中。

暂存式寄存器组二包括应用程序应用基址寄存器和应用程序代码偏移寄存器,用于在切换到某个加载的应用程序进程时,分别保存在该应用程序的进程控制块中保存的应用基址和代码偏移;当由核心态向用户态切换时,在CPU核发送的触发信号的控制下,将各自保存的应用程序应用基址和应用程序代码偏移发送到应用寄存器组中的对应寄存器中。

应用寄存器组包括应用基址寄存器和代码偏移寄存器,分别用于保存当前正在运行的操作系统或应用程序的应用基址和代码偏移,并将各自保存的应用基址和代码偏移发送到地址加法器,并保持在与地址加法器相连的总线上。

CPU核用于将应用程序的虚拟地址以及操作系统的虚拟地址发送到地址加法器;并向暂存式寄存器组一和暂存式寄存器组二发送触发信号。

地址加法器用于将CPU核发送的应用程序或操作系统的虚拟地址与应用基址寄存器发送的应用基址相加,然后与代码偏移寄存器发送的代码偏移相减,得到应用程序或操作系统执行时的内存物理地址。

本实施例执行步骤105的过程包括:

在进程切换的触发条件下,即在核心态向用户态进行切换的时候,将应用程序的进程控制块中的内容设置到暂存式寄存器组二的相应寄存器中;

在调用应用程序之前预先将操作系统的应用基址、代码偏移保存在暂存式寄存器组一的相应寄存器中;

在核心态切换到用户态执行应用程序时,CPU核触发暂存式寄存器组二将其自身保存的内容,包括应用基址寄存器和代码偏移寄存器中的内容复制到应用寄存器组的对应寄存器中;加法器将CPU核发送的应用程序的虚拟地址与应用基址寄存器中的应用基址相加,再与代码偏移寄存器中的代码偏移相减后,得到应用程序运行时的内存物理地址;

当发生中断、例外或系统调用时,系统需要从用户态切换到核心态执行操作系统指令,此时切换的过程包括:

CPU核触发暂存式寄存器组一将其自身保存的内容,包括应用基址寄存器中的操作系统应用基址和代码偏移寄存器中的操作系统代码偏移,复制到应用寄存器组中的对应寄存器中;

在核心态下执行操作系统指令的时候,加法器将CPU核发送的虚拟地址与应用基址寄存器中的应用基址相加,再与代码偏移寄存器中的代码偏移相减,得到核心态下指令执行时的内存物理地址;

当运行返回指令时,系统需要由核心态切换到用户态执行应用程序。

在得到应用程序的内存物理之后,还包括判断该应用程序的物理地址是否在根据应用程序的应用基址、代码偏移及应用长度得到的应用程序运行的地址范围,如果在则继续执行指令;否则执行越界中断处理。

实施例三:

本实施例中,操作系统运行于本发明提供的内存存取方式下,将操作系统和应用程序的应用基址与代码偏移保存到内存空间中,并将指向存储以上信息的内存地址的指针存储到寄存器中。本实施例中的暂存式存储器一为用于保存操作系统应用基址和代码偏移的内存空间和保存指针的寄存器一;暂存式存储器二为用于保存应用程序应用基址和代码偏移的内存空间和保存指针的寄存器二。

图9为本发明实施例三支持应用程序可重定位加载的地址重定位装置结构示意图,如图9所示,该装置包括寄存器一、寄存器二、内存、应用寄存器组、CPU核和地址加法器。

其中寄存器一用于保存指向存储操作系统的应用基址与代码偏移的内存地址的指针。

寄存器二用于保存指向存储应用程序的应用基址与代码偏移的内存地址的指针。

应用寄存器组包括应用基址寄存器和代码偏移寄存器,应用基址寄存器用于保存操作系统或应用程序的应用基址,并将应用基址输出到地址加法器;代码偏移寄存器用于保存操作系统或应用程序的代码偏移,并将代码偏移输出到地址加法器。

CPU核用于将操作系统或应用程序的虚拟地址输出到地址加法器;当用户态切换到核心态时,通过寄存器一中的指针调用在指针所指的内存地址中的操作系统的应用基址及代码偏移,分别保存到所述应用基址寄存器和代码偏移寄存器;当由核心态切换到用户态时,通过寄存器二中的指针调用保存在指针所指内存地址中的应用程序的应用基址及代码偏移,分别保存到应用寄存器组的应用基址寄存器和代码偏移寄存器中。

地址加法器用于将CPU核发送的虚拟地址与应用基址寄存器发送的应用基址相加,并与代码偏移寄存器发送的代码偏移相减,得到操作系统或应用程序执行时的内存物理地址。

本实施例执行步骤105的过程包括:

将应用程序进程控制块中的地址信息复制到内存中,将指向保存应用程序地址信息的内存地址的指针保存到寄存器二中;

在系统初始化的时候预先将操作系统的应用基址、代码偏移复制到内存中,将指向保存操作系统地址信息的内存地址的指针保存到寄存器一中;

当从核心态切换到用户态执行应用程序时,CPU核通过存储在寄存器二中的指针调用存储在相应内存地址的应用程序的地址信息,并将地址信息复制到应用寄存器组中的相应寄存器中;加法器将CPU核发送的应用程序的虚拟地址与应用基址寄存器中的应用基址相加,再与代码偏移寄存器中的代码偏移相减后,得到应用程序运行时的内存物理地址;

当发生中断、例外或系统调用时,系统需要从用户态切换到核心态,切换的方法流程包括:

CPU核通过存储在寄存器一中的指针调用存储在内存相应地址的操作系统的地址信息,并将该地址信息复制到应用寄存器组的相应寄存器中;

在核心态下执行操作系统指令的时候,加法器将CPU核发送的虚拟地址与应用基址寄存器中的应用基址相加,再与代码偏移寄存器中的代码偏移相减,得到核心态下指令执行时的内存物理地址;

当运行返回指令时,系统需要由核心态切换到用户态下继续执行应用程序。

本实施例所述的用于保存操作系统和应用程序的应用基址和代码偏移的内存空间为只有在核心态才能访问的内存空间。

在本发明实施例二和实施例三所述的所有需要保存应用基址和代码偏移的暂存式寄存器或内存地址空间中,还可以增加保存应用长度的应用长度寄存器或内存地址空间,供CPU核用于越界检测。

由以上所述可以看出,本发明所提供的应用程序可重定位加载的方法及地址重定位装置具有以下优点:

第一,操作系统可以根据内存的实际分配情况动态加载应用程序,简化了应用程序的编译及动态加载过程,使得操作系统不需要维护页面对照表和解析符号信息表及地址重定位信息,从而当应用于嵌入式系统中时,显著提高了嵌入式系统的运行速度。

第二,应用程序与操作系统各自运行在自己独立的内存空间,实现操作系统的保护。

第三,所有应用程序可以编译在同一个起始地址,由操作系统加载到不同的物理内存位置,不需要硬件MMU的支持。简化了应用程序的编译;并且可以同时运行多个应用程序。

第四,可以将应用程序的代码在物理内存中整体移动,操作系统只需要修改应用基址就可以完成应用程序代码在物理空间的重定位。

以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号