为多镜像文件分配内存地址空间的方法、编译器和系统转让专利

申请号 : CN201210194345.6

文献号 : CN102750364B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 钟云德周巍

申请人 : 华为技术有限公司

摘要 :

本发明实施例公开了一种为多镜像文件分配内存地址空间的方法、编译器和系统,涉及计算机技术领域,能够充分利用内存地址空间。该方法包括:根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件。主要用于多镜像文件分配内存地址空间。

权利要求 :

1.一种为多镜像文件分配内存地址空间的方法,其特征在于,包括:

根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;

根据所述当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;

使用生成的链接脚本对所述当前待处理源文件进行编译链接,生成所述当前待处理源文件的镜像文件;其中,所述根据所述当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本包括:将所述当前待处理源文件中各个节区的共享属性添加到所述当前待处理源文件中;根据所述当前待处理源文件中各个节区的共享属性和所述当前可用内存地址范围生成所述当前待处理源文件的链接脚本;或者,根据当前可用内存地址范围修改预设链接脚本中记录的存放镜像文件的起始内存地址,得到所述当前待处理源文件的链接脚本。

2.根据权利要求1所述的方法,其特征在于,在所述根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围之前,所述方法还包括:根据前一个源文件的镜像文件包含的各个节区的大小计算前一个源文件的镜像文件所需的内存地址空间。

3.根据权利要求1或2所述的方法,其特征在于,所述根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围为:从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间,得到当前待处理源文件的可用内存地址范围。

4.根据权利要求1或2所述的方法,其特征在于,所述根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围包括:确定前一个源文件的可用内存地址范围的起始地址;

从所述起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。

5.根据权利要求1或2所述的方法,其特征在于,所述根据所述当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本包括:根据所述当前待处理源文件中每个节区的大小确定所述当前待处理源文件的链接脚本中记录的存放所述每个节区的起始内存地址。

6.一种为多镜像文件分配内存地址空间的装置,其特征在于,包括:

第一计算单元,用于根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围,将得到的所述当前待处理源文件的可用内存地址范围发送至生成单元;

生成单元,用于接收所述第一计算单元发送的所述当前待处理源文件的可用内存地址范围,根据所述当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,将生成的所述当前待处理源文件的链接脚本发送至编译链接单元;

编译链接单元,用于接收所述生成单元发送的所述当前待处理源文件的链接脚本,使用生成的链接脚本对所述当前待处理源文件进行编译链接,生成所述当前待处理源文件的镜像文件;

其中,所述生成单元包括:

添加子单元,用于将所述当前待处理源文件中各个节区的共享属性添加到所述当前待处理源文件中,将所述当前待处理源文件中各个节区的共享属性发送至第一生成子单元,或将所述当前待处理源文件中各个节区的共享属性发送至第二生成子单元;

第一生成子单元,用于接收所述添加子单元发送的所述当前待处理源文件中各个节区的共享属性,根据所述当前待处理源文件中各个节区的共享属性和所述当前可用内存地址范围生成所述当前待处理源文件的链接脚本;或者,第二生成子单元,用于接收所述添加子单元发送的所述当前待处理源文件中各个节区的共享属性,根据当前可用内存地址范围修改预设链接脚本中记录的存放镜像文件的起始内存地址,得到所述当前待处理源文件的链接脚本。

7.根据权利要求6所述的为多镜像文件分配内存地址空间的装置,其特征在于,还包括:第二计算单元,用于根据前一个源文件的镜像文件包含的各个节区的大小计算前一个源文件的镜像文件所需的内存地址空间,将计算得到的前一个源文件的镜像文件所需的内存地址空间发送至所述第一计算单元;

所述第一计算单元,还用于接收所述第二计算单元发送的前一个源文件的镜像文件所需的内存地址空间。

8.根据权利要求6或7所述的为多镜像文件分配内存地址空间的装置,其特征在于,所述第一计算单元根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围为:所述第一计算单元从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间,得到当前待处理源文件的可用内存地址范围。

9.根据权利要求6或7所述的为多镜像文件分配内存地址空间的装置,其特征在于,所述第一计算单元包括:第一确定子单元,用于确定前一个源文件的可用内存地址范围的起始地址,并将确定的所述起始地址发送至去除子单元;

去除子单元,用于接收所述确定子单元发送的所述起始地址,从所述起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。

10.根据权利要求6或7所述的为多镜像文件分配内存地址空间的装置,其特征在于,所述生成单元包括:第二确定子单元,用于根据所述当前待处理源文件中每个节区的大小确定所述当前待处理源文件的链接脚本中记录的存放所述每个节区的起始内存地址。

说明书 :

为多镜像文件分配内存地址空间的方法、编译器和系统

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及为多镜像文件分配内存地址空间的方法、编译器和系统。

背景技术

[0002] 在编写源码时通常采用高级语言进行编写,如C语言、C++等,但是,计算机能够运行的只有机器语言,因此,需要对源码进行编译链接,生成能够被计算机运行的机器语言。源码经过编译器编译链接产生的目标文件称之为Image(镜像文件),Image由节区(section)组成,节区是编译器链接的一种属性,用于对全局符号(变量、函数)进行分组,实现符号存储地址指定。在编译链接过程中使用LSP(linker script链接脚本)规定如何把源文件内的节区放入Image内,并控制Image内各部分在内存地址空间内的布局。为了方便、有效的在现有的内存芯片上部署更多的业务软件,内存芯片地址空间资源的有效利用显得尤为重要。
[0003] 现有技术中,在为多个业务软件分配内存地址空间时,为了避免不同Image使用的内存地址空间发生交叠,都是预先为各个Image分配内存地址空间,再对每个源文件进行编译链接使生成的Image使用预先被分配的内存地址空间。
[0004] 上述分配内存地址空间资源的方法,预先为每个Image划分的内存地址空间通过用户经验给出,不能保证分配给每个Image的内存地址空间与该Image的大小相适应,容易出现分配给某个Image的内存地址空间不够或较多的情况。如果分配给某个Image的内存地址空间不够,则必须重新为每个Image分配内存地址空间,否则,内存地址空间不够的Image对应的业务无法实现,耗费巨大工作量;如果分配给某个Image的内存地址空间较多,虽然不重新为每个Image分配内存地址空间,也能够实现内存地址空间较多的Image对应的业务,但会导致内存地址碎片存在,造成内存地址空间的浪费。

发明内容

[0005] 本发明的实施例提供一种为多镜像文件分配内存地址空间的方法、编译器和系统,能够充分利用内存地址空间。
[0006] 为达到上述目的,本发明的实施例采用如下技术方案:
[0007] 一方面,一种为多镜像文件分配内存地址空间的方法,包括:
[0008] 根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;
[0009] 根据当前所述待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;
[0010] 使用生成的链接脚本对所述当前待处理源文件进行编译链接,生成所述当前待处理源文件的镜像文件。
[0011] 进一步可选的,在所述根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围之前,所述方法还包括:
[0012] 根据前一个源文件的镜像文件包含的各个节区的大小计算前一个源文件的镜像文件所需的内存地址空间。
[0013] 进一步可选的,所述从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间包括:
[0014] 确定前一个源文件的可用内存地址范围的起始地址;
[0015] 从所述起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。
[0016] 进一步可选的,所述根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本包括:
[0017] 将所述当前待处理源文件中各个节区的共享属性添加到所述当前待处理源文件中;
[0018] 根据所述当前待处理源文件中各个节区的共享属性和所述当前可用内存地址范围生成所述当前待处理源文件的链接脚本;或者,
[0019] 根据当前可用内存地址范围修改预设链接脚本中记录的存放镜像文件的起始内存地址,得到所述当前待处理源文件的链接脚本。
[0020] 进一步可选的,所述根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本包括:
[0021] 根据所述当前待处理源文件中每个节区的大小确定所述当前待处理源文件的链接脚本中记录的存放所述每个节区的起始内存地址。
[0022] 另一方面,一种编译器,包括:
[0023] 第一计算单元,用于根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围,将得到的所述当前待处理源文件的可用内存地址范围发送至生成单元;
[0024] 生成单元,用于接收所述第一计算单元发送的所述当前待处理源文件的可用内存地址范围,根据所述当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,将生成的所述当前待处理源文件的链接脚本发送至编译链接单元;
[0025] 编译链接单元,用于接收所述生成单元发送的所述当前待处理源文件的链接脚本,使用生成的链接脚本对所述当前待处理源文件进行编译链接,生成所述当前待处理源文件的镜像文件。
[0026] 进一步可选的,还包括:
[0027] 第二计算单元,用于根据前一个源文件的镜像文件包含的各个节区的大小计算前一个源文件的镜像文件所需的内存地址空间,将计算得到的前一个源文件的镜像文件所需的内存地址空间发送至所述第一计算单元;
[0028] 所述第一计算单元,还用于接收所述第二计算单元发送的前一个源文件的镜像文件所需的内存地址空间。
[0029] 进一步可选的,所述第一计算单元包括:
[0030] 第一确定子单元,用于确定前一个源文件的可用内存地址范围的起始地址,并将确定的所述起始地址发送至去除子单元;
[0031] 去除子单元,用于接收所述确定子单元发送的所述起始地址,从所述起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。
[0032] 进一步可选的,所述生成单元包括:
[0033] 添加子单元,用于将所述当前待处理源文件中各个节区的共享属性添加到所述当前待处理源文件中,将所述当前待处理源文件中各个节区的共享属性发送至第一生成子单元,或将所述当前待处理源文件中各个节区的共享属性发送至第二生成子单元;
[0034] 第一生成子单元,用于接收所述添加子单元发送的所述当前待处理源文件中各个节区的共享属性,根据所述当前待处理源文件中各个节区的共享属性和所述当前可用内存地址范围生成所述当前待处理源文件的链接脚本;或者,
[0035] 第二生成子单元,用于接收所述添加子单元发送的所述当前待处理源文件中各个节区的共享属性,根据当前可用内存地址范围修改预设链接脚本中记录的存放镜像文件的起始内存地址,得到所述当前待处理源文件的链接脚本。
[0036] 进一步可选的,所述生成单元包括:
[0037] 第二确定子单元,用于根据所述当前待处理源文件中每个节区的大小确定所述当前待处理源文件的链接脚本中记录的存放所述每个节区的起始内存地址。
[0038] 再一方面,一种计算机系统,所述计算机系统包括至少一个处理器和内存,所述处理器上运行有操作系统,所述操作系统之上运行有编译器,所述编译器用于:
[0039] 从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间,得到当前待处理源文件的可用内存地址范围;
[0040] 根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;
[0041] 使用生成的链接脚本对所述当前待处理源文件进行编译链接,生成所述当前待处理源文件的镜像文件;
[0042] 所述处理器接收所述编译器发送的所述当前待处理源文件的镜像文件,并进行处理。
[0043] 本发明实施例提供的为多镜像文件分配内存地址空间的方法、编译器和系统,在对每个源文件进行编译前,首先,根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件,由于用于进行编译链接的链接脚本中记录的存放镜像文件的起始内存地址为当前待处理源文件的可用内存地址范围的起始地址,所以能够充分利用内存地址空间。

附图说明

[0044] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0045] 图1为本发明实施例提供的一种为多镜像文件分配内存地址空间的方法的流程图;
[0046] 图2为本发明实施例提供的另一种为多镜像文件分配内存地址空间的方法的流程图;
[0047] 图3为图2所示实施例5个源文件时的一种实现流程示意图;
[0048] 图4为图2所示实施例5个源文件时的另一种实现流程示意图;
[0049] 图5为本发明实施例提供的一种编译器的结构图;
[0050] 图6为本发明实施例提供的另一编译器的结构图;
[0051] 图7为本发明实施例提供的一种计算机系统的结构图。

具体实施方式

[0052] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0053] 本发明实施例提供了一种为多镜像文件分配内存地址空间的方法,如图1所示,包括:
[0054] 101、根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围。
[0055] 102、根据当前待处理源文件的可用内存地址范围生成当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为当前待处理源文件的可用内存地址范围的起始地址。
[0056] 在对每个源文件进行编译链接生成镜像文件前,首先,生成用于进行对源文件进行编译链接的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为当前待处理源文件的可用内存地址范围的起始地址,以便于在对当前待处理源文件进行编译链接时,生成的镜像文件分配内存地址空间与前一个生成的镜像文件所使用的内存空间连续。
[0057] 103、使用生成的链接脚本对待处理源文件进行编译链接,生成待处理源文件的镜像文件。
[0058] 本实施例提供的为多镜像文件分配内存地址空间的方法,在对每个源文件进行编译前,首先,根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件,由于用于进行编译链接的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,所以能够充分利用内存地址空间。
[0059] 在为了满足用户需求而不断推出新业务软件的同时,如果处理器仍采用仅包括CPU的单核架构或多核架构实现,这些新业务将很难实现,因此,当前,处理器采用异构多核架构实现,异构多核架构即将不同类型的内核集成在同一块芯片上,在这种架构中,CPU内核所不擅长的浮点运算及信号处理工作,由集成在同一块芯片上的其它可编程内核执行。随着业务软件的增多和内核的增多,就需要更充分、高效的利用芯片的各种资源。其中,地址空间资源就是一种非常重要的资源。本发明实施例提供另一种为多镜像文件分配内存地址空间的方法,该方法采用地址空间紧凑排放的方式,充分利用地址空间。具体如下:
[0060] 如图2所示,包括:
[0061] 201、根据前一个源文件的镜像文件包含的各个节区的大小计算前一个源文件的镜像文件所需的内存地址空间。
[0062] 步骤201可用包括:
[0063] 201a、确定前一个源文件的可用内存地址范围的起始地址。
[0064] 201b、从所述起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。
[0065] 具体的,在实施本方案时,可以预先设置一个配置文件(configure File),这个配置文件中记录如表1所示的当前可用内存地址资源及如表2所示的镜像文件所涉及的各个节区的共享属性。
[0066]
[0067] 表1
[0068] 关于表1中记录的可用内存地址资源,芯片内存剩余的可用内存地址空间可能并不连续,因此需要逐个记录所有的可用地址空间范围。其中name所指内容代表一块连续地址空间的名称代号;address所指内容代表相应的连续地址空间地址范围的起始地址;len所指内容代表相应的连续地址空间地址范围的长度大小。address和len所指定的值需要和实际的硬件芯片相匹配。
[0069]
[0070] 表2
[0071] 关于表2中记录的各个节区的共享属性,链接脚本内可能存在多个节区的定义,因此需要逐个标记各个节区的共享属性及该节区需要存放的内存区域。当芯片内所有的内存地址空间均连续时,该属性可以省略。其中name所指内容代表节区的名称;group所指内容代表相应节区的共享私有属性,例如这里的all则代表所有核共享的节区,dsps代表所有DSP核共享的节区;core7代表核7私有的节区;memory所指定内容代表相应的节区需要分配到的连续地址空间名称。
[0072] 计算源文件的镜像文件所需的内存地址空间时,根据该源文件的镜像文件包含的各个节区的大小计算该源文件的镜像文件所需的内存地址空间。具体的,根据当前待处理源文件中每个节区的大小确定当前待处理源文件的链接脚本中记录的存放每个节区的起始内存地址。
[0073] 为了便于计算镜像文件中各个节区的大小,在生成该镜像文件时,首先,通过分析当前配置文件的内容,获知当前源文件中各个节区的共享属性,根据各个节区的共享属性确定各个节区的大小,并按照各个节区从大到小对用于对当前源文件进行编译连接链接脚本中定义的节区进行重新排列,同时,在重置的链接脚本中插入一些特别的标记,以便统计链接产生的镜像文件中各类节区的大小。特别的标记可以根据实际需要任意设置,如以不同的阿拉伯数字标识共享不同的节区。
[0074] 202、根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围。
[0075] 具体的,从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间,得到当前待处理源文件的可用内存地址范围。
[0076] 根据前一个镜像文件的数据更新当前待处理源文件的可用内存地址空间,具体的,首先,确定前一个源文件的可用内存地址范围的起始地址;然后,从确定的起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。
[0077] 203、根据当前待处理源文件的可用内存地址范围生成当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为当前待处理源文件的可用内存地址范围的起始地址。
[0078] 在对每个源文件进行编译链接生成镜像文件前,首先,生成用于进行对源文件进行编译链接的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为当前待处理源文件的可用内存地址范围的起始地址,以便于在对当前待处理源文件进行编译链接时,生成的镜像文件分配内存地址空间与前一个生成的镜像文件所使用的内存空间连续。
[0079] 作为本实施例的一种实施方式,步骤202可以通过以下步骤方式实现:
[0080] 203a、将当前待处理源文件中各个节区的共享属性添加到当前待处理源文件中;
[0081] 203b、根据当前待处理源文件中各个节区的共享属性和当前可用内存地址范围生成当前待处理源文件的链接脚本;
[0082] 为了简化编译链接流程,也可以将配置文件中各个节区的共享属性添加到源文件的代码上,从而在对源文件进行编译链接的过程中自动生成用于对该源文件进行编译链接的链接脚本,达到编译链接的无缝结合。
[0083] 具体的,可以通过以下方式实现将配置文件中各个节区的共享属性添加到源文件的代码上,扩展C语言关键字描述变量和各函数的存放位置以及个节区的共享属性,扩展标记的描述可以是以下形式:
[0084]
[0085] 这里的关键字_ _core_ _(all)主要用来描述所指定内容的共享属性,关键字_ _mem_ _主要用来描述所指定内容将要配置的目标内存地址空间。
[0086] 通过一个预 处理过程,将上 述扩展C语言以增 加_ _attribute_ _((section(“name”)))的方式转换成标准的C语言。在此预处理过程中,同时根据配置文件configure File中记录的系统可用的地址空间范围产生相应的链接脚本。若预先不设置链接脚本,假设源文件数量为5,本实施方式的流程可以如图3所示。
[0087] 或者,作为本实施例的另一种实施方式,步骤202也可以通过以下方式实现:
[0088] 根据当前可用内存地址范围修改预设链接脚本中记录的存放镜像文件的起始内存地址,得到当前待处理源文件的链接脚本。
[0089] 也可以为编译链接预先设置链接脚本,这个预先设置的连接脚本中记录的存放镜像文件的起始内存地址为任意内存地址。在对每个源文件进行编译链接前,对预先设置的链接脚本中记录的存放镜像文件的起始内存地址进行修改,使用预先设置的连接脚本时,假设源文件数量为5,本实施方式的流程可以如图4所示。
[0090] 204、使用生成的链接脚本对待处理源文件进行编译链接,生成待处理源文件的镜像文件。
[0091] 本实施例提供的为多镜像文件分配内存地址空间的方法,在对每个源文件进行编译前,首先,从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间,得到当前待处理源文件的可用内存地址范围;根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件,由于用于进行编译链接的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,所以能够充分利用内存地址空间。
[0092] 本发明实施例提供了一种编译器,如图5所示,包括:第一计算单元51、生成单元52、编译链接单元53。
[0093] 其中,第一计算单元51,用于根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围,将得到的所述当前待处理源文件的可用内存地址范围发送至生成单元。
[0094] 生成单元52,用于接收所述第一计算单元发送的所述当前待处理源文件的可用内存地址范围,根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,将生成的所述当前待处理源文件的链接脚本发送至编译链接单元;
[0095] 编译链接单元53,用于接收所述生成单元发送的所述当前待处理源文件的链接脚本,使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件。
[0096] 本实施例提供的编译器,在对每个源文件进行编译前,首先,第一计算单元根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;生成单元根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;编译链接单元使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件,由于用于进行编译链接的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,所以能够充分利用内存地址空间。
[0097] 作为本实施例的一种改进,本发明实施例提供另一种编译器,如图6所示,包括:第二计算单元61、第一计算单元62、生成单元63、编译链接单元64。
[0098] 其中,第一计算单元62包括:第一确定子单元621、去除子单元622;生成单元63包括:添加子单元631、第一生成子单元632、第二生成子单元633、第二确定子单元634。
[0099] 第二计算单元61,用于根据前一个源文件的镜像文件包含的各个节区的大小计算前一个源文件的镜像文件所需的内存地址空间,将计算得到的前一个源文件的镜像文件所需的内存地址空间发送至所述第一计算单元;
[0100] 所述第一计算单元62,用于接收所述第二计算单元发送的前一个源文件的镜像文件所需的内存地址空间。
[0101] 第一计算单元62,用于根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围,得到所述当前待处理源文件的可用内存地址范围,将得到的所述当前待处理源文件的可用内存地址范围发送至生成单元;
[0102] 第一确定子单元621,用于确定前一个源文件的可用内存地址范围的起始地址,并将确定的所述起始地址发送至去除子单元;
[0103] 去除子单元622,用于接收所述确定子单元发送的所述起始地址,从所述起始地址开始,去除前一个源文件的镜像文件所需的内存地址空间。
[0104] 生成单元63,用于接收所述第一计算单元发送的所述当前待处理源文件的可用内存地址范围,根据所述当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,将生成的所述当前待处理源文件的链接脚本发送至编译链接单元;
[0105] 添加子单元631,用于将所述当前待处理源文件中各个节区的共享属性添加到所述当前待处理源文件中,将所述当前待处理源文件中各个节区的共享属性发送至第一生成子单元,或将所述当前待处理源文件中各个节区的共享属性发送至第二生成子单元;
[0106] 第一生成子单元632,用于接收所述添加子单元发送的所述当前待处理源文件中各个节区的共享属性,根据所述当前待处理源文件中各个节区的共享属性和所述当前可用内存地址范围生成所述当前待处理源文件的链接脚本;或者,
[0107] 第二生成子单元633,用于接收所述添加子单元发送的所述当前待处理源文件中各个节区的共享属性,根据当前可用内存地址范围修改预设链接脚本中记录的存放镜像文件的起始内存地址,得到所述当前待处理源文件的链接脚本。
[0108] 第二确定子单元634,用于根据所述当前待处理源文件中每个节区的大小确定所述当前待处理源文件的链接脚本中记录的存放所述每个节区的起始内存地址。
[0109] 编译链接单元64,用于接收所述生成单元发送的所述当前待处理源文件的链接脚本,使用生成的链接脚本对所述当前待处理源文件进行编译链接,生成所述当前待处理源文件的镜像文件。
[0110] 本实施例提供的编译器,在对每个源文件进行编译前,首先,,第一计算单元根据前一个源文件的镜像文件所需的内存地址空间及前一个源文件的可用内存地址范围计算当前待处理源文件的可用内存地址范围;生成单元根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;编译链接单元使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件,由于用于进行编译链接的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,所以能够充分利用内存地址空间。
[0111] 本实施例提供的为多镜像文件分配内存地址空间的方法、编译器和系统,采用多核编程的方式,减少了多核共享资源的使用维护工作量;对于各个Image划分的内存空间由当前实际可用内存地址空间给出,能够保证空间足够该Image使用,且没有浪费,编译出来的Image能有效的利用内存空间;在编译链接过程中逐个计算各个Image在特定内存的使用情况,直接进行内存划分减少工作量;即使在编译链接前增加业务代码也不需要对内存空间进行重新计算,不会导致内存空间划分的重新调整;内存部署经过一次链接便可得出地址空间分配的优化方案。
[0112] 本发明实施例还提供了一种计算机系统,如图7所示,包括至少一个处理器72和内存73,所述处理器上运行有操作系统,所述操作系统之上运行有编译器,所述编译器为上述实施例中任一编译器。所述处理器接收所述编译器发送的所述当前待处理源文件的镜像文件,并进行处理。
[0113] 其中,所述内存73包含多个物理内存页,且所述包含多个物理内存页的内存分为用户态内存区和内核态内存区,所述用户态内存区的物理内存页用于存储用户态数据和指令,所述内核态内存区的物理内存页用于存储内核态数据和指令;所述处理器72通过所述总线,调用所述内存中存储的代码,以用于:当一个线程需要分配内存时,识别所述线程的类型;若所述线程为用户态线程,则从所述用户态内存区为该用户态线程分配内存;若所述线程为内核态线程,则从所述内核态内存区为该内核态线程分配内存。
[0114] 上述计算机系统还可以进一步包括与总线71相连接的用户接口74。
[0115] 可选的,所述处理器72还用于当所述线程需要分配内存时,若操作系统发生缺页异常,则为所述线程的内存分配行为设置用户内存分配行为修饰符;所述用户内存分配行为修饰符用于标记当前内存分配行为由用户态线程触发。
[0116] 上述任一计算机系统还可以包括缓存,该缓存可以设置在处理器中,作为该处理器中多个处理器核的共享缓存。需要说明的是,本发明实施例中的缓存通常可以是硬件高速缓存,但不限于最后一级高速缓存,而可以是任何一个被多个处理器核共享的缓存。上述计算机系统不限于多核计算机系统,而可以是任何由多个处理器核共享同一缓存的系统。
[0117] 本实施例提供的计算机系统,编译器在对每个源文件进行编译前,首先,从前一个源文件的可用内存地址范围中去除前一个源文件的镜像文件所需的内存地址空间,得到当前待处理源文件的可用内存地址范围;根据当前待处理源文件的可用内存地址范围生成所述当前待处理源文件的链接脚本,使生成的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址;使用生成的链接脚本对所述待处理源文件进行编译链接,生成待处理源文件的镜像文件,由于用于进行编译链接的链接脚本中记录的存放镜像文件的起始内存地址为所述当前待处理源文件的可用内存地址范围的起始地址,所以能够充分利用内存地址空间。
[0118] 综上所述,本发明实施例提供的计算机系统中,采用多核编程的方式,减少了多核共享资源的使用维护工作量;编译器对于各个Image划分的内存空间由当前实际可用内存地址空间给出,能够保证空间足够该Image使用,且没有浪费,编译出来的各个Image能有效的利用内存空间;在编译链接过程中逐个计算各个Image在特定内存的使用情况,直接进行内存划分减少工作量;即使在编译链接前增加业务代码也不需要对内存空间进行重新计算,不会导致内存空间划分的重新调整;内存部署经过一次链接便可得出地址空间分配的优化方案。
[0119] 本发明实施例提供的计算机系统中,通过编译器在编译过程中实现存储空间的紧凑排布,避免内存布署需要进行二次链接的情况;且能够自动计算已用存储空间规划可用空间,避免手动反复调整分配空间,提高链接成功率;真正意义上实现了零碎片,内存空间充分利用,避免现有技术中编译出来的Image由于内存块的预先划分导致存在碎片,未能有效的利用内存空间的情况;避免现有技术中内存空间布署对业务代码调整限制的情况,换言之即避免了现有技术中,一旦增加业务代码会导致内存空间划分的重新调整,需要对内存空间进行重新计算的情况。
[0120] 通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0121] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。