CN113238800A - 堆栈结构和函数调用方法及系统 - Google Patents
堆栈结构和函数调用方法及系统 Download PDFInfo
- Publication number
- CN113238800A CN113238800A CN202110573924.0A CN202110573924A CN113238800A CN 113238800 A CN113238800 A CN 113238800A CN 202110573924 A CN202110573924 A CN 202110573924A CN 113238800 A CN113238800 A CN 113238800A
- Authority
- CN
- China
- Prior art keywords
- function
- stack
- calling
- called
- register
- 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.)
- Granted
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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30134—Register stacks; shift registers
-
- 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/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本申请涉及操作系统程序运行中函数调用技术领域,公开了一种堆栈结构和函数调用方法及系统,能够在调用函数中快速的寻找到被调用函数,提高操作系统的运行效率。该方法包括:预先为每个函数调用分配预设字节的地址空间用于存储其堆栈帧,该堆栈帧存储有对应函数调用的被调用函数的对象句柄,该对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;执行当前函数调用,调用函数利用该对象句柄调用该被调用函数;在该调用函数中执行所调用的被调用函数。
Description
技术领域
本申请涉及操作系统程序运行中函数调用的技术领域,特别涉及函数调用过程中寄存器的使用以及堆栈帧中的内存分配技术。
背景技术
在计算机程序运行时,计算机会使用栈来进行程序数据的动态存储,其中堆栈帧是指栈中存储函数调用信息(如函数名称,局部变量等信息)的空间。为快速寻找每个函数对应堆栈帧的起终位置,将堆栈帧的地址存储于寄存器中,因此寄存器和堆栈帧成为了程序运行必不可少的结构。对于经典的复杂指令集操作系统而言,栈总是向下增长的。寄存器esp始终指向栈顶,寄存器ebp指向一个固定位置,不随函数执行而变化,其堆栈帧结构如图1所示。
现有的程序运行中内存中的堆栈帧结构是向下增长,即栈底在上,栈顶在下,容易混淆栈底和栈帧的概念。同时现有的堆栈帧结构保存的内容,分类不够详尽,并且对于每个函数分配的地址空间不确定,都会降低操作系统的计算效率。
发明内容
本申请的目的在于提供一种堆栈结构和基于该堆栈结构的函数调用方法及系统,能够在调用函数中快速的寻找到被调用函数,提高操作系统的运行效率。
本申请公开了一种函数调用方法,包括以下步骤:
预先为每个函数调用分配预设字节的地址空间用于存储其堆栈帧,所述堆栈帧存储有对应函数调用的被调用函数的对象句柄,所述对象句柄中包含所述被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;
执行当前函数调用,调用函数利用所述对象句柄调用所述被调用函数;
在所述调用函数中执行所调用的被调用函数。
在一个优选例中,所述变量类型偏移值包括寄存器偏移值、线型偏移值和内存偏移值。
在一个优选例中,还包括以下步骤:
在未执行所述被调用函数时,将寄存器bp指向所述调用函数的栈顶的位置以及将寄存器sp指向所述调用函数的栈底的下一个字节的位置;
在执行所述被调用函数时,将所述寄存器bp指向所述被调用函数的栈顶的位置。
在一个优选例中,在执行函数返回时,还包括以下步骤:
将寄存器sp指向当前寄存器bp指向的地址空间,同时将当前寄存器bp指向地址空间存储的内容赋给寄存器bp。
在一个优选例中,所述预设字节长度≥13个字节长度;
所述堆栈帧包括所述调用函数的堆栈帧部分和所述被调用函数的堆栈帧部分;
所述被调用函数的堆栈帧部分占用12个字节的地址空间,用于依次存储原有bp值、所述调用函数的名字、所述调用函数的函数返回地址、所述被调用函数的返回值和所述被调用函数的对象句柄。
在一个优选例中,所述堆栈帧的结构为栈底在下,栈顶在上;
所述执行当前函数调用时,还包括步骤:所述堆栈帧的存储信息依次向下增长。
本申请还公开了一种函数调用系统,包括:
分配模块,用于预先存储每个函数调用分配预设字节的地址空间用于存储其堆栈帧,所述堆栈帧包括对应函数调用的被调用函数的对象句柄,所述对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;
函数调用模块,用于执行当前函数调用,调用函数利用所述对象句柄调用所述被调用函数,并且在所述调用函数中执行所调用的被调用函数。
在一个优选例中,所述变量类型偏移值包括寄存器偏移值,线型偏移值和内存偏移值;
所述函数调用系统还包括寄存单元,所述寄存单元包括寄存器bp和寄存器sp,其中,所述寄存器bp被配置为在未执行所述被调用函数时指向所述调用函数的栈顶的位置并且在执行所述被调用函数时,将所述寄存器bp指向所述被调用函数的栈顶的位置,所述寄存器sp被配置为在未执行所述被调用函数时指向所述调用函数的栈底的下一个字节的位置。
本申请还公开了一种堆栈结构,用于每个函数调用的程序执行过程;
所述堆栈结构包括占用预设字节的地址空间的堆栈帧,所述堆栈帧被配置为存储有对应函数调用的被调用函数的对象句柄,所述对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;
在执行每个函数调用时,对应的调用函数利用所述对象句柄调用所述被调用函数。
在一个优选例中,所述变量类型偏移值包括寄存器偏移值,线型偏移值和内存偏移值;
所述堆栈结构包括寄存单元,所述寄存单元包括寄存器bp和寄存器sp,其中,所述寄存器bp被配置为在未执行所述被调用函数时指向所述调用函数的栈顶的位置并且在执行所述被调用函数时,将所述寄存器bp指向所述被调用函数的栈顶的位置,所述寄存器sp被配置为在未执行所述被调用函数时指向所述调用函数的栈底的下一个字节的位置。
本申请实施方式中,至少包含以下优点和有益效果:
本发明堆栈帧的结构分类更为详尽,包含了被调用函数所属对象的对象句柄,其对被调用函数所属对象的类型,内存结构及指针进行存储,能够在调用函数过程中快速的识别到被调用函数,提高函数调用的执行效率,进而操作系统的运行效率。
同时对每一个被调用函数都分配固定字节的地址空间用于存储其堆栈帧,固定的地址空间大小以及详细的对象句柄,使得调用函数时操作系统运行更加高效。
进一步地,配置函数调用时bp,sp两个寄存器的适应性位置指向,bp寄存器始终指向堆栈帧栈底,sp寄存器指向堆栈帧栈顶的下一个地址空间,进一步提高函数调用的执行效率,进而操作系统的运行效率。
此外,设置向上增长的堆栈帧结构,方便计算地址空间,分辨栈底,栈顶。
本申请的说明书中记载了大量的技术特征,分布在各个技术方案中,如果要罗列出本申请所有可能的技术特征的组合(即技术方案)的话,会使得说明书过于冗长。为了避免这个问题,本申请上述发明内容中公开的各个技术特征、在下文各个实施方式和例子中公开的各技术特征、以及附图中公开的各个技术特征,都可以自由地互相组合,从而构成各种新的技术方案(这些技术方案均因视为在本说明书中已经记载),除非这种技术特征的组合在技术上是不可行的。例如,在一个例子中公开了特征A+B+C,在另一个例子中公开了特征A+B+D+E,而特征C和D是起到相同作用的等同技术手段,技术上只要择一使用即可,不可能同时采用,特征E技术上可以与特征C相组合,则,A+B+C+D的方案因技术不可行而应当不被视为已经记载,而A+B+C+E的方案应当视为已经被记载。
附图说明
图1是一种经典操作系统堆栈帧结构示意图。
图2A是根据本申请一个实施例的处于未执行被调用函数的堆栈结构示意图。
图2B是根据本申请一个实施例的处于执行被调用函数的堆栈结构示意图。
图3是根据本申请的一个实施例的被调用函数对象句柄结构示意图。
图4是根据本申请第二实施方式的函数调用方法流程示意图。
图5是一种程序调用函数运行过程示意图。
图6是根据本申请第三实施方式的函数调用系统结构示意图。
具体实施方式
在以下的叙述中,为了使读者更好地理解本申请而提出了许多技术细节。但是,本领域的普通技术人员可以理解,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本申请所要求保护的技术方案。
术语:
寄存器:具有存储功能的时序逻辑电路。
堆栈帧:在栈中保存一个函数调用所需的维护信息的空间。
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请的实施方式作进一步地详细描述。
本申请的第一实施方式涉及一种新型堆栈结构,该堆栈结构用于每个函数调用的程序执行过程,如图2A、2B和图3所示,该堆栈结构包括占用预设字节的地址空间的堆栈帧,该堆栈帧被配置为存储有对应函数调用的被调用函数的对象句柄,该对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;在执行每个函数调用时,该对象句柄被对应的调用函数利用来调用该被调用函数。
本申请中对象句柄是操作系统分配给对象的唯一标识符。可选地,该变量类型偏移值包括寄存器偏移值、线型偏移值和内存偏移值。具体的,对象句柄中应包含被调用函数所属对象的具体信息以便操作系统识别,如图3所示,在本实施例中,该对象句柄首先存储了被调用函数所属对象的类型信息,如整形,浮点型等。在本申请中变量类型分为寄存器类型、线型和内存三种类型,即在对象句柄中相应存储有对寄存器偏移值、线型偏移值和内存偏移值加以,以方便找到被调用函数所属对象中对应的变量。同时由于函数调用所涉及到的信息会存储在栈中,对栈的偏移值一并存储于该对象句柄中,便于查找函数调用的信息。堆栈类型指示器为系统中存储堆栈类型的地址,主要类型指示器则为其他类型的地址。
本申请中,优选地针对上述对象句柄中存储的变量每个分配一个字节。可选地可以预留至少一个字节的空白空间,以便后续添加功能使用。
优选地,本申请中该堆栈帧占用≥13个字节的地址空间。
在一个实施例中,该堆栈帧可以包括函数调用对应的被调用函数的堆栈帧部分。如图2A和2B该的示例堆栈帧结构图。其中,被调用函数1的堆栈帧部分共有13个字节,第一个字节存储调用函数1的bp值;第二个字节存储调用函数1的名字,第三个字节存储调用函数1的函数返回地址,这三个字节存储的参数均作用于后续的函数返回。同时留有2个字节的空间存储被调用函数1的返回值。最后8个字节存储被调用函数1的图3该的示例对象句柄。在其他实施例中,该堆栈帧还可以同时包括函数调用对应的调用函数的堆栈帧部分。
可选地,该堆栈结构还包括寄存单元,该寄存单元包括寄存器bp和寄存器sp,如图2A和2B该,该寄存器bp被配置为在未执行该被调用函数时指向该调用函数的栈顶的位置并且在执行该被调用函数时,将该寄存器bp指向该被调用函数的栈顶的位置,该寄存器sp被配置为在未执行该被调用函数时指向该调用函数的栈底的下一个字节的位置。这保证在执行当前函数时,寄存器bp始终指向当前执行函数的栈底,sp指向当前执行函数栈顶的下一个地址空间。
可选地,在执行函数返回时,该寄存器sp被配置为指向当前寄存器bp指向的地址空间,该寄存器bp被配置当前寄存器bp指向地址空间存储的内容。
可选地,该堆栈帧结构为栈底在下,栈顶在上,并且在执行当前函数调用时,该堆栈帧的存储信息依次向下增长。
本申请的第二实施方式涉及一种函数调用方法,其流程如图4所示,包括以下步骤:
在步骤401中,预先为每个函数调用分配预设字节的地址空间用于存储其堆栈帧,该堆栈帧存储有对应函数调用的被调用函数的对象句柄,该对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器。
可选地,该变量类型偏移值包括寄存器偏移值,线型偏移值和内存偏移值。
可选地,该预设字节长度≥13个字节长度。
在一个实施例中,该堆栈帧可以包括函数调用对应的被调用函数的堆栈帧部分。如图2A和2B该的示例堆栈帧结构图。其中,被调用函数1的堆栈帧部分共有13个字节,第一个字节存储调用函数1的bp值;第二个字节存储调用函数1的名字,第三个字节存储调用函数1的函数返回地址,这三个字节存储的参数均作用于后续的函数返回。同时留有2个字节的空间存储被调用函数1的返回值。最后8个字节存储被调用函数1的图3该的示例对象句柄。在其他实施例中,该堆栈帧还可以同时包括函数调用对应的调用函数的堆栈帧部分。
之后,进入步骤402中,执行当前函数调用,调用函数利用该对象句柄调用该被调用函数;之后,进入步骤403,在该调用函数中执行所调用的被调用函数。
可选地,该方法还包括以下步骤:
在未执行该被调用函数时,将寄存器bp指向该调用函数的栈顶的位置以及将寄存器sp指向该调用函数的栈底的下一个字节的位置;在执行该被调用函数时,将该寄存器bp指向该被调用函数的栈顶的位置。
可选地,在步骤403之后,执行函数返回时,还包括以下步骤:
将寄存器sp指向当前寄存器bp指向的地址空间,同时将当前寄存器bp指向地址空间存储的内容赋给寄存器bp。
本申请的堆栈帧可选地用于传统的栈底在下,栈顶在上的堆栈帧结构,优选地用于栈底在下,栈顶在上的堆栈帧结构。在使用栈底在下,栈顶在上的堆栈帧结构的实施例中,该方法还包括步骤:执行当前函数调用时,该堆栈帧的存储信息依次向下增长。
可选地,本实施方式的函数调用方法是基于第一实施方式的新型堆栈结构的,在这种情况下,第一实施方式中的技术细节可以应用于本实施方式。
对于上述步骤中涉及的函数调用过程的补充说明:对于一个程序而言,正常的函数调用过程如图5所示,首先执行main函数,然后进入调用函数1中,在调用函数1中,会执行被调用函数1,函数运行完成在按照相反顺序依次返回,最后结束这一main函数的运行。应用于本实施方式中,包括:首先存储调用函数1的堆栈帧部分,接着将被调用函数1的堆栈帧信息存储在栈中。当执行完被调用函数1返回调用函数1时,将当前bp指向的地址空间存储在寄存器sp中,同时将当前寄存器bp指向地址空间存储的内容,即原有的bp值赋给寄存器bp。通过此操作,将寄存器bp与sp恢复为未调用被调用函数1的状态,即完成了被调用函数1的函数返回操作。
本申请的第三实施方式涉及一种函数调用系统,其结构如图6所示,该函数调用系统包括分配模块和函数调用模块。
该分配模块用于预先存储每个函数调用分配预设字节的地址空间用于存储其堆栈帧,该堆栈帧包括对应函数调用的被调用函数的对象句柄,该对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器。
其中,该预设字节长度优选地≥13个字节长度。
在一个实施例中,该堆栈帧可以包括函数调用对应的被调用函数的堆栈帧部分。如图2A和2B该的示例堆栈帧结构图。其中,被调用函数1的堆栈帧部分共有13个字节,第一个字节存储调用函数1的bp值;第二个字节存储调用函数1的名字,第三个字节存储调用函数1的函数返回地址,这三个字节存储的参数均作用于后续的函数返回。同时留有2个字节的空间存储被调用函数1的返回值。最后8个字节存储被调用函数1的图3该的示例对象句柄。在其他实施例中,该堆栈帧还可以同时包括函数调用对应的调用函数的堆栈帧部分。
该函数调用模块用于执行当前函数调用,调用函数利用该对象句柄调用该被调用函数,并且在该调用函数中执行所调用的被调用函数。
可选地,该变量类型偏移值包括寄存器偏移值,线型偏移值和内存偏移值。
可选地,该函数调用系统还包括寄存单元,该寄存单元包括寄存器bp和寄存器sp,该寄存器bp被配置为在未执行该被调用函数时指向该调用函数的栈顶的位置并且在执行该被调用函数时,将该寄存器bp指向该被调用函数的栈顶的位置,该寄存器sp被配置为在未执行该被调用函数时指向该调用函数的栈底的下一个字节的位置。
可选地,执行函数返回时,该寄存器sp被配置为指向当前寄存器bp指向的地址空间,寄存器bp被配置当前寄存器bp指向地址空间存储的内容。
本申请的堆栈帧可选地用于传统的栈底在下,栈顶在上的堆栈帧结构,优选地用于栈底在下,栈顶在上的堆栈帧结构。在使用栈底在下,栈顶在上的堆栈帧结构的实施例中,该函数调用模块还用于执行当前函数调用时,该堆栈帧的存储信息依次向下增长。
需要指出,第二实施方式是与本实施方式相对应的方法实施方式,第二实施方式中的技术细节可以应用于本实施方式,本实施方式中的技术细节也可以应用于第二实施方式。
需要说明的是,本领域技术人员应当理解,上述函数调用系统的实施方式中所示的各模块的实现功能可参照前述函数调用方法的相关描述而理解。上述函数调用系统的实施方式中所示的各模块的功能可通过运行于处理器上的程序(可执行指令)而实现,也可通过具体的逻辑电路而实现。本申请实施例上述函数调用系统如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read OnlyMemory)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件和软件结合。
相应地,本申请实施方式还提供一种计算机可读存储介质,其中存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现本申请的各方法实施方式。计算机可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括但不限于,相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读存储介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
此外,本申请实施方式还提供一种函数调用系统,其中包括用于存储计算机可执行指令的存储器,以及,处理器;该处理器用于在执行该存储器中的计算机可执行指令时实现上述各方法实施方式中的步骤。其中,该处理器可以是中央处理单元(CentralProcessing Unit,简称“CPU”),还可以是其他通用处理器、数字信号处理器(DigitalSignal Processor,简称“DSP”)、专用集成电路(Appl ication Specific IntegratedCircuit,简称“ASIC”)等。前述的存储器可以是只读存储器(read-only memory,简称“ROM”)、随机存取存储器(random access memory,简称“RAM”)、快闪存储器(Flash)、硬盘或者固态硬盘等。本发明各实施方式所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
需要说明的是,在本专利的申请文件中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。本专利的申请文件中,如果提到根据某要素执行某行为,则是指至少根据该要素执行该行为的意思,其中包括了两种情况:仅根据该要素执行该行为、和根据该要素和其它要素执行该行为。多个、多次、多种等表达包括2个、2次、2种以及2个以上、2次以上、2种以上。
在本申请提及的所有文献都被认为是整体性地包括在本申请的公开内容中,以便在必要时可以作为修改的依据。此外应理解,以上所述仅为本说明书的较佳实施例而已,并非用于限定本说明书的保护范围。凡在本说明书一个或多个实施例的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例的保护范围之内。
Claims (10)
1.一种函数调用方法,其特征在于,包括以下步骤:
预先为每个函数调用分配预设字节的地址空间用于存储其堆栈帧,所述堆栈帧存储有对应函数调用的被调用函数的对象句柄,所述对象句柄中包含所述被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;
执行当前函数调用,调用函数利用所述对象句柄调用所述被调用函数;
在所述调用函数中执行所调用的被调用函数。
2.如权利要求1所述的函数调用方法,其特征在于,所述变量类型偏移值包括寄存器偏移值、线型偏移值和内存偏移值。
3.如权利要求1所述的函数调用方法,其特征在于,还包括以下步骤:
在未执行所述被调用函数时,将寄存器bp指向所述调用函数的栈顶的位置以及将寄存器sp指向所述调用函数的栈底的下一个字节的位置;
在执行所述被调用函数时,将所述寄存器bp指向所述被调用函数的栈顶的位置。
4.如权利要求3所述的函数调用方法,其特征在于,在执行函数返回时,还包括以下步骤:
将寄存器sp指向当前寄存器bp指向的地址空间,同时将当前寄存器bp指向地址空间存储的内容赋给寄存器bp。
5.如权利要求1所述的函数调用方法,其特征在于,所述预设字节长度≥13个字节长度;
所述堆栈帧包括所述调用函数的堆栈帧部分和所述被调用函数的堆栈帧部分;
所述被调用函数的堆栈帧部分占用12个字节的地址空间,用于依次存储原有bp值、所述调用函数的名字、所述调用函数的函数返回地址、所述被调用函数的返回值和所述被调用函数的对象句柄。
6.如权利要求1-5中任一项所述的函数调用方法,其特征在于,所述堆栈帧的结构为栈底在下,栈顶在上;
所述执行当前函数调用时,还包括步骤:所述堆栈帧的存储信息依次向下增长。
7.一种函数调用系统,其特征在于,包括:
分配模块,用于预先存储每个函数调用分配预设字节的地址空间用于存储其堆栈帧,所述堆栈帧包括对应函数调用的被调用函数的对象句柄,所述对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;
函数调用模块,用于执行当前函数调用,调用函数利用所述对象句柄调用所述被调用函数,并且在所述调用函数中执行所调用的被调用函数。
8.如权利要求7所述的函数调用系统,其特征在于,所述变量类型偏移值包括寄存器偏移值,线型偏移值和内存偏移值;
所述函数调用系统还包括寄存单元,所述寄存单元包括寄存器bp和寄存器sp,其中,所述寄存器bp被配置为在未执行所述被调用函数时指向所述调用函数的栈顶的位置并且在执行所述被调用函数时,将所述寄存器bp指向所述被调用函数的栈顶的位置,所述寄存器sp被配置为在未执行所述被调用函数时指向所述调用函数的栈底的下一个字节的位置。
9.一种堆栈结构,其特征在于,用于每个函数调用的程序执行过程;
所述堆栈结构包括占用预设字节的地址空间的堆栈帧,所述堆栈帧被配置为存储有对应函数调用的被调用函数的对象句柄,所述对象句柄中包含被调用函数所属对象类型、变量类型偏移值、栈偏移值、堆栈类型指示器和主要类型指示器;
在执行每个函数调用时,对应的调用函数利用所述对象句柄调用所述被调用函数。
10.如权利要求9所述的堆栈结构,其特征在于,所述变量类型偏移值包括寄存器偏移值,线型偏移值和内存偏移值;
所述堆栈结构包括寄存单元,所述寄存单元包括寄存器bp和寄存器sp,其中,所述寄存器bp被配置为在未执行所述被调用函数时指向所述调用函数的栈顶的位置并且在执行所述被调用函数时,将所述寄存器bp指向所述被调用函数的栈顶的位置,所述寄存器sp被配置为在未执行所述被调用函数时指向所述调用函数的栈底的下一个字节的位置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110573924.0A CN113238800B (zh) | 2021-05-25 | 2021-05-25 | 堆栈帧结构和函数调用方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110573924.0A CN113238800B (zh) | 2021-05-25 | 2021-05-25 | 堆栈帧结构和函数调用方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113238800A true CN113238800A (zh) | 2021-08-10 |
CN113238800B CN113238800B (zh) | 2022-06-28 |
Family
ID=77138848
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110573924.0A Active CN113238800B (zh) | 2021-05-25 | 2021-05-25 | 堆栈帧结构和函数调用方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113238800B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115061837A (zh) * | 2022-08-16 | 2022-09-16 | 苏州浪潮智能科技有限公司 | 一种调度跟踪和获取用户空间调用栈的方法和装置 |
Citations (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2093450A1 (en) * | 1993-04-06 | 1994-10-07 | Ian R. Ameline | Method and Procedure Call Mechanism for Calling 16-Bit Functions from 32-Bit Functions |
US6009258A (en) * | 1997-09-26 | 1999-12-28 | Symantec Corporation | Methods and devices for unwinding stack of frozen program and for restarting the program from unwound state |
US20020188931A1 (en) * | 2001-02-28 | 2002-12-12 | International Business Machines Corporation | Method for unwinding a program call stack |
CN1632761A (zh) * | 2003-12-24 | 2005-06-29 | 华为技术有限公司 | 一种遍历和访问被测应用程序中对象的方法 |
CN1791860A (zh) * | 2003-05-20 | 2006-06-21 | 英特尔公司 | 用于在受控运行时环境中恢复同步到面向对象的软件应用的装置和方法 |
US20060195824A1 (en) * | 2005-02-28 | 2006-08-31 | Tatsuya Iwamoto | Methods and apparatus for segmented stack management in a processor system |
CN101038545A (zh) * | 2006-11-10 | 2007-09-19 | 清华大学 | 操作系统内核构件跨域运行的方法 |
CN101241464A (zh) * | 2007-02-05 | 2008-08-13 | 中兴通讯股份有限公司 | 一种检测堆栈帧破坏的方法 |
US20080282358A1 (en) * | 2007-05-07 | 2008-11-13 | Intel Corporation | Protecting Caller Function from Undesired Access by Callee Function |
CN102109975A (zh) * | 2009-12-24 | 2011-06-29 | 华为技术有限公司 | 确定函数调用关系的方法、装置及系统 |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
CN105468965A (zh) * | 2014-08-21 | 2016-04-06 | 西安慧泽知识产权运营管理有限公司 | 一种动态堆栈内存管理方法 |
CN106502745A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种函数调用方法和装置 |
CN106802785A (zh) * | 2016-12-13 | 2017-06-06 | 北京华为数字技术有限公司 | 一种栈解析方法和装置 |
CN107229862A (zh) * | 2017-06-06 | 2017-10-03 | 电子科技大学 | 基于模拟栈和线程注入的一种rop攻击栈溢出防护方法 |
CN107333151A (zh) * | 2017-06-30 | 2017-11-07 | 武汉斗鱼网络科技有限公司 | 一种视频流地址鉴权方法及装置 |
CN107480029A (zh) * | 2017-08-02 | 2017-12-15 | 北京深思数盾科技股份有限公司 | 一种函数调用时间的监控方法及装置 |
CN107515769A (zh) * | 2016-06-16 | 2017-12-26 | 中兴通讯股份有限公司 | 一种变量信息提取方法及装置 |
CN108984328A (zh) * | 2017-05-31 | 2018-12-11 | 中兴通讯股份有限公司 | 一种堆栈回溯的方法及装置 |
CN110489179A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧函数签名的方法、装置、介质和设备 |
CN110764941A (zh) * | 2019-09-05 | 2020-02-07 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN111190604A (zh) * | 2019-12-30 | 2020-05-22 | 航天信息股份有限公司 | 一种安卓应用内存混淆方法、装置、电子设备及介质 |
-
2021
- 2021-05-25 CN CN202110573924.0A patent/CN113238800B/zh active Active
Patent Citations (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2093450A1 (en) * | 1993-04-06 | 1994-10-07 | Ian R. Ameline | Method and Procedure Call Mechanism for Calling 16-Bit Functions from 32-Bit Functions |
US6009258A (en) * | 1997-09-26 | 1999-12-28 | Symantec Corporation | Methods and devices for unwinding stack of frozen program and for restarting the program from unwound state |
US20020188931A1 (en) * | 2001-02-28 | 2002-12-12 | International Business Machines Corporation | Method for unwinding a program call stack |
CN1791860A (zh) * | 2003-05-20 | 2006-06-21 | 英特尔公司 | 用于在受控运行时环境中恢复同步到面向对象的软件应用的装置和方法 |
CN1632761A (zh) * | 2003-12-24 | 2005-06-29 | 华为技术有限公司 | 一种遍历和访问被测应用程序中对象的方法 |
US20060195824A1 (en) * | 2005-02-28 | 2006-08-31 | Tatsuya Iwamoto | Methods and apparatus for segmented stack management in a processor system |
CN101038545A (zh) * | 2006-11-10 | 2007-09-19 | 清华大学 | 操作系统内核构件跨域运行的方法 |
CN101241464A (zh) * | 2007-02-05 | 2008-08-13 | 中兴通讯股份有限公司 | 一种检测堆栈帧破坏的方法 |
US20080282358A1 (en) * | 2007-05-07 | 2008-11-13 | Intel Corporation | Protecting Caller Function from Undesired Access by Callee Function |
CN102109975A (zh) * | 2009-12-24 | 2011-06-29 | 华为技术有限公司 | 确定函数调用关系的方法、装置及系统 |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
CN105468965A (zh) * | 2014-08-21 | 2016-04-06 | 西安慧泽知识产权运营管理有限公司 | 一种动态堆栈内存管理方法 |
CN107515769A (zh) * | 2016-06-16 | 2017-12-26 | 中兴通讯股份有限公司 | 一种变量信息提取方法及装置 |
CN106502745A (zh) * | 2016-10-26 | 2017-03-15 | 腾讯科技(深圳)有限公司 | 一种函数调用方法和装置 |
CN106802785A (zh) * | 2016-12-13 | 2017-06-06 | 北京华为数字技术有限公司 | 一种栈解析方法和装置 |
CN108984328A (zh) * | 2017-05-31 | 2018-12-11 | 中兴通讯股份有限公司 | 一种堆栈回溯的方法及装置 |
CN107229862A (zh) * | 2017-06-06 | 2017-10-03 | 电子科技大学 | 基于模拟栈和线程注入的一种rop攻击栈溢出防护方法 |
CN107333151A (zh) * | 2017-06-30 | 2017-11-07 | 武汉斗鱼网络科技有限公司 | 一种视频流地址鉴权方法及装置 |
CN107480029A (zh) * | 2017-08-02 | 2017-12-15 | 北京深思数盾科技股份有限公司 | 一种函数调用时间的监控方法及装置 |
CN110489179A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧函数签名的方法、装置、介质和设备 |
CN110764941A (zh) * | 2019-09-05 | 2020-02-07 | 北京字节跳动网络技术有限公司 | 获取调用栈栈帧指令偏移的方法、装置、介质和设备 |
CN111190604A (zh) * | 2019-12-30 | 2020-05-22 | 航天信息股份有限公司 | 一种安卓应用内存混淆方法、装置、电子设备及介质 |
Non-Patent Citations (4)
Title |
---|
刘海军: "pSOS通过地址进行任意函数调用的实现", 《机电工程技术》 * |
吴多多等: "利用堆栈模拟C语言中函数的调用过程", 《科技信息》 * |
宋新爱等: "C程序的函数调用可视化研究", 《软件导刊》 * |
火善栋: "通过汇编语言理解函数调用的内在机理", 《计算机时代》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115061837A (zh) * | 2022-08-16 | 2022-09-16 | 苏州浪潮智能科技有限公司 | 一种调度跟踪和获取用户空间调用栈的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN113238800B (zh) | 2022-06-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9977598B2 (en) | Electronic device and a method for managing memory space thereof | |
CN111131352A (zh) | 主题切换方法及装置 | |
KR102111871B1 (ko) | 랜덤 문자열을 생성하기 위한 방법 및 장치 | |
CN113238800B (zh) | 堆栈帧结构和函数调用方法及系统 | |
CN111400005A (zh) | 一种数据处理方法、装置及电子设备 | |
CN111159278B (zh) | 数据展示方法及装置、电子设备和计算机可读存储介质 | |
CN110716813A (zh) | 数据流处理方法、装置、可读存储介质及处理器 | |
CN112488688A (zh) | 基于区块链的交易处理方法、装置、设备及存储介质 | |
CN111355672A (zh) | 一种报文转发的方法及装置 | |
CN109213745B (zh) | 一种分布式文件存储方法、装置、处理器及存储介质 | |
CN110362298B (zh) | 一种基于浏览器的目标对象绘制方法、装置和浏览器 | |
CN112860412B (zh) | 业务数据处理方法、装置、电子设备及存储介质 | |
CN111666150B (zh) | 存储空间的分配方法、装置、终端及计算机可读存储介质 | |
CN110764930B (zh) | 基于消息模式的请求或应答处理方法及装置 | |
CN112416534A (zh) | 一种基于Agent的任务管理方法及装置 | |
CN110019544B (zh) | 数据查询方法及系统 | |
CN115714775A (zh) | 一种负载均衡方法及装置 | |
CN110618946A (zh) | 堆栈内存分配方法、装置、设备和存储介质 | |
CN114595056A (zh) | 一种栈的自动增长处理系统及方法 | |
WO2010095004A1 (en) | Priority search trees | |
CN112068948B (zh) | 数据散列方法、可读存储介质和电子设备 | |
CN113254186A (zh) | 一种进程调度方法、调度器及存储介质 | |
CN112566049A (zh) | 业务信道分配方法及相关装置 | |
CN112099943A (zh) | 内存分配方法及相关设备 | |
CN112507652B (zh) | 一种双倍速率同步动态随机存储器的分组方法及装置 |
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 |