地址空间分配方法及装置、计算机可读存储介质与流程

文档序号:18464393发布日期:2019-08-17 02:19阅读:225来源:国知局
地址空间分配方法及装置、计算机可读存储介质与流程

本发明涉及计算机处理技术领域,尤其涉及一种地址空间分配方法及装置、计算机可读存储介质。



背景技术:

在计算机处理器中,对存储单元的操作是基于存储单元地址进行的。在执行访问存储器的访问指令时,处理器根据访问指令及当前机器状态得到被访问存储单元的地址,上述获取访问存储单元地址的方式称之为寻址方式。理论上,寻址方式越丰富,指令集功能越强大。在通用计算机领域,处理器的寻址方式包括直接寻址、立即数寻址、间接寻址、寄存器间接寻址、相对寻址、基址寻址等。但是,寻址方式越丰富,处理器的设计及制造成本越高。在嵌入式计算机领域,由于成本等因素的限制,寻址方式比较简单,8位单片机一般只支持直接寻址和间接寻址。

直接寻址指令和间接寻址指令必须有明确的地址,所有变量地址都是静态分配的。在进行函数调用时,每次函数调用都会产生一个新的活动记录。当被调用函数存在多条调用路径时,需要为各个层级分配所需的地址空间,导致地址空间的利用率较低。



技术实现要素:

本发明实施例解决的是地址空间的利用率较低的技术问题。

为解决上述技术问题,本发明实施例提供一种地址空间分配方法,包括:当检测到调用目标函数的目标指令时,分配与所述目标函数对应的活动记录所需的地址空间,包括:获取实在参数基址寄存器的当前值;将活动记录基址寄存器的值更新为所述实在参数基址寄存器的当前值,将所述实在参数基址寄存器的当前值更新为:更新后的活动记录基址寄存器的值与所述目标函数对应的活动记录所需的地址空间的差值;在检测到所述目标函数执行完成后,释放所述目标函数对应的活动记录所需的地址空间。

可选的,所述释放所述目标函数对应的活动记录所需的地址空间,包括:获取活动记录基址寄存器的当前值;将实在参数基址寄存器的值更新为所述活动记录基址寄存器的当前值;将活动记录基址寄存器的当前值更新为:更新后的实在参数基址寄存器的值与调用所述目标函数的函数对应的活动记录所需的地址空间的和值。

可选的,在分配与所述目标函数对应的活动记录所需的地址空间之前,还包括:访问实在参数。

可选的,所述访问实在参数,包括:将所述实在参数基址寄存器的当前值与实在参数偏移量寄存器的值相减,得到的差值作为访问所述实在参数的访问地址;根据所述访问地址访问所述实在参数。

可选的,所述地址空间分配方法还包括:从间接寻址索引寄存器中获取所述目标函数对应的目标地址,所述目标地址为所述活动记录基址寄存器的当前值与写入所述间接访问偏移量寄存器的值的差值。

可选的,所述地址空间分配方法还包括:在活动记录中为局部符号分配地址空间,并将与所述活动记录基址寄存器的值之间的偏移量作为所述局部符号的静态坐标。

可选的,所述地址空间分配方法还包括:当接收到访问所述活动记录的访问指令时,将所述活动记录基址寄存器的值与所述访问指令中携带的地址相减,得到的差值作为所述访问指令对应的访问地址。

可选的,所述活动记录基址寄存器的值用于标记栈底,所述实在参数基址寄存器的值用于标记栈顶。

本发明实施例还提供了一种地址空间分配装置,包括:分配单元,用于当检测到调用目标函数的目标指令时,获取实在参数基址寄存器的当前值;将活动记录基址寄存器的值更新为所述实在参数基址寄存器的当前值,将所述实在参数基址寄存器的当前值更新为:更新后的活动记录基址寄存器的值与所述目标函数对应的活动记录所需的地址空间的差值;释放单元,用于在检测到所述目标函数执行完成后,释放所述目标函数对应的活动记录所需的地址空间。

可选的,所述释放单元,用于获取活动记录基址寄存器的当前值;将实在参数基址寄存器的值更新为所述活动记录基址寄存器的当前值;将活动记录基址寄存器的当前值更新为:更新后的实在参数基址寄存器的值与调用所述目标函数的函数对应的活动记录所需的地址空间的和值。

可选的,所述地址空间分配装置还包括:实在参数访问单元,用于在所述分配单元分配与所述目标函数对应的活动记录所需的地址空间之前,访问实在参数。

可选的,所述实在参数访问单元,用于将所述实在参数基址寄存器的当前值与实在参数偏移量寄存器的值相减,得到的差值作为访问所述实在参数的访问地址;根据所述访问地址访问所述实在参数。

可选的,所述地址空间分配装置还包括:目标地址获取单元,用于从间接寻址索引寄存器中获取所述目标函数对应的目标地址,所述目标地址为所述活动记录基址寄存器的当前值与写入所述间接访问偏移量寄存器的值的差值。

可选的,所述地址空间分配装置还包括:局部符号地址空间分配单元,用于在活动记录中为局部符号分配地址空间,并将所述局部符号与所述活动记录基址寄存器的值之间的偏移量作为所述局部符号的静态坐标。

可选的,所述地址空间分配装置还包括:活动记录访问单元,用于当接收到访问所述活动记录的访问指令时,将所述活动记录基址寄存器的值与所述访问指令中携带的地址相减,得到的差值作为所述访问指令对应的访问地址。

可选的,所述活动记录基址寄存器的值用于标记栈底,所述实在参数基址寄存器的值用于标记栈顶。

本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质为非易失性存储介质或非瞬态存储介质,其上存储有计算机指令,所述计算机指令运行时执行上述任一种所述的地址空间分配方法的步骤。

本发明实施例还提供了一种地址空间分配装置,包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的计算机指令,所述处理器运行所述计算机指令时执行上述任一种所述的地址空间分配方法的步骤。

与现有技术相比,本发明实施例的技术方案具有以下有益效果:

在检测到目标函数执行完成后,释放目标函数对应的活动记录所需的地址空间。因此,当函数存在多条调用路径时,后一条调用路径对应的活动记录所需的地址空间可以复用前一条调用路径对应的活动记录所需的地址空间,因此无需为每一个层级均分配静态的活动记录所需的地址空间,故能够有效提高地址空间的利用效率。

进一步,通过直接寻址访问实在参数间接访问寄存器时,根据实在参数基址寄存器的值与实在参数偏移量寄存器的值确定访问地址,从而访问实在参数,实现参数访问的快速高效。

附图说明

图1是本发明实施例中的一种地址空间分配方法的流程图;

图2是本发明实施例中的一种地址空间分配装置的结构示意图。

具体实施方式

现有技术中,在进行函数调用时,每次函数调用都会产生一个新的活动记录。当函数存在多条调用路径时,需要为各个层级分配所需的地址空间,导致大量的地址空间被占用,造成地址空间的利用率较低。对于中断函数,当中断函数存在多条调用路径时,也需要为中断函数的各个层级分配所需的地址空间。任何中断函数与任意非中断函数的地址不重叠。

本发明实施例中,当函数存在多条调用路径时,后一条调用路径对应的活动记录所需的地址空间可以复用前一条调用路径对应的活动记录所需的地址空间,因此无需为每一个层级均分配静态的活动记录所需的地址空间,故能够有效提高地址空间的利用效率。

为使本发明的上述目的、特征和有益效果能够更为明显易懂,下面结合附图对本发明的具体实施例做详细的说明。

本发明实施例提供了一种地址空间分配方法,参照图1,以下通过具体步骤进行详细说明。

步骤s101,当检测到调用目标函数的目标指令时,分配与所述目标函数对应的活动记录所需的地址空间。

在具体实施中,在调用目标函数时,可以生成用于调用目标函数的目标指令。当检测到目标指令时,即可判定当前需要调用目标函数。此时,可以分配与目标函数对应的活动记录所需的地址空间。

在具体实施中,当目标函数为某一个函数的子函数时,除了为目标函数分配对应的活动记录所需的地址空间外,还可以为该函数分配对应的活动记录所需的地址空间。

在具体实施中,在分配与目标函数对应的活动记录所需的地址空间时,可以先获取实在参数基址寄存器的当前值,将活动记录基址寄存器的值更新为实在参数基址寄存器的当前值,将实在参数基址寄存器的当前值更新为:更新后的活动记录基址寄存器的值与所述目标函数对应的活动记录所需的地址空间的差值。

也就是说,在分配与目标函数对应的活动记录所需的地址空间时,可以将活动记录基址寄存器的值更新为新的活动记录基址,将实在参数基址寄存器的值更新为新的实在参数基址;其中,新的活动记录基址为实在参数基址寄存器的当前值;新的实在参数基址为:新的活动记录基址与目标函数对应的活动记录所需的地址空间之差。

在本发明实施例中,上述的实在参数基址寄存器的当前值为:本次分配地址空间之前,实在参数基址寄存器中存储的最新的值。

例如,在未调用目标函数时,活动记录基址寄存器的当前值为a1,实在参数基址寄存器的当前值为b1,目标函数对应的活动记录所需的地址空间为c1。在调用目标函数时,活动记录基址寄存器的值更新为b1,实在参数基址寄存器的值更新为b1-c1。

步骤s102,当检测到所述目标函数执行完成后,释放所述目标函数对应的活动记录所需的地址空间。

在具体实施中,当目标函数执行完成后,可以释放目标函数对应的活动记录所需的地址空间。在执行下一个函数时,所释放的地址空间可以重新被复用,从而提高地址空间的利用效率。

在具体实施中,在释放目标函数对应的活动记录所需的地址空间时,可以先获取活动记录基址寄存器的当前值;之后,将实在参数基址寄存器的值更新为活动记录基址寄存器的当前值,将活动记录基址寄存器的当前值更新为:更新后的实在参数基址寄存器的值与调用所述目标函数的函数对应的活动记录所需的地址空间的和值。

换而言之,在释放目标函数对应的活动记录所需的地址空间时,可以将活动记录基址寄存器的值更新为旧的活动记录基址,将实在参数基址寄存器的值更新为旧的实在参数基址,其中:旧的实在参数基址为活动记录基址寄存器的当前值,旧的活动记录基址为:旧的实在参数基址与调用目标函数的函数对应的活动记录所需的地址空间之和。

继续以上述举例进行说明。在目标函数执行完成后,活动记录基址寄存器的值为b1,实在参数基址寄存器的值为b1-c1,调用目标函数的函数对应的活动记录所需的地址空间为d1。此时,活动记录基址寄存器的当前值为b1。在目标函数执行完成之后,将实在参数基址寄存器的值更新为b1,将活动记录基址寄存器的值更新为b1+d1。

需要说明的是,在本发明实施例中,上述的活动记录基址寄存器的当前值为:本次释放目标函数对应的活动记录所需的地址空间之前,活动记录基址寄存器中存储的最新的值。

在具体实施中,在分配与目标函数对应的活动记录所需的地址空间之前,可以先访问实在参数。在本发明实施例中,可以通过直接寻址方式访问实在参数间接访问寄存器来获取实在参数对应的访问地址。具体为,将实在参数基址寄存器的当前值与实在参数偏移量寄存器的值相减,得到的差值作为访问实在参数的访问地址。在得到访问地址后,即可访问实在参数。

由上可见,在调用目标函数的准备阶段,通过实在参数基址寄存器、实在参数偏移量寄存器以及实在参数间接访问寄存器,可以间接访问实在参数。

在本发明一具体实施例中,在采用直接寻址方式访问实在参数间接访问寄存器时,访问地址由实在参数基址寄存器中的低6位无符号数与实在参数间接访问寄存器中的低6位无符号数详见得到。通过实在参数基址寄存器、实在参数偏移量寄存器以及实在参数间接访问寄存器的配合,可以实现实在参数的访问。

在具体实施中,也可以支持间接寻址模式。在访问目标函数对应的目标地址时,可以从间接寻址索引寄存器中获取目标地址,目标地址为活动记录基址寄存器的值与写入间接访问偏移量寄存器的值的差值。

在本发明另一具体实施例中,可以通过间接访问偏移量寄存器的值向间接寻址索引寄存器传递活动记录对应的访问地址。在对间接访问偏移量寄存器进行写操作时,将活动记录基址寄存器存储的活动记录对应的基址与写入间接访问偏移量寄存器的8位无符号数进行16位相减运算,得到的差值即为目标地址,并将目标地址写入至间接寻址索引寄存器。

由上可知,在本发明实施例中,在直接寻址模式下,偏移寻址范围为7fh;在间接寻址模式下,偏移寻址范围为ffh。

在实际应用中可知,每个局部符号在活动记录中都需要地址空间。在本发明实施例中,在活动记录中为局部符号分配地址空间,并将局部符号与活动记录基址寄存器之间的偏移量作为局部符号的静态坐标。

当接收到访问活动记录的访问指令时,可以将活动记录基址寄存器的值与访问指令中携带的地址相减,将得到的差值作为访问指令对应的访问地址。

在本发明实施例中,对活动记录进行访问时,访问地址由活动记录基址寄存器的值与访问指令中携带的地址进行低7位无符号数相减得到,相减操作为16位操作。将活动记录基址寄存器的值与偏移量作为操作参数,能够高效地实现对局部符号等数据的高效访问。

在具体实施中,活动记录基址寄存器的值可以用于标记栈底,实在参数基址寄存器的值可以用于标记栈顶。当活动记录或者是在实在参数访问中的任一超过栈顶上限时,栈访问溢出标志被置为“1”。若溢出发生在在线调试器(incircuitdebugger,icd)的调试运行模式下,则芯片停止运行。

下面对本发明上述实施例中提供的地址空间分配方法进行说明。

程序在主函数main()中分别调用函数function1()和函数function2(),函数function1()调用函数function11()。

首先,为函数main()分配对应的活动记录所需的地址空间。当调用函数function1()时,为函数function1()分配对应的活动记录所需的地址空间。当函数function1()调用函数function11()时,为函数function11()分配对应的活动记录所需的地址空间。当运行到函数function11()的return语句或函数function11()的最后一条语句时,控制从函数function11()退出并返回到函数function1()程序中的下一条语句,并释放函数function11()对应的活动记录所需的地址空间。函数function1()继续运行,当运行到函数function1()的return语句或函数function1()的最后一条语句时,控制从函数function1()退出并返回到函数main()的下一条语句,并释放函数function1()对应的活动记录所需的地址空间。

主函数main()继续运行,当调用函数function2()时,为函数function2()分配对应的活动记录所需的地址空间。由于在执行函数function2()时,函数function1()已经执行完成,函数function1()对应的活动记录所需的地址空间及函数functio11()对应的活动记录所需的地址空间均已释放,因此,函数function2()对应的活动记录所需的地址空间为:函数function1()对应的活动记录所需的地址空间及函数functio11()对应的活动记录所需的地址空间。换而言之,调用函数function1()和调用函数function2()对应的活动记录所需的地址空间是复用的。

从上述举例中可知,在分配活动记录所需的地址空间时,首先分配的地址空间为主函数main()对应的活动记录所需的地址空间。然后,分配的地址空间为以下二者中的最大值:函数function1()对应的活动记录所需的地址空间与函数function11()对应的活动记录所需的地址空间的和,函数function2()对应的活动记录所需的地址空间。

而在现有技术中,需要分配的地址空间包括:主函数main()对应的活动记录所需的地址空间、函数function1()对应的活动记录所需的地址空间、函数function11()对应的活动记录所需的地址空间以及函数function2()对应的活动记录所需的地址空间。

由此可见,本发明实施例中,在检测到目标函数执行完成后,释放目标函数对应的活动记录所需的地址空间。因此,当函数存在多条调用路径时,后一条调用路径对应的活动记录所需的地址空间可以复用前一条调用路径对应的活动记录所需的地址空间,因此无需为每一个层级均分配静态的活动记录所需的地址空间,故能够有效提高地址空间的利用效率。

在实际应用中可知,一个函数的入口地址,指的是执行该函数时,首先被执行的第一条指令所存储的存储单元地址。c编程允许指针指向一个函数,成为函数指针,这是因为函数在编译时被分配了一个入口地址,这个入口地址可以作为函数指针的值,可以通过函数指针来调用一个函数,通过函数指针调用函数与通过函数名直接调用函数的参数传递方式相同。

下面继续以上述举例对调用函数的过程进行说明。

函数function1()通过函数指针调用函数function11()时,函数function1()的活动记录由活动记录基址寄存器的值和实在参数基址寄存器的值所确定。在函数调用阶段,通过实在参数基址寄存器、实在参数偏移量寄存器和实在参数间接访问寄存器来访问实在参数。具体地,通过直接寻址方式访问实在参数间接访问寄存器时,访问地址为:实在参数基址寄存器中的低6位无符号数与实在参数偏移量寄存器中的低6位无符号数相减的差值。在完成访问后,将实在参数偏移量寄存器的值加1。

通过实在参数基址寄存器、实在参数偏移量寄存器和实在参数间接访问寄存器之间的配合,完成实在参数的访问。

在函数执行阶段,在进入函数function11()后,为函数function11()分配对应的活动记录所需的地址空间。在进入函数function11()之前,实在参数基址寄存器的当前值为d0。

将活动记录基址寄存器的值s1更新为实在参数基址寄存器的值d0,将实在参数基址寄存器的值由d0更新为:更新后的活动记录基址寄存器的值d0与function11()对应的活动记录所需的地址空间之差,二者之差为d1,并将返回地址存入到function11()对应的活动记录中固定的位置。

在函数返回之前,活动记录基址寄存器的当前值为d0。在函数返回阶段,根据返回地址返回到调用函数function1()中,并分别对实在参数基址寄存器的值d1和活动记录基址寄存器的值d0进行更新,更新后的实在参数基址寄存器的值由d1更新为d0,将活动基址寄存器的值由d0更新为d0与函数function1()对应的活动记录所需的地址空间之和,也即s1。

参照图2,本发明实施例还提供了一种地址空间分配装置,包括:分配单元201和释放单元202,其中:

分配单元201,用于当检测到调用目标函数的目标指令时,获取实在参数基址寄存器的当前值;将活动记录基址寄存器的值更新为所述实在参数基址寄存器的当前值,将所述实在参数基址寄存器的当前值更新为:更新后的活动记录基址寄存器的值与所述目标函数对应的活动记录所需的地址空间的差值;

释放单元202,用于在检测到所述目标函数执行完成后,释放所述目标函数对应的活动记录所需的地址空间。

在具体实施中,所述释放单元202,可以用于获取活动记录基址寄存器的当前值;将实在参数基址寄存器的值更新为所述活动记录基址寄存器的当前值;将活动记录基址寄存器的当前值更新为:更新后的实在参数基址寄存器的值与调用所述目标函数的函数对应的活动记录所需的地址空间的和值。

在具体实施中,所述地址空间分配装置20还可以包括:实在参数访问单元203,用于在所述分配单元分配与所述目标函数对应的活动记录所需的地址空间之前,访问实在参数。

在具体实施中,所述实在参数访问单元203,可以用于将所述实在参数基址寄存器的当前值与实在参数偏移量寄存器的值相减,得到的差值作为访问所述实在参数的访问地址;根据所述访问地址访问所述实在参数。

在具体实施中,所述地址空间分配装置还可以包括:目标地址获取单元(图2未示出),用于从间接寻址索引寄存器中获取所述目标函数对应的目标地址,所述目标地址为所述活动记录基址寄存器的当前值与写入所述间接访问偏移量寄存器的值的差值。

在具体实施中,所述地址空间分配装置还可以包括:局部符号地址空间分配单元(图2未示出),用于在活动记录中为局部符号分配地址空间,并将所述局部符号与所述活动记录基址寄存器的值之间的偏移量作为所述局部符号的静态坐标。

在具体实施中,所述地址空间分配装置还可以包括:活动记录访问单元(图2未示出),用于当接收到访问所述活动记录的访问指令时,将所述活动记录基址寄存器的值与所述访问指令中携带的地址相减,得到的差值作为所述访问指令对应的访问地址。

在具体实施中,所述活动记录基址寄存器的值用于标记栈底,所述实在参数基址寄存器的值用于标记栈顶。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指示相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:rom、ram、磁盘或光盘等。

虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1