CN111133419B - 用于独立定义的操作的堆栈安全 - Google Patents
用于独立定义的操作的堆栈安全 Download PDFInfo
- Publication number
- CN111133419B CN111133419B CN201880062179.XA CN201880062179A CN111133419B CN 111133419 B CN111133419 B CN 111133419B CN 201880062179 A CN201880062179 A CN 201880062179A CN 111133419 B CN111133419 B CN 111133419B
- Authority
- CN
- China
- Prior art keywords
- stack
- function
- application
- pointing
- executing
- 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
Links
- 238000000034 method Methods 0.000 claims abstract description 62
- 230000006870 function Effects 0.000 claims description 541
- 230000015654 memory Effects 0.000 claims description 97
- 230000008569 process Effects 0.000 claims description 39
- 230000008859 change Effects 0.000 description 15
- 238000004891 communication Methods 0.000 description 8
- 230000008901 benefit Effects 0.000 description 6
- 230000000007 visual effect Effects 0.000 description 4
- KDLHZDBZIXYQEI-UHFFFAOYSA-N Palladium Chemical compound [Pd] KDLHZDBZIXYQEI-UHFFFAOYSA-N 0.000 description 2
- 230000004075 alteration Effects 0.000 description 2
- 230000000763 evoking effect Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000010076 replication Effects 0.000 description 2
- 239000007787 solid Substances 0.000 description 2
- 238000004378 air conditioning Methods 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 238000010438 heat treatment Methods 0.000 description 1
- 229910052763 palladium Inorganic materials 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000009423 ventilation Methods 0.000 description 1
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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
-
- 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/46—Multiprogramming arrangements
- G06F9/461—Saving or restoring of program or task context
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Executing Machine-Instructions (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了用于当一个应用程序调用另一个应用程序时在与相应的应用程序相关联的堆栈之间进行交换或改变的系统和方法。
Description
相关申请的交叉引用
本申请要求于2017年8月24日提交的美国临时专利申请号62/549,637的权益,该临时专利申请的全部内容以引用的方式并入本文。
背景技术
当计算设备执行进行函数调用的应用程序时,计算设备可以在进行函数调用时使用堆栈来存储例如寄存器值、函数参数值、返回地址和局部变量。
发明内容
根据一个示例,一种装置可以包括至少一个处理器,并且还可以包括通信地耦合到该至少一个处理器的至少一个有形存储器模块。该至少一个有形存储器模块可以已经在其上存储有第一应用程序的软件指令和第二应用程序的软件指令,其中第二应用程序可以包括第一函数和第二函数,并且其中第一应用程序可以具有与其相关联的第一堆栈,并且第二应用程序可以具有与其相关联的第二堆栈。第一应用程序和第二应用程序的软件指令在由至少处理器执行时可以指引至少一个处理器执行第一应用程序,其中在执行第一应用程序时,堆栈指针寄存器可以指向第一堆栈。软件指令在由至少处理器执行时可以进一步指引该至少处理器在执行第一应用程序时调用第二应用程序的第一函数,其中调用该第一函数可以包括将数据值推送到第一堆栈上,并且其中堆栈指针寄存器可以在将数据值推送到第一堆栈上之后指向第一堆栈。软件指令在由至少一个处理器执行时可以进一步指引至少处理器执行第一函数,其中执行该第一函数可以包括确定堆栈指针寄存器是正在指向第一堆栈还是正在指向第二堆栈。至少部分地基于确定堆栈指针寄存器正在指向第一堆栈,软件指令在由至少处理器执行时可以进一步指引至少处理器使堆栈指针寄存器从指向第一堆栈改变为指向第二堆栈。当软件指令由至少处理器执行时可以进一步指引至少处理器从第一函数调用第二函数,使用第二堆栈执行第二函数,在第二函数完成时,将堆栈指针寄存器从指向第二堆栈改变为指向第一堆栈,返回第一应用程序,并且继续使用第一堆栈执行第一应用程序。
根据另一个示例,一种装置可以包括至少一个处理器,并且还可以包括通信地耦合到该至少一个处理器的至少一个有形存储器模块。该至少一个有形存储器模块可以在其上存储有第一应用程序的软件指令和第二应用程序的软件指令。软件指令在由至少处理器执行时可以指引至少一个处理器执行第一应用程序,并且在执行第一应用程序时,调用第二应用程序的第一函数,其中调用第一函数可以包括将数据值推送到第一堆栈上,并且其中堆栈指针寄存器可以在推送数据值之后指向第一堆栈。软件指令在由至少处理器执行时可以进一步指引至少处理器在执行第一函数时将堆栈指针寄存器从指向第一堆栈改变为指向第二堆栈。软件指令在由至少处理器执行时可以进一步指引至少处理器将位于第一堆栈上的第一数据值从第一堆栈复制到第二堆栈,调用第二应用程序的第二函数,并且使用第二堆栈执行第二函数。在第二函数完成时,软件指令在由至少处理器执行时可以进一步指引至少处理器将堆栈指针寄存器从指向第二堆栈改变为指向第一堆栈。软件指令在由至少处理器执行时可以进一步指引至少处理器将位于第二堆栈上的第二数据值从第二堆栈复制到第一堆栈,返回第一应用程序,并且使用第一堆栈继续执行第一应用程序。
以上优点和特征仅仅是代表性实施方案。它们不被视为是限制。在以下描述、附图和权利要求书中,实施方案的附加特征和优点将变得显而易见。
附图说明
图1示出了示例性计算设备。
图2示出了图1的计算设备的示例性存储器配置。
图3示出了图1的计算设备的另一个示例性存储器配置,并且特别地,示出了调用第二函数的第一函数的示例性执行,其中第一函数和第二函数驻留在不同的存储器分段中。
图4示出了示例性代码序列,该示例性代码序列包括在执行函数之前从第一堆栈交换或改变到第二堆栈,使用第二堆栈执行该函数,然后一旦该函数完成,就从第二堆栈交换回第一堆栈。
图5示出了可以在执行函数之前执行的从第一堆栈交换或改变到第二堆栈的示例性过程。
图6示出了可以在执行函数之后执行的从第二堆栈交换或改变到第一堆栈的示例性过程。
图7A至图7B示出了在执行函数之前和之后交换或改变堆栈的示例性过程,并且特别地,在堆栈之间进行交换时,将数据推送到这些堆栈上以及将数据从这些堆栈中弹出并且在这些堆栈之间复制数据。
图8A至图8I示出堆栈的示例性状态,其中这些状态与图7A至图7B的过程中的各个点一致。
图9示出了可以在执行函数之前执行的从第一堆栈交换或改变到第二堆栈的示例性代码序列。
图10示出了可以在执行函数之后执行的从第二堆栈交换或改变到第一堆栈的示例性代码序列。
具体实施方式
参考图1,示出了示例性计算设备(例如,在本文中也被称为设备和/或计算系统和/或系统)100。计算设备100可以包括一个或多个处理器102(在本文中仅出于描述的目的被称为处理器)。处理器102可以基于MCF5275指令集架构,但是其他指令集架构也是可能的,并且本文所讨论的过程和系统不限于MCF5275架构。MCF5275指令集架构在本文中仅用于描述的目的。作为一个示例,处理器102可以是ColdFire 5275微处理器,但是可以使用其他处理器。处理器102可以通过执行一个或多个基于软件和/或固件的应用程序的一个或多个指令来控制计算设备100的功能性,如本文进一步所述。处理器102可以包括一个或多个寄存器,诸如指令指针寄存器(在本文中也被称为指令指针)、堆栈指针寄存器(在本文中也被称为堆栈指针)、堆栈帧指针寄存器(在本文中也被称为堆栈帧指针)、一个或多个暂存寄存器等。出于讨论的目的,本文的示例将假定处理器102具有四个暂存寄存器。计算设备100还可以包括非易失性存储器104和可以通信地耦合到处理器102的易失性存储器106。非易失性存储器104可以是可以被擦除和重新编程的存储器。例如,非易失性存储器104可以包括一个或多个存储器设备,诸如固态驱动器(SSD),诸如固态闪存存储器、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、硬盘驱动器、光盘驱动器等,但是可以使用其他类型的非易失性存储器设备。非易失性存储器104可以是不可移动存储器和/或可移动存储器,诸如记忆棒/USB驱动器、存储器卡或任何其他类型的可移动存储器。如本文中进一步描述的,非易失性存储器104可以用于永久地存储一个或多个基于软件的应用程序(其中永久性可以例如是指应用程序在计算设备100的重启和/或重置之间保留在存储器中)。易失性存储器106可以是一个或多个存储器设备,并且可以包括例如随机存取存储器(RAM),并且可以是一个或多个集成电路的形式。存储器106可以由处理器102用于执行存储在非易失性存储器104中的基于软件的应用程序。将认识到,计算设备100可以包括其他和/或附加类型的存储器设备,包括只读存储器(ROM),以及处理器102内部/一部分的存储器。
计算设备100还可以包括一个或多个网络接口控制器/电路,以用于通过一个或多个有线和/或无线通信网络和/或信道140进行通信(传输和/或接收)。例如,计算设备100可以包括使计算设备100能够通过一个或多个无线通信网络/信道(例如,近场通信(NFC)、/>蜂窝、Wi-Fi Direct、专有通信信道,诸如CLEARCONNECTTM、LiFe、红外等)进行无线通信的一个或多个无线网络接口控制器和一个或多个天线114(以及例如对应的驱动器)。计算设备100可以包括使计算设备100能够通过一个或多个低速通信网络/信道(例如,RS232等)进行通信的一个或多个有线、低速网络接口控制器116(以及例如对应的驱动器)。计算设备100可以包括使计算设备100能够通过一个或多个高速通信网络/信道(例如,以太网、光纤等)进行通信的一个或多个有线、高速网络接口控制器118(以及例如对应的驱动器)。网络接口控制器114、116和118可以与处理器102通信,以用于使例如在计算设备100上执行的一个或多个基于软件的应用程序能够通过一个或多个网络140与其他计算设备传输和/或接收信息。
计算设备100还可以包括可以通信地耦合到处理器102的一个或多个输入/输出(I/O)接口控制器120(以及例如对应的驱动器)。一个或多个I/O接口控制器120可以允许一个或多个I/O设备132与计算设备100对接。示例性I/O设备132可以包括例如键盘、触敏垫、鼠标、轨迹球、音频扬声器和/或音频接收器等中的一个或多个。计算设备100还可包括可通信地耦合到处理器102的一个或多个图形处理器108(以及例如对应的驱动器)。一个或多个图形处理器108可以允许一个或多个视觉显示屏130与计算设备100对接。例如,一个或多个I/O接口控制器120、一个或多个I/O设备132、一个或多个图形处理器108和一个或多个视觉显示屏130可以允许用户与例如在计算设备100上执行的一个或多个基于软件的应用程序进行交互。
计算设备100还可以包括可以通信地耦合到处理器102的一个或多个致动器110(例如,一个或多个按钮、一个或多个开关等)。一个或多个致动器110可以允许用户与例如在计算设备100上执行的一个或多个基于软件的应用程序进行交互,以诸如通过重置等来控制计算设备100。计算设备100还可包括例如可通信地耦合到处理器102的一个或多个LED指示器112。一个或多个LED指示器112还可以允许用户与例如在计算设备100上执行的一个或多个基于软件的应用程序进行交互。一个或多个处理器102、非易失性存储器104、易失性存储器106、网络接口控制器114、116和118、一个或多个I/O接口控制器120、一个或多个图形处理器108、一个或多个致动器110和一个或多个LED指示器112在本文中可以单独地以及/或者统称为模块和/或计算模块。计算设备100的模块可以由一个或多个功率源122供电。例如,一个或多个功率源122可以包括一个或多个AC功率供应和/或一个或多个DC功率供应。一个或多个功率源122可以生成例如用于为计算设备100的模块供电的一个或多个供应电压VCC。
将认识到,计算设备100可以不包括所述模块中的每一个和/或可以包括附加模块和/或其他模块。根据一个示例,计算设备100可以是嵌入式设备或系统,并且可以被配置为例如通过执行一个或多个基于软件的应用程序来提供一个或多个专用功能。根据另一个示例,计算设备100的处理器102可以不包括存储器管理单元。尽管如此,本文所公开的过程和系统也适用于包括存储器管理单元的设备。根据特定示例,负载控制系统内的一个或多个设备(诸如Lutron’s和/或/>照明控制和能量管理系统)可以至少部分地被配置为类似于计算设备100并且如本文所述地操作。此类负载控制系统可以包括例如用于控制环境中的照明负载的照明控制系统、用于控制提供给环境的自然光的电动窗处理控制系统,以及用于控制用户环境中的温度的供暖、通风和空气调节(HVAC)系统。例如,Lutron Palladiom恒温器、Lutron Quantum处理器和/或Lutron ESN-EcoSystem模块可以至少部分地被配置为像计算设备100那样操作,如本文所述。同样,这些是示例,其他示例也是可能的。
现在参考图2,示出了例如非易失性存储器104的示例性布局或配置202,以及例如易失性存储器106的示例性布局或配置220。图2的示例和本文的其他示例被示出为使用字节寻址(在图2中地址被指定为201),其中每个地址可以表示一个8位字节。将认识到,这仅仅是示例,并且可以使用其他寻址格式,诸如字寻址,其中存储器的每个地址可以例如表示16位的字。另外,如下所述,非易失性存储器104和易失性存储器106可以被称为具有分段或分区(这些术语在本文中可以互换使用)。这些分段可以在各个存储器104和106内具有明确定义的大小(例如,字节数)和明确定义的位置(即,地址位置和范围)。本文中使用的以及如图2所示的分段的实际大小和位置以及各个存储器104和106的大小仅仅是示例,并且将认识到可以使用其他大小和位置。最后,当在本文中示出地址201时,这些地址以十六进制格式表示并且表示8位字节,但是同样可以使用其他格式。
根据图2的示例,非易失性存储器104可以被分成包括第一分段204和第二分段206的两个或更多个分段。出于讨论的目的,分段204在本文中可以被称为“引导闪存”或“引导闪存存储器”204,并且分段206在本文中可以被称为“OS闪存”或“OS闪存存储器”206。分段202和204中的每一个可以具有明确定义的大小(即,例如限定数量的字节),并且被定位于非易失性存储器104中的明确定义的地址处。在该示例中,引导闪存/分段204可以从地址0x00000000(仅出于描述的目的,在本文中也被称为“引导闪存的开始”)扩展到地址“引导闪存的结束(该术语仅用于描述的目的)”,并且OS闪存存储器/分段206可以从地址“OS闪存的开始”(该术语仅用于描述的目的)扩展到地址0x00FFFFFF(仅出于描述的目的,在本文中也被称为“OS闪存的结束”)。计算设备100可以被配置为使得应用程序208(出于描述的目的,在本文中被称为“引导加载程序应用程序”、“引导加载程序”、“引导程序”和/或“引导程序加载程序”)存储在引导闪存存储器/分段204中。例如,应用程序208可以包括可以由处理器102执行的一个或多个指令。计算设备100可以被进一步配置为使得应用程序210(仅出于描述的目的,在本文中可以被称为操作系统(OS)应用程序或“OS应用程序”)被存储在OS闪存存储器/分段206中。例如,应用程序210可以包括可以由处理器102执行的一个或多个指令。虽然应用程序210和分段206在本文中分别被称为OS应用程序和OS闪存存储器,但是短语“操作系统”或“OS”的使用仅出于讨论的目的。例如,应用程序210可以是操作系统,它可以是操作系统,并且还包括一个或多个函数或例程,当该一个或多个函数或例程由处理器102执行时使计算设备100提供计算设备100旨在在运行时环境中提供的一个或多个特定目的或特征或功能。将认识到,应用程序210可以是任何其他类型的应用程序。一般来讲,作为一个示例,引导加载程序208可以是例如在计算设备100上电和/或重置时由处理器102最初执行,并且初始化计算设备100,然后使处理器102通过向其转移控制或执行来执行OS应用程序210的应用程序。此后,引导加载程序208可以停止由处理器102执行。应用程序210可以是当由处理器102执行时将计算设备100配置为在运行时环境(诸如负载控制系统)内提供一个或多个特定目的或特征的应用程序。
更具体地,引导加载程序208可以是基于软件和/或固件的应用程序。引导加载程序应用程序208可以由一个或多个指令组成,该一个或多个指令可以由处理器102执行。这些指令可以被布置为一个或多个函数,其中一个函数在图2中被代表性地示出为“引导函数n”209(其中“n”旨在表示函数209可能是许多函数诸如第一函数、第二函数、第三函数等中的一个)。当计算设备100最初被上电和/或被重置时,计算设备100可以被配置为使得处理器102自动执行引导加载程序208的一个或多个函数。引导加载程序208的函数可以包括确定设备100的模块是否正常运行的诊断函数、初始化设备100的模块的初始化函数等。将认识到,这些仅仅是示例,并且引导加载程序应用程序208可以包括其他类型的函数,包括例如可以由于用户与引导加载程序208进行交互而执行的函数和/或可以从OS应用程序210调用或唤起的函数,如本文进一步讨论的。引导加载程序208可以被配置为向用户提供信息(诸如通过一个或多个LED指示器112和一个或多个视觉显示屏130)。该引导加载程序还可以被配置为允许用户(诸如通过一个或多个I/O设备132和一个或多个致动器110)与计算设备100进行交互/控制该计算设备,诸如以向引导加载程序208提供信息,以具体调用或唤起引导加载程序的一个或多个函数等。将认识到,引导加载程序208可以将计算设备100配置为允许用户以其他方式与计算设备100进行交互,包括例如使用网络接口控制器114、116和118中的任何一个经由一个或多个网络140远程交互。根据一个示例并且如上所述,处理器102可以在重置和/或上电时自动执行引导加载程序208的一个或多个函数。引导加载程序一旦完成例如一个或多个诊断函数和初始化函数的执行,就可以停止执行,并且通过将执行转移到OS应用程序来使处理器102自动执行OS应用程序210的一个或多个函数。
OS应用程序210可以是基于软件和/或固件的应用程序。OS程序应用程序210可以由一个或多个指令组成,该一个或多个指令可以由处理器102执行。这些指令可以被布置为一个或多个函数,其中一个函数在图2中被代表性地示出为“OS函数n”211(其中“n”旨在表示函数211可能是许多函数诸如第一函数、第二函数、第三函数等中的一个)。OS应用程序210可以是例如操作系统(OS)应用程序和/或一个或多个函数,该OS应用程序和/或一个或多个函数在由处理器102执行时例如使计算设备100在运行时环境(诸如负载控制系统)内提供一个或多个特定的目的和/或特征。OS应用程序210可以被配置为独立于用户执行并且/或者可以被配置为允许用户诸如通过(诸如通过一个或多个LED指示器112和一个或多个视觉显示屏130)向用户提供信息来与计算设备100进行交互。该OS应用程序还可以被配置为允许用户通过向OS应用程序提供信息,通过调用或唤起OS应用程序的一个或多个函数等(诸如通过I/O设备132和一个或多个致动器110)来与计算设备100进行交互/控制该计算设备。将认识到,OS应用程序可以将计算设备100配置为允许用户以其他方式与计算设备100进行交互,包括例如使用网络接口控制器114、116和118中的任何一个经由一个或多个网络140远程交互。根据一个示例,OS应用程序210可以提供有限的操作系统功能性。作为一个示例,OS应用程序210可以不提供动态堆栈管理。作为一个示例,计算设备100可以是裸机计算系统,即,没有基本操作系统的系统。
将认识到,非易失性存储器104的上述配置是一个示例,并且其他示例性配置也是可能的,包括其他类型的应用程序208和210。
现在参考图2的易失性存储器106,该存储器可以被分成包括第一分段222和第二分段224的两个或更多个分段。出于讨论的目的,分段222在本文中可以被称为“引导RAM”222,并且出于讨论的目的,分段224在本文中可以被称为“OS RAM”224。引导RAM/分段222和OS RAM/分段224中的每一个可以具有明确定义的大小(即,例如限定数量的字节),并且被定位于存储器106中的明确定义的地址处。在该示例中,引导RAM 222可以从地址0x10000000(仅出于描述的目的,在本文中也被称为“引导RAM的开始”)扩展到地址“引导RAM的结束”(该术语仅用于描述的目的)。OS RAM 224可以从地址“OSRAM的开始”(该术语仅用于描述的目的)扩展到地址0x11FFFFFF(仅出于描述的目的,在本文中也被称为“OS RAM的结束”)。当引导加载程序208由处理器102执行时,该引导加载程序可以被配置为使处理器102出于至少两个目的使用引导RAM 222,包括堆栈空间(例如,当引导加载程序函数调用另一个引导加载程序函数时可以从中分配存储器的存储器空间)和堆空间(例如,可以由引导加载程序208的一个或多个函数从中动态地分配存储器的存储器空间)。仅出于讨论的目的,引导RAM 222的堆栈空间在本文中可以被称为“引导堆栈空间”或“引导堆栈”(其示例在图2中被示出为引导堆栈226),并且堆空间可以在本文中被称为“引导堆空间”或“引导堆”(其示例在图2中被示出为引导堆228)。根据该示例,引导加载程序208可以是单个进程或线程,因此,可以只存在一个引导堆栈226。然而,将认识到,引导加载程序可以是多进程应用程序,并且可以具有多于一个堆栈,每个进程/线程一个堆栈。计算设备100可以被配置为使得引导堆栈226位于明确定义的位置处并且具有明确定义的最大大小。例如,该位置和大小可以在引导加载程序内静态定义,也可以在编译应用程序时定义。根据该示例,引导堆栈226可以位于地址“引导RAM的开始”处,并且可以是许多大小明确定义的字节,该大小在本文中被称为“最大引导堆栈大小”(该术语仅用于描述的目的)。根据另一个示例,易失性存储器106中的引导堆栈226的位置可以不是静态定义的位置,即,该位置可以从存储器106动态分配。如下所述,可能有必要了解引导堆栈在存储器106中的位置。当动态分配时,引导加载程序208可以在被分配后确定其位置。
类似地,当引导加载程序208使处理器102将执行转移到OS应用程序210并且因此停止执行时,OS应用程序可以被配置为使处理器102将OS RAM 224用于至少两个目的,包括堆栈空间(例如,当OS函数调用另一个OS函数时从中分配存储器的存储器空间)和堆空间(即,可以由OS应用程序的一个或多个函数从中动态地分配存储器的空间)。例如,假设OS应用程序是多进程/多线程的应用程序,则每个进程和/或线程可以具有其自身的堆栈空间。仅出于讨论的目的,在图2中示出了一个堆栈空间230(仅出于讨论的目的,可以将其假定为当OS应用程序正在执行时当前正在在处理器102上执行的进程或线程的堆栈空间)。仅出于讨论的目的,该堆栈在本文中被称为“OS堆栈空间”或“OS堆栈”230,并且OS RAM 224的堆空间在本文中将被称为“OS堆空间”或“OS堆”(其示例在图2中被示出为OS堆232)。计算设备100可以被配置为使得OS堆栈230位于定义的位置处(例如,对于给定的进程或线程,该定义的位置可以是动态的,例如当创建进程/线程时)并且具有明确定义的最大大小。
将认识到,易失性存储器106的上述配置是一个示例,并且其他示例性配置也是可能的。
一般来讲,关于堆栈空间,如本领域中已知的,当函数(例如,调用者函数)调用或唤起另一个函数(例如,被调用者函数)时,被调用者函数可以从堆栈中分配存储器块或可以在堆栈上使用存储器块。该分配的存储器块可以被称为堆栈帧或被调用者函数的堆栈帧。当一个函数调用另一个函数时,可以在堆栈上为每个函数分配一个堆栈帧。被调用者函数的堆栈帧可以用于存储例如各种数据、值或信息。例如,堆栈帧可以用于保存处理器102的一个或多个寄存器的值,诸如暂存寄存器值,以允许被调用者函数使用这些寄存器。当被调用者函数结束并且将执行返回给调用者函数时,这些堆栈值可以返回到暂存寄存器,从而在调用者函数也使用暂存寄存器的情况下恢复调用者函数的上下文。堆栈帧还可以用于将一个或函数参数从调用者函数传递给被调用者函数。堆栈帧可以用作被调用者函数所使用的变量的已分配空间。当被调用者函数将执行返回给调用者函数时,堆栈帧可以用于存储待执行的下一个指令的返回地址。众所周知,处理器可以具有将地址存储到当前堆栈帧中的堆栈帧指针寄存器(在本文中也被称为堆栈帧指针)。当调用者函数调用被调用者函数时,堆栈帧指针寄存器可能被更新为指向被调用者函数的堆栈帧,其中堆栈帧指针寄存器的先前的值被存储到被调用者函数的堆栈帧。将认识到,这些仅是示例。
在任何给定时间,堆栈的一部分可能是活动的(例如,由于一个或多个函数调用而包含数据值),并且堆栈的一部分可能是非活动的(例如,由于一个或多个函数调用而不包含数据值)。例如,如上所述,在进行函数调用时(即,在调用或唤起函数时),可以将数据添加到堆栈,并且可以说该堆栈增长。类似地,当函数结束时,可以从堆栈中移除数据,并且可以说该堆栈缩小。数据可以以后进先出的方式添加到堆栈或从堆栈中移除。将数据添加到堆栈在本文中可以被称为将数据推送到堆栈上,并且将数据从堆栈中移除在本文中可以被称为从堆栈中弹出数据。堆栈在本文中可以被描述为从其最顶部、最大的地址向其最小的地址增长,但是将认识到,堆栈可以在另一个方向上增长和缩小。例如,引导堆栈226可以从其最大的/最高的地址开始,并且随着每次将数据推送到堆栈上而向其最低地址增长(即,向在图2的示例中被示出为“引导RAM的开始”的地址增长)。如所指示的,处理器102可以具有堆栈指针寄存器(在本文中也被称为堆栈指针),该堆栈指针寄存器可以包含处理器当前正在使用的栈顶的地址,或者换句话讲,推送到堆栈上的最后的数据的地址。假定堆栈在进行函数调用时从其最顶部的最大地址向其最小地址增长,则处理器102可以将数据推送到堆栈上,从而随着每次添加而递减堆栈指针。类似地,当函数调用返回到调用者函数时,处理器102可以从堆栈中弹出数据,从而随着每次移除而递增堆栈指针。
根据一个示例,当计算设备100最初被重置和/或上电时,处理器102可以执行引导加载程序208。当发生这种情况时,处理器102可以在引导加载程序208进行函数调用时使用引导堆栈226。在此,处理器102的堆栈指针可以指向引导堆栈226(即,引导堆栈的顶部的地址)。由于引导加载程序208的函数需要动态地分配的存储器,因此处理器102可以从引导堆228分配该存储器。如图所示,引导加载程序208可以执行诊断和初始化函数,然后使处理器102执行OS应用程序210,其中引导加载程序208停止执行。当处理器102执行OS应用程序210时,该处理器可以停止使用引导堆栈226,并且现在当OS应用程序进行函数调用时使用OS堆栈230。在此,处理器102的堆栈指针可以指向OS堆栈230(即,OS堆栈的顶部的地址)。由于OS应用程序210的函数需要动态地分配的存储器,因此处理器102可以从OS堆232分配该存储器。
根据一个示例,在处理器102正在执行引导加载程序208时,可以调用/执行“引导功函数n”209(作为一个示例)。处理器102可以从引导闪存存储器204执行“引导函数n”209,并且特别地,处理器102可以在执行函数时使用引导堆栈226。类似地,可能希望OS应用程序210调用引导加载程序208的一个或多个函数,诸如“引导函数n”209。示例可以是更新OS应用程序210的函数,如下面进一步讨论的。将认识到,OS应用程序可能期望调用引导加载程序208的其他函数,诸如诊断应用程序等。现在参考图3,假定处理器102正在执行OS应用程序210,并且特别地,正在执行“OS函数n”211,处理器102可以从OS闪存存储器206执行“OS函数n”211,并且在执行“OS函数n”211时使用OS堆栈230。“OS函数n”211的执行被表示为垂直线302。在某个时间点,“OS函数n”211可以调用“引导函数n”209,如箭头306所表示。处理器102可以从引导闪存存储器204执行“引导函数n”209(如垂直线304所表示)。然而,处理器102可以在执行“引导函数n”209时继续使用OS堆栈230。“引导函数n”209的完成可以使处理器102然后返回到“OS函数n”211(如箭头308所表示)。此后,处理器102可以继续从OS闪存存储器206执行“OS函数n”211,并且在执行“OS函数n”211时使用OS堆栈230。
如所指示的,“引导函数n”的一个示例是可以更新OS应用程序210的函数(仅出于描述的目的,该函数在本文中被称为“OS更新函数”)。可以通过将存储在OS闪存存储器206中的第一版本的OS应用程序210用新的第二版本的OS应用程序覆写来执行此类更新。一旦计算设备100在运行时环境中并且开发了新版本的OS应用程序210,并且需要对其进行部署,则可能期望执行此类更新。假定处理器102正在执行引导加载程序208并且计算设备100被(例如,由用户)指示更新OS应用程序210,则处理器102可以从引导闪存存储器204执行“OS更新函数”。这样,处理器可以使用引导堆栈226。例如,“OS更新函数”可以使处理器102(例如使用网络接口控制器114、116和118中的任何一个)将第二版本的OS应用程序210从网络140加载或复制到引导堆228中。此后,“OS更新函数”可以使处理器102对OS应用程序210的第二版本执行一个或多个检查(诸如错误检查、版本控制检查、权限检查、安全检查等)。如果检查没有通过,则“OS更新函数”可以使处理器102例如向用户提供错误代码或消息,并且不将第二版本的OS应用程序210加载到OS闪存存储器206中。此后,引导加载程序可以使处理器102如上所述执行第一版本的OS应用程序210。然而,如果检查通过,则“OS更新函数”可以使处理器102将第二版本的OS应用程序210从引导堆228复制到OS闪存存储器206(例如覆写第一版本的OS应用程序),然后使处理器102从OS闪存存储器206执行现在更新的第二版本的OS应用程序210。
另选地,假定现在处理器102正在从OS闪存存储器206执行第一版本的OS应用程序210,并且(例如由用户)指示设备100更新OS应用程序。在这种状态下,当进行函数调用时,处理器102可能正在使用OS堆栈230。在此,OS应用程序可以调用引导加载程序208的“OS更新函数”,从而使处理器102从引导闪存存储器204执行该函数。在执行“OS更新函数”时,处理器可以继续使用OS堆栈230,而不是引导堆栈226,如上所述。在此,例如,“OS更新函数”可以使处理器102(例如使用网络接口控制器114、116和118中的任何一个)将第二版本的OS应用程序210从网络140加载或复制到OS堆232中。此后,“OS更新函数”可以使处理器102对第二版本的OS应用程序执行一个或多个检查,如上所述。如果检查没有通过,则“OS更新函数”可以使处理器102例如向用户提供错误代码或消息,并且不将第二版本的OS应用程序210加载到OS闪存存储器206中。此后,处理器102可以继续执行第一版本的OS应用程序,如上所述。但是,如果检查通过,则“OS更新函数”可以使处理器102将第二版本的OS应用程序从OS堆232复制到OS闪存存储器206(例如覆写第一版本的OS应用程序),然后使计算设备和/或处理器102重置,执行引导加载程序208,并且随后从OS闪存存储器206执行现在更新的第二版本的OS应用程序210。OS应用程序210调用引导加载程序208的“OS更新函数”(与例如调用作为OS应用程序210的一部分并且因此位于OS闪存存储器206中的“OS更新函数”相比)的一个优点是,引导加载程序的“OS更新函数”可以覆写OS应用程序210而不影响“OS更新函数”的执行。相反,如果“OS更新函数”是OS应用程序210的一部分,则“OS更新函数”可以在更新OS应用程序210时覆写其自身,从而使计算设备100在执行中出现错误,即,以未定义和/或非确定的方式执行。
OS应用程序210的上述示例调用作为引导加载程序208的一部分的“引导函数n”209(诸如“OS更新函数”)可能存在至少一个问题。引导加载程序208和OS应用程序210可以是单独的应用程序,彼此独立开发并且可能在不同的时间部署。作为一个示例,新版本的引导加载程序208可以独立于OS应用程序210部署,OS应用程序210可以不改变。因为“引导函数n”209是引导加载程序208的一部分,因此在开发引导加载程序时,可以适当调整引导堆栈226的大小以考虑例如“引导函数n”的存储器需求/要求。但是,由于OS应用程序210是单独的应用程序,并且可能未更新,因此OS堆栈230的大小可能没有被适当地设计来考虑“引导函数n”的需求。因此,例如,当从OS应用程序210调用“引导函数n”时,在OS堆栈230中可能发生堆栈溢出(即,堆栈指针可以超出OS堆栈23-的边界/大小),从而导致计算设备100以未定义和/或非确定的方式运行,然后由于OS RAM 224的某些存储器空间被意外覆写而重新启动。这种非确定的执行/重启的问题是,可能不知道为什么会发生重启。解决该问题的一种方法是,在OS应用程序调用“引导函数n”之后始终强制执行重置,但这可能不切实际。解决该问题的另一种方法是“试图”扩大OS堆栈230的大小,以考虑OS应用程序可以调用的任何“引导函数n”。然而,如果存储器有限(例如使用嵌入式设备),可能也是不切实际的。另外,如果OS应用程序210是一次执行多个进程/线程的多进程/多线程应用程序,则可能需要增加每个相应进程/线程的堆栈空间,这可能也是不切实际的。
根据至少解决上述问题的一个示例,不使处理器102在OS应用程序210调用引导加载程序208的“引导函数n”时使用OS堆栈230,而是可以将计算设备100重新配置为使处理器102在OS应用程序210调用引导加载程序208的“引导函数n”时使用引导堆栈226。在完成“引导函数n”并且将控制返回给OS应用程序210时,计算设备100可以被重新配置为使处理器102再次使用OS堆栈230。此类配置的至少一个优点是,因为“引导函数n”是引导加载程序208的一部分,因此引导堆栈226的大小可以被适当地设计成考虑“引导函数n”的存储器使用需求。换句话讲,不需要将OS应用程序的堆栈大小设计成考虑引导加载程序208的函数。将认识到,可以对从OS应用程序210调用的引导加载程序208的任何函数执行此类操作,而不仅仅是对更新OS函数的函数。更一般来讲,根据本文所述的示例,给定具有第一应用程序和第二应用程序的计算设备,例如,每一者具有其自身的专用堆栈空间(如引导堆栈226和OS堆栈230的专用堆栈空间),当一个应用程序调用另一个应用程序时,计算设备的处理器可以在执行该应用程序时使用分配给相应应用程序的堆栈空间。
现在参考图4,示出了示例性代码序列400,该示例性代码序列是以上参照图2和图3讨论的“引导函数n”209的修改版本。上面参照图2和图3讨论的引导加载程序208的任何“引导函数n”209可以类似地被写成示例性代码序列400。根据该示例,在图4中,上面讨论的“引导函数n”209现在被重命名为“引导函数N”402。如图4所示,经修改的“引导函数n”(在图4中被示出为函数401)具有“引导函数N”402,其“被包裹”在本文中仅出于讨论的目的被称为“preserveContext”函数404和“restoreContext”函数406的两个进程或函数。这些函数401、402、404和406可以是引导加载程序应用程序208的一部分/可以被包含在其中。
可以从引导加载器208或从OS应用程序210调用“引导函数n”401。当从引导加载程序208调用“引导函数n”401时,处理器102可以在调用“引导函数n”401时使用引导堆栈226。如下所述,“preserveContext”函数404和“restoreContext”函数406可以被配置为使处理器102在“引导函数N”402被执行时继续使用引导堆栈226。类似地,可以从OS应用程序210调用“引导函数n”401。在此,在调用“引导函数n”401时,处理器102可能正在使用OS堆栈230。然而,不使处理器102使用OS堆栈230执行“引导函数N”402,而是可以将“preserveContext”函数404和“restoreContext”函数406配置为使处理器102现在使用引导堆栈226。更具体地并且如下文进一步描述的,“preserveContext”函数404可以使处理器102从使用OS堆栈230切换或交换或改变,并且通过改变堆栈指针内的值来开始使用引导堆栈226。此后,处理器102可以执行“引导函数N”402。一旦完成,“restoreContext”函数406可以使处理器102通过改变堆栈指针内的值来从使用引导堆栈226切换回为再次使用OS堆栈230。这样,当OS应用程序210正在执行并且调用引导加载程序208的函数时,处理器可以使用引导堆栈226来执行该函数。此类配置的至少一个益处是引导堆栈226的大小可以适当地被设计成执行“引导函数N”。因此,当OS应用程序210正在执行并且调用引导加载程序208的函数时,OS应用程序可以使用两个不同的堆栈—调用OS堆栈230作为“引导函数n”401,并且调用引导堆栈226作为“引导函数N”402。
根据该示例,“preserveContext”函数404可以返回堆栈指针值(在图4中被示出为“stackPointer”)。类似地,“restoreContext”函数406可以被传递该堆栈指针值作为函数参数。这是一个示例,并且其他示例也是可能的。另外,代码序列400通常是一个示例,并且其他具体实施也是可能的。例如,由“preserveContext”函数404和“restoreContext”函数406执行的操作/指令可以以其他方式实现。例如,不使由“preserveContext”函数404和“restoreContext”函数406执行的指令实现为函数,这些指令可以直接内联放置在“引导函数n”401函数内。作为另一个示例,不使“preserveContext”函数404和“restoreContext”函数406作为引导加载程序208的一部分/被包含在该引导加载程序中,它们可以被包含在由“引导函数n”401调用的外部库中。作为另一个示例,“preserveContext”函数404和“restoreContext”函数406可以被包含在OS应用程序210中。
本文中的其余讨论假定由“preserveContext”函数404和“restoreContext”函数406执行的操作被实现为从“引导函数n”401调用的函数调用。如果使用不同的具体实施,则下面讨论的所有操作可能不是必需的。还假定“preserveContext”函数404可以将堆栈指针值返回给调用函数,并且可以将该值传递给“restoreContext”函数406作为函数参数。同样,这是一个示例,并且其他具体实施也是可能的。
根据另一个示例,如果OS应用程序210是多进程/多线程应用程序,则“preserveContext”函数404可以例如将处理器102配置为在例如“引导函数N”402完成之前不允许进程或线程交换(例如,可以防止操作系统调度器使一个进程或线程代替另一个进程或线程执行而停止执行)。例如,“restoreContext”函数406此后可以重新配置处理器102以再次允许进程或线程交换。
现在参考图5,示出了可以由处理器102在执行“preserveContext”函数404时执行的过程500的高级示例。将认识到,可以以不同的顺序执行过程500的一个或多个示例性操作/步骤。一旦从“引导函数n”401调用“preserveContext”函数404(步骤502),则首先可以在步骤504处确定是从引导加载程序208调用“引导函数n”401,还是从OS应用程序210调用(即,在堆栈指针指向引导堆栈226或OS堆栈230时被调用)。作为示例,可以通过确定堆栈指针当前是指向引导RAM222内的地址还是指向OS RAM 224内的地址来进行该确定。如果地址在引导RAM 222内,则引导加载程序208可已调用“引导函数n”401。如果地址在OS RAM 224内,则OS应用程序210可已调用“引导函数n”401。如果在步骤504处确定引导加载程序208调用“引导函数n”,则处理器102已经在使用引导堆栈226并且不需要切换堆栈(同样,因为在引导加载程序上下文中使用引导堆栈226保证引导堆栈的大小和安全)。在此,过程500可以前进至步骤514,在该步骤中,堆栈指针的值可以被返回到调用“preserveContext”函数404(在此,返回的堆栈指针值可以是指向引导堆栈226的值)的“引导函数n”401。此后,过程500可以在步骤516处退出,处理器102然后继续使用引导堆栈226来执行如图4所示的“引导函数N”402。相反,如果在步骤504处确定OS应用程序210调用“引导函数n”401,则处理器102正在使用OS堆栈230。在此,过程500可以前进至步骤506,在该步骤中,可以保存堆栈指针的当前值(例如,该保存的值可以在步骤510和步骤512中使用,以将数据/值从OS堆栈230复制到引导堆栈226)。此后,在步骤508处,堆栈指针可以被重新配置为指向引导堆栈226,从而改变/交换堆栈。因为在步骤504处已确定在堆栈指针正在指向OS堆栈230时已经调用“引导函数n”401,因此一旦“preserveContext”函数404结束,处理器102就可以已例如(当调用“preserveContext”函数404时)将暂存寄存器值和处理器待执行的下一个指令的返回地址推送到OS堆栈上。当编译“引导函数n”401和/或“preserveContext”函数404时,编译器(诸如C或C++编译器)可以自动生成此类指令。在步骤510和步骤512处,可以将被推送到OS堆栈230上的这些值从OS堆栈复制到引导堆栈226。这样,当“preserveContext”函数404以堆栈指针现在指向引导堆栈226结束时,处理器102(因为它可以执行由编译器自动生成的指令)可以保持一致的状态,从而返回到“引导函数n”401内的正确的下一个指令,并且当从引导堆栈226中弹出暂存寄存器值时还恢复这些值。在步骤514处,过程可以前进至步骤514,在该步骤中,可以将在步骤506处保存的OS堆栈指针值返回到“引导函数n”401。此后,该过程可以在步骤516处退出,其中处理器102现在使用引导堆栈226继续执行图4中所示的“引导函数N”402。
现在参考图6,示出了可以由处理器102在执行“restoreContext”函数406时执行的过程600的高级示例。将认识到,可以以不同的顺序执行过程600的一个或多个示例性操作/步骤。如所指示的,该函数可以作为函数参数传递由“preserveContext”函数404返回的堆栈指针值。一旦从“引导函数n”401调用“restoreContext”函数406(步骤602),就可以首先在步骤604处确定“preserveContext”函数404是否将堆栈指针从指向OS堆栈230改变为指向引导堆栈226。例如,可以基于作为函数参数传递给“restoreContext”函数406的堆栈指针值来进行该确定。例如,如果堆栈指针值在引导RAM 222的地址范围内,则可以确定“preserveContext”函数404没有改变/交换堆栈,并且如果堆栈指针值不在引导RAM 222的地址范围内(即,被确定为在OSRAM 224的地址范围内),则可以确定“preserveContext”函数404确实改变/交换了堆栈。同样,将认识到,可以使用其他方式来确定“preserveContext”函数404是否改变了堆栈,诸如通过使用由“preserveContext”函数404设置的标志值(例如,是/否)来确定。将认识到,其他示例也是可能的。如果“preserveContext”函数404没有改变/交换堆栈,则过程600可以前进至步骤614,在该步骤中,过程600可以退出,而不改变/交换堆栈并且处理器102继续执行“restoreContext”函数406之后的下一个指令,如图4所示。相反,如果在步骤604处确定“preserveContext”函数404确实改变/交换了堆栈,则过程600可以前进至步骤606,在该步骤中,可以保存堆栈指针的当前值(例如,该已保存的值可以在步骤610和步骤612中使用,以将数据/值从引导堆栈复制到OS堆栈)。此后,在步骤608处,可以使用传递给“restoreContext”函数406的堆栈指针值作为函数参数来例如将堆栈指针重新配置为指向OS堆栈230,从而改变/交换堆栈。当调用“restoreContext”函数406时,一旦“restoreContext”函数406结束,处理器102就可以已将暂存寄存器值、函数参数以及处理器待执行的下一个指令的返回地址推送到引导堆栈226上。当编译“引导函数n”401和/或“restoreContext”函数406时,编译器(诸如C或C++编译器)可以自动生成此类指令。在步骤610和步骤612处,可以将被推送到引导堆栈226上的这些值从引导堆栈复制到OS堆栈230(因为,如在步骤604处确定的,“preserveContext”函数404改变/交换了堆栈)。这样,当“restoreContext”函数406以堆栈指针现在指向OS堆栈230结束时,处理器102可以保持一致的状态,从而返回到“引导函数n”401内的正确的下一个指令,并且当暂存寄存器值从OS堆栈中弹出时还恢复这些值。该过程接下来可以前进至步骤614,在该步骤中,该过程可以退出,处理器102现在使用OS堆栈来继续执行如图4中所示的“restoreContext”函数406之后的下一个指令。
现在转到图7A至图7B,示出了处理器102可以相对于将数据值推送到OS堆栈230和引导堆栈226上并且从中弹出数据值,以及在“OS函数n”211调用图4的“引导函数n”401时在堆栈之间复制数据值执行的示例性操作序列700。图8A至图8I示出了当这些操作发生时OS堆栈230和引导堆栈226的示例性表示(在此,在将数据值推送到堆栈上时,堆栈竖直向上增长)。其中一些操作表示编译器(诸如C或C++编译器)在编译此类函数集时可自动生成的指令。将认识到,虽然在图7A至图7B中示出某些推送/弹出操作在调用者函数或被调用者函数的上下文中发生,但是这些操作可以在其他函数的上下文中发生。另外,图7A至图7B和图8A至图8I中所示的操作顺序是示例,并且其他顺序也是可能的。在此示例中,假定“引导函数n”401如图4所示,其中“引导函数n”401具有两个函数参数403和两个局部变量405,并且其中“preserveContext”函数404不具有函数参数并且其中“restoreContext”函数406具有一个函数参数407。进一步假定“preserveContext”函数404和“restoreContext”函数406不具有局部变量。同样,这些仅是示例,并且其他示例也是可能的,包括“preserveContext”函数404和“restoreContext”函数406的操作在“引导函数n”401的内联中执行,而不是如上所述的函数调用。
参见图7A中的操作702和图8A,当“OS函数n”211调用具有两个参数值(在此被示出为“value1”和value2”)的“引导函数n”401时,当处理器102将数据推送到OS堆栈上时,可以在OS堆栈230上为“引导函数n”分配堆栈帧802(图8A中所示)。例如,处理器102可以将以下各项推送到OS堆栈230上:(1)“OS函数n”可能正在使用的当前暂存寄存器值(在图8A中被称为“OS暂存寄存器值”),(2)“引导函数n”401的函数参数值(在此为value1和value2,在图8A中被称为“引导函数n的函数参数值”),(3)从“引导函数n”401返回时将在“OS函数n”211中执行的下一个指令的地址(在图8A中被称为“OS函数n返回地址”)(该值可以例如从处理器102的指令指针寄存器获得),以及(4)堆栈帧指针寄存器882的当前值(然后处理器102还修改堆栈帧指针寄存器882以指向堆栈帧802,如图8A所示,这可以例如在将堆栈帧指针值推送到堆栈上之后,通过将堆栈帧指针设置为等于堆栈指针来完成)。另外,处理器102可以在OS堆栈230上为“引导函数n”的局部变量405(在图8A中被称为“引导函数n局部变量”)分配空间。将认识到,当处理器102“调用”如本文所述的函数诸如“引导函数n”401时,它还可以将被调用函数的指令地址加载到指令指针寄存器中以执行函数。操作702可以由编译器当编译“OS函数n”211和“引导函数n”401时自动生成。同样,将认识到,虽然在操作702和图8A中某些推送操作被示出为在“OS函数n”211的上下文中以及在“引导函数n”401的上下文中发生,但是一个或多个操作可以在其他函数的上下文中发生。图8A示出了在操作702完成时OS堆栈230和引导堆栈226的示例性状态。当处理器102将数据推送到OS堆栈上时,它可以移动堆栈指针寄存器880以指向OS堆栈的顶部(例如,推送到堆栈上的最后一个数据值)。
现在参考图7A中的操作704和图8B,当“引导函数n”401调用“preserveContext”函数404时(同样,在该示例中,没有将任何函数参数值传递给“preserveContext”函数,并且假定“preserveContext”函数不具有局部变量),因此当处理器102将数据推送到OS堆栈上时,可以在OS堆栈230上为“preserveContext”函数分配堆栈帧804。例如,处理器102可以将以下各项推送到OS堆栈230上:(1)“引导函数n”401可能正在使用的当前暂存寄存器值(在图8B中被称为“引导暂存寄存器值1”),以及(2)在从“preserveContext”函数404返回时将在“引导函数n”401中执行的下一个指令的地址(在图8B中被称为“引导函数n返回地址1”)。操作704可以由编译器自动生成。根据该示例,“preserveContext”函数404可以被配置为不将堆栈帧指针882的当前值推送到OS栈上,并且特别地,可以被配置为不更改堆栈帧指针中的值,而使其保留为指向堆栈帧802(例如,编译器选项可以用于使“preserveContext”函数不更改堆栈帧指针882)(类似地,当“preserveContext”函数404结束时,如以下相对于操作708所讨论的,“preserveContext”函数和/或“引导函数n”可以配置为不更改堆栈帧指针中的值)。例如,这可以允许处理器102在“引导函数n”401完成时适当地返回到“OS函数n”211。图8B示出了在操作704完成时OS堆栈230和引导堆栈226的示例性状态。当处理器102将数据推送到OS堆栈上时,它可以移动堆栈指针寄存器880以指向OS堆栈的顶部。
现在参考图7A中的操作706和图8C,“preserveContext”函数804现在可以执行堆栈交换操作,在执行“引导函数N”402之前将堆栈指针880从OS堆栈230移动或改变到引导堆栈226。根据图7A的示例,假定在堆栈指针指向OS堆栈时调用preserveContext函数804(即,在该示例中未示出图5的操作504)。“preserveContext”函数804可以被配置为首先使处理器102保存堆栈指针的当前值(该堆栈指针可以指向OS堆栈230的位置881)。处理器102可以将该值保存到寄存器(诸如寄存器%d0)。此后,“preserveContext”函数804可以使处理器102重新配置堆栈指针以指向引导堆栈226(诸如,引导堆栈的开始或基地址)。接下来,“preserveContext”函数804可以使处理器102将在操作704中被推送到OS栈上的暂存寄存器值和下一个可执行指令从OS堆栈230复制到引导堆栈226,或者换句话讲,将OS堆栈的堆栈帧804复制到包括“引导暂存寄存器值1”和“引导函数n返回地址1”的引导堆栈。出于至少两个原因,可能需要这些复制。首先,当“preserveContext”函数804结束时,处理器102可以寻找引导堆栈以确定接下来应该执行哪个指令。第二,类似于当“preserveContext”函数被调用时将暂存寄存器值推送到OS堆栈230上(操作704),当“preserveContext”函数结束时,处理器102(例如由于自动生成的编译器代码)可以从引导堆栈中弹出值,并且将这些值放入暂存寄存器中。因此,“preserveContext”函数804不仅可以交换堆栈,而且可以在函数调用返回时进行该交换时确保一致的上下文或状态。当处理器102将数据推送到引导堆栈226上时,它可以移动堆栈指针880以指向引导堆栈的顶部。图8C示出了在操作706完成时OS堆栈230和引导堆栈226的示例性状态。
现在参考图7A的操作708和图8D,当“preserveContext”函数404结束并且返回到“引导函数n”401时,处理器102可以从引导堆栈226中弹出“引导函数n返回地址1”(该操作未在图7A中示出),以确定在从“preserveContext”函数404返回时将执行的“引导函数n”401内的下一个指令,可以在交换前(诸如通过%d0寄存器)作为返回值返回到“引导函数n”到OS堆栈的最后位置(即,位置881,并且在图7A中被称为“OS堆栈指针值”),并且可以从引导堆栈中弹出“引导暂存寄存器值1”,并且将这些值复制到暂存寄存器中。同样,操作708可以由编译器当编译“引导函数n”401和“preserveContext”函数404时自动生成。例如,当处理器102将数据从引导堆栈226中弹出时,它可以在堆栈内移动堆栈指针880以再次指向堆栈的基地址。图8D示出了在操作708完成时OS堆栈230和引导堆栈226的示例性状态。
现在参考图7A的操作710,“引导函数n”401接下来可以调用“引导函数N”402。处理器402可以调用“引导函数N”402,在进行调用时将数据值推送到引导堆栈226上,可以执行该函数的指令,该指令可以包括调用一个或多个附加的函数并且在这些操作期间继续使用引导堆栈226,并且在完成“引导函数N”之后,可以从引导堆栈中弹出值并且返回到“引导函数n”401。在返回到“引导函数n”401时,OS堆栈230和引导堆栈226的状态以及堆栈指针880和堆栈帧指针882的状态可以再次出现,如图8D所示。
现在参考图7B中所示的操作712和图8E,当“引导函数n”401调用“restoreContext”函数406时,当处理器102将数据推送到引导堆栈上时,可以在引导堆栈226上分配用于“restoreContext”函数的堆栈帧806。例如,处理器102可以将以下各项推送到引导堆栈226上:(1)“引导函数n”401可能正在使用的当前暂存寄存器值(在图8E中被称为“引导暂存寄存器值2”),(2)“restoreContext”函数406的函数参数值(在此为由“preserveContext”函数404返回的“OS堆栈指针值”)(同样,“OS堆栈指针值”可以正在指向OS堆栈230的位置881),以及(3)在从“restoreContext”函数406返回时将在“函数n”401中执行的下一个指令的地址(在图8E中被称为“引导函数n返回地址2”)。操作712可以由编译器自动生成。根据该示例,类似于“preserveContext”函数404,“restoreContext”函数406可以被配置为不将堆栈帧指针882的当前值推送到引导堆栈226上,并且特别地,可以被配置为不更改堆栈帧指针中的值,而使其保留为指向堆栈帧802(类似地,当“restoreContext”函数406结束时,如以下相对于操作716所讨论的,“restoreContext”函数和/或“引导函数n”可以被配置为不更改堆栈帧指针中的值)。例如,这可以允许处理器102在“引导函数n”401完成时适当地返回到“OS函数n”211。图8E示出了在操作712完成时OS堆栈230和引导堆栈226的示例性状态。当处理器102将数据推送到引导堆栈226上时,它可以移动堆栈指针880以指向引导堆栈226的顶部。
现在参考图7B中的操作714和图8F,“restoreContext”函数806接下来可以执行堆栈交换操作,将堆栈指针880从引导堆栈226移动回OS堆栈230,因为“引导函数N”402已完成。根据图7B的示例,假定由于“preserveContext”函数404将堆栈指针880从OS堆栈230移动/交换到引导堆栈226,当堆栈指针880正在指向引导堆栈226时正在调用restoreContext函数406(即,在该示例中未示出图6的操作604)。“restoreContext”函数806可以被配置为首先使处理器102保存(指向引导堆栈226的)堆栈指针的当前值。处理器102可以将该值保存到寄存器(诸如寄存器%d0)。此后,“restoreContext”函数可以使处理器102使用传递给函数的“OS堆栈指针值”作为函数参数来重新配置堆栈指针880,以指向OS堆栈230(即,指向OS堆栈230的位置881)。接下来,例如使用(正在指向OS堆栈230的)堆栈指针880和(正在指向引导堆栈226的)寄存器%d0,“restoreContext”函数406可以使处理器102将暂存寄存器值、函数参数和在操作712中被推送到引导堆栈上的下一个可执行指令从引导堆栈226复制到OS堆栈230,或者换句话讲,将引导堆栈226的堆栈帧806复制到包括“引导暂存寄存器值2”、“OS堆栈指针值”和“引导函数n返回地址2”的OS堆栈230。同样,出于至少两个原因,可能需要这些复制。首先,当“restoreContext”函数结束时,处理器现在可以查看OS堆栈230,以确定接下来应该执行哪个指令。第二,类似于当“restoreContext”函数被调用时暂存寄存器值和函数参数被推送到引导堆栈226上(操作712),当“restoreContext”函数结束时,处理器102(例如由于自动生成的编译器代码)可以从OS堆栈230中弹出值,从而将暂存寄存器值放入暂存寄存器中。因此,“restoreContext”函数406不仅可以交换堆栈,而且可以在函数调用返回时进行此交换时确保上下文或状态的一致性。当处理器102将数据推送到OS堆栈230上时,它可以移动堆栈指针880,其中堆栈指针指向OS堆栈的顶部。图8F示出了在操作714完成时OS堆栈230和引导堆栈226的示例性状态。
现在参考图7B的操作716和图8G,当“restoreContext”函数406结束并且返回到“引导函数n”401时,处理器102可以从OS堆栈230中弹出“引导函数n返回地址2”,以确定待执行的“引导函数n”401内的下一个指令,并且还可以从OS堆栈中弹出“OS堆栈指针值”(丢弃该值)和“引导暂存寄存器值2”,并且将这些暂存寄存器值复制到暂存寄存器中。同样,操作716可以由编译器当编译“引导函数n”401和/或“restoreContext”函数406时自动生成。例如,当处理器102从OS堆栈230中弹出数据时,它可以在堆栈内移动堆栈指针880以再次指向位置881。图8G示出了在操作716完成时OS堆栈230和引导堆栈226的示例性状态。
现在参考图7B的操作718和图8H,当“引导函数n”401结束时,处理器102可以将堆栈指针880复制到堆栈帧指针882,从而将堆栈指针定位成指向帧802中的“堆栈帧指针值”,从而在OS堆栈上重新分配在操作702中为“引导函数n局部变量”分配的空间。此后,处理器102可以从OS堆栈中弹出“堆栈帧指针值”,并且将该值复制到堆栈帧指针882中,从而使堆栈帧指针指向先前的堆栈帧。这样,处理器102可以移动堆栈指针880以指向堆栈帧802的“OS函数n返回地址”。例如,操作718可以由编译器当编译“引导函数n”401时自动生成。图8H示出了在操作718完成时OS堆栈230和引导堆栈226的示例性状态。
现在参考图7B的操作720和图8I,当“引导函数n”401结束并且返回到“OS函数n”211时,处理器102可以从OS堆栈230中弹出“OS函数n返回地址”,以确定“OS函数n”211内待执行的下一个指令,可以弹出“引导函数n的函数参数值”(舍弃该值),可以从OS堆栈中弹出“OS暂存寄存器值”,并且将该暂存寄存器值复制到暂存寄存器中,并且可以以错误值(如果存在)作为返回值(诸如通过%d0寄存器)返回到“OS函数n”。同样,操作716可以由编译器当编译“引导函数n”401和/或“OS函数n”211时自动生成。例如,当处理器102从OS堆栈230中弹出数据时,它可以在堆栈内移动堆栈指针880以再次指向先前的堆栈帧。此后,处理器102可以继续执行“OS函数n”的指令。图8I示出了在操作720完成时OS堆栈230和引导堆栈226的示例性状态。
现在参考图9,示出了示例性代码序列900,该示例性代码序列包括如本文所述的“preserveContext”函数404的示例性具体实施。在该示例中,%sp、%d0和%a0可以表示处理器102的寄存器,其中寄存器%sp是堆栈指针寄存器880。当处理器102执行代码序列900时,它可以以指令902开始。在此,处理器102可以首先确定堆栈指针%sp是指向引导堆栈226还是指向OS堆栈230(从而确定是正在从引导加载程序应用程序208中调用“引导函数n”401/“preserveContext”函数,还是正在从OS应用程序210中调用“引导函数n”401/“preserveContext”函数)。处理器102可以通过将堆栈指针寄存器%sp中的值复制到寄存器%d0中,然后例如通过将其与如在此所述的“引导RAM的结束”进行比较来确定该值是否在引导RAM 222内来做出该确定(例如,将认识到,该确定可以以其他方式做出,诸如确定堆栈指针的值是否在OS RAM 224内)。如果该值在引导RAM222内,则处理器102可以分支到指令910,返回到调用者函数,其中值保存到寄存器%d0(此为指向引导堆栈226的值)。另选地,如果处理器102在指令902处确定堆栈指针不在引导RAM 222中并且因此正在指向OS堆栈230,则处理器102可以前进至指令904。在此,处理器102可以确定引导堆栈226的开始,并且将该值复制到堆栈指针寄存器%sp中。前进至指令906,处理器102可以接着在调用“preserveContext”函数时将已保存到OS堆栈230的暂存寄存器值(在此为四个值)复制到引导堆栈226,在进行这些复制时移动堆栈指针寄存器%sp。前进至指令908,处理器102可以接着将在调用“preserveContext”函数时被推送到OS堆栈230上的下一个可执行指令复制到引导堆栈226。最后,处理器102可以前进至指令910,返回到调用者函数,其中值保存到寄存器%d0(此为指向OS堆栈230的值)。
现在参考图10,示出了示例性代码序列1000,该示例性代码序列包括如本文所述的“restoreContext”函数406的示例性具体实施。在该示例中,%sp、%d0和%a0可以表示处理器102的寄存器,其中寄存器%sp是堆栈指针寄存器880。当处理器102执行代码序列1000时,它可以以指令1002开始。如图4中所示并且如上所述,“restoreContext”函数406可以作为由“preserveContext”函数404返回的堆栈指针值的函数参数传递。在指令1002处,处理器102可以将该值从堆栈复制到寄存器%d0。接下来,处理器102可以在指令1004处执行错误检查,并且如果没有错误,则前进至指令1006,以确定传递给“restoreContext”函数406的堆栈指针参数值是指向引导堆栈226还是指向OS堆栈230(从而确定“preserveContext”函数404是否执行了堆栈交换)。处理器102可以通过将堆栈指针参数值与“引导RAM的结束”进行比较来做出该确定,从而确定堆栈指针参数值是否在引导RAM 222内(将认识到,该确定可以以其他方式做出,诸如确定堆栈指针的值是否在OS RAM 224内)(同样,将进一步认识到,可以使用其他方式来确定“preserveContext”函数404是否改变了堆栈,诸如通过使用由“preserveContext”函数404设置的标志值(例如,是/否)。将认识到,其他示例也是可能的)。如果该值在引导RAM 222内,则处理器102可以分支到指令1014,返回到调用者函数。在这种情况下,“preserveContext”函数404未执行堆栈交换。另选地,如果处理器102在指令1004处确定传递给“restoreContext”函数406的堆栈指针参数值不在引导RAM 222中,并且“preserveContext”函数因此进行堆栈交换,则处理器102可以前进至指令1008。在此,处理器102可以保存(指向引导堆栈226的)寄存器%sp的当前堆栈指针值,然后将其复制到堆栈寄存器%sp中,堆栈指针参数值因而使堆栈指针指向OS堆栈230。前进至指令1010,处理器102接下来可以将暂存寄存器值(在该示例中为四个)和在调用“restoreContext”函数406时被保存到引导堆栈226的函数参数(在该示例中为一个)复制到OS堆栈230,在进行这些复制时移动堆栈指针%sp。前进至指令1012,处理器102可以接着在调用“restoreContext”函数406时将下一个可执行指令复制到OS堆栈,该下一个可执行指令被推送到引导堆栈上。最后,处理器102可以前进至指令1014,返回到调用者函数。
将认识到,虽然相对于引导堆栈226和OS堆栈230描述了本文所讨论的方法和系统,但是这些方法和系统适用于例如可以使用不同堆栈配置的其他计算架构。
除了本文中已经描述的之外,例如这些方法和系统还可以在并入一个或多个计算机可读介质中的一个或多个计算机程序、软件或固件中实现,以由一个或多个计算机或一个或多个处理器执行。计算机可读介质的示例包括(通过有线或无线连接传输的)电子信号和有形/非暂态计算机可读存储介质。有形/非暂态计算机可读存储介质的示例包括但不限于只读存储器(ROM)、随机存取存储器(RAM)、可移动磁盘和光学介质诸如CD-ROM磁盘,以及数字通用磁盘(DVD)。
虽然依据某些实施方案以及大体上相关联的方法描述了本公开,但是实施方案和方法的变更和排列对本领域的技术人员来说将是显而易见的。因此,示例性实施方案的以上描述不限制本公开。在不背离本公开的精神和范围的情况下,其他变化、替换和更改也是可能的。
Claims (22)
1.一种用于管理堆栈的装置,其包括:
至少一个处理器;和
至少一个存储器模块,所述至少一个存储器模块通信地耦合到所述至少一个处理器,其中所述至少一个存储器模块在其上存储有第一应用程序的软件指令和第二应用程序的软件指令,其中所述第二应用程序包括第一函数和第二函数,其中所述第一应用程序具有与其相关联的第一堆栈,并且所述第二应用程序具有与其相关联的第二堆栈,并且其中所述第一应用程序和所述第二应用程序在由所述至少一个处理器执行时指引所述至少一个处理器:
执行所述第一应用程序,其中在执行所述第一应用程序时,堆栈指针寄存器指向所述第一堆栈;
在执行所述第一应用程序时,调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第一堆栈上,并且其中所述堆栈指针寄存器在将所述数据值推送到所述第一堆栈上之后指向所述第一堆栈;
执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第一堆栈,将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈;
从所述第一函数调用所述第二函数;
使用所述第二堆栈执行所述第二函数;
在所述第二函数完成时,将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈;
返回到所述第一应用程序;并且
继续使用所述第一堆栈执行所述第一应用程序;
执行所述第二应用程序,其中在执行所述第二应用程序时,所述堆栈指针寄存器指向所述第二堆栈;并且
在执行所述第二应用程序时:
调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第二堆栈上;
执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第二堆栈,保持所述堆栈指针寄存器指向所述第二堆栈;
从所述第一函数调用所述第二函数;以及
使用所述第二堆栈执行所述第二函数。
2.如权利要求1所述的装置,其中将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈包括:
确定所述堆栈指针寄存器在执行所述第二函数之前从指向所述第一堆栈被改变为指向所述第二堆栈;以及
至少部分地基于确定所述堆栈指针寄存器在执行所述第二函数之前从指向所述第一堆栈被改变为指向所述第二堆栈,将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈。
3.如权利要求1所述的装置,其中所述第一应用程序和所述第二应用程序在由所述至少一个处理器执行时,进一步指引所述至少一个处理器:
在调用所述第二函数之前,将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈;以及
在将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈之后,将位于所述第二堆栈上的第二数据值从所述第二堆栈复制到所述第一堆栈。
4.如权利要求3所述的装置,其中将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈包括将待由所述至少一个处理器执行的指令的地址从所述第一堆栈复制到所述第二堆栈。
5.如权利要求4所述的装置,其中将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈还包括将已保存到所述第一堆栈的暂存寄存器值从所述第一堆栈复制到所述第二堆栈。
6.如权利要求5所述的装置,其中将位于所述第二堆栈上的第二数据值从所述第二堆栈复制到所述第一堆栈包括将待由所述至少一个处理器执行的指令的另一个地址和已保存到所述第二堆栈的暂存寄存器值从所述第二堆栈复制到所述第一堆栈。
7.如权利要求1所述的装置,其中所述第一应用程序和所述第二应用程序在由所述至少一个处理器执行时,进一步指引所述至少一个处理器:
在将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈之前,将所述至少一个过程配置为不允许进程或线程交换,直到将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈为止。
8.如权利要求1所述的装置,其中执行所述第二函数包括:
经由网络接口控制器接收第三应用程序;
将所述第三应用程序存储在所述至少一个存储器模块中;以及
在所述至少一个存储器模块内用所述第三应用程序覆写所述第一应用程序。
9.如权利要求1所述的装置,
其中所述第二应用程序还包括第三函数和第四函数;
其中执行所述第一函数还包括:
从所述第一函数调用所述第三函数并且执行所述第三函数,其中所述第三函数将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈;以及
从所述第一函数调用所述第四函数并且执行所述第四函数,其中所述第四函数将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈;并且
其中所述第一函数在调用所述第二函数之前调用所述第三函数,并且在执行所述第二函数之后调用所述第四函数。
10.如权利要求1所述的装置,其中所述第一应用程序、所述第一函数和所述第二函数在一个进程或一个线程下执行。
11.一种由至少一个处理器执行的用于管理堆栈的方法,其中所述至少一个处理器通信地耦合到至少一个存储器模块,所述至少一个存储器模块在其上存储有第一应用程序的软件指令和第二应用程序的软件指令,其中所述第二应用程序包括第一函数和第二函数,并且其中所述第一应用程序具有与其相关联的第一堆栈,并且所述第二应用程序具有与其相关联的第二堆栈,所述方法包括:
由所述至少一个处理器执行所述第一应用程序,其中在执行所述第一应用程序时,堆栈指针寄存器指向所述第一堆栈;
在执行所述第一应用程序时,由所述至少一个处理器调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第一堆栈上,并且其中所述堆栈指针寄存器在将所述数据值推送到所述第一堆栈上之后指向所述第一堆栈;
由所述至少一个处理器执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第一堆栈,由所述至少一个处理器将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈;
由所述至少一个处理器从所述第一函数调用所述第二函数;
由所述至少一个处理器使用所述第二堆栈执行所述第二函数;
在所述第二函数完成时,由所述至少一个处理器将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈;
由所述至少一个处理器返回到所述第一应用程序;以及
由所述至少一个处理器继续使用所述第一堆栈执行所述第一应用程序;
执行所述第二应用程序,其中在执行所述第二应用程序时,所述堆栈指针寄存器指向所述第二堆栈;并且
在执行所述第二应用程序时:
调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第二堆栈上;
执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第二堆栈,保持所述堆栈指针寄存器指向所述第二堆栈;
从所述第一函数调用所述第二函数;以及
使用所述第二堆栈执行所述第二函数。
12.如权利要求11所述的方法,其中将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈包括:
确定所述堆栈指针寄存器在执行所述第二函数之前从指向所述第一堆栈被改变为指向所述第二堆栈;以及
至少部分地基于确定所述堆栈指针寄存器在执行所述第二函数之前从指向所述第一堆栈被改变为指向所述第二堆栈,将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈。
13.如权利要求11所述的方法,其还包括:
在调用所述第二函数之前,将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈;以及
在将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈之后,将位于所述第二堆栈上的第二数据值从所述第二堆栈复制到所述第一堆栈。
14.如权利要求13所述的方法,其中将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈包括将待由所述至少一个处理器执行的指令的地址从所述第一堆栈复制到所述第二堆栈。
15.如权利要求14所述的方法,其中将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈还包括将已保存到所述第一堆栈的暂存寄存器值从所述第一堆栈复制到所述第二堆栈。
16.如权利要求15所述的方法,其中将位于所述第二堆栈上的第二数据值从所述第二堆栈复制到所述第一堆栈包括将待由所述至少一个处理器执行的指令的另一个地址和已保存到所述第二堆栈的暂存寄存器值从所述第二堆栈复制到所述第一堆栈。
17.如权利要求11所述的方法,其还包括:
在将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈之前,将所述至少一个过程配置为不允许进程或线程交换,直到将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈为止。
18.如权利要求11所述的方法,其中所述执行所述第二函数包括:
经由网络接口控制器接收第三应用程序;
将所述第三应用程序存储在所述至少一个存储器模块中;以及
在所述至少一个存储器模块内用所述第三应用程序覆写所述第一应用程序。
19.如权利要求11所述的方法,
其中所述第二应用程序还包括第三函数和第四函数;
其中执行所述第一函数还包括:
从所述第一函数调用所述第三函数并且执行所述第三函数,其中所述第三函数将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈;以及
从所述第一函数调用所述第四函数并且执行所述第四函数,其中所述第四函数将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈;并且
其中所述第一函数在调用所述第二函数之前调用所述第三函数,并且在执行所述第二函数之后调用所述第四函数。
20.如权利要求11所述的方法,其中所述第一应用程序、所述第一函数和所述第二函数在一个进程或一个线程下执行。
21.一种有形非暂态计算机可读介质,所述有形非暂态计算机可读介质在其上存储有第一应用程序的软件指令和第二应用程序的软件指令,其中所述第二应用程序包括第一函数和第二函数,其中所述第一应用程序具有与其相关联的第一堆栈,并且所述第二应用程序具有与其相关联的第二堆栈,并且其中所述第一应用程序和所述第二应用程序在由至少一个处理器执行时指引所述至少一个处理器:
执行所述第一应用程序,其中在执行所述第一应用程序时,堆栈指针寄存器指向所述第一堆栈;
在执行所述第一应用程序时,调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第一堆栈上,并且其中所述堆栈指针寄存器在将所述数据值推送到所述第一堆栈上之后指向所述第一堆栈;
执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第一堆栈,将所述堆栈指针寄存器从指向所述第一堆栈改变为指向所述第二堆栈;
从所述第一函数调用所述第二函数;
使用所述第二堆栈执行所述第二函数;
在所述第二函数完成时,将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈;
返回到所述第一应用程序;并且
继续使用所述第一堆栈执行所述第一应用程序;
执行所述第二应用程序,其中在执行所述第二应用程序时,所述堆栈指针寄存器指向所述第二堆栈;并且
在执行所述第二应用程序时:
调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第二堆栈上;
执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第二堆栈,保持所述堆栈指针寄存器指向所述第二堆栈;
从所述第一函数调用所述第二函数;以及
使用所述第二堆栈执行所述第二函数。
22.一种用于管理堆栈的装置,其包括:
至少一个处理器;和
至少一个存储器模块,所述至少一个存储器模块通信地耦合到所述至少一个处理器,其中所述至少一个存储器模块在其上存储有第一应用程序的软件指令和第二应用程序的软件指令,所述第一应用程序的所述软件指令和所述第二应用程序的所述软件指令在由所述至少一个处理器执行时指引所述至少一个处理器:
执行所述第一应用程序;
在执行所述第一应用程序时,调用所述第二应用程序的第一函数,其中调用所述第一函数包括将数据值推送到第一堆栈上,并且其中堆栈指针寄存器在推送所述数据值之后指向所述第一堆栈;
在执行所述第一函数时,将所述堆栈指针寄存器从指向所述第一堆栈改变为指向第二堆栈;
将位于所述第一堆栈上的第一数据值从所述第一堆栈复制到所述第二堆栈;
调用所述第二应用程序的第二函数;
使用所述第二堆栈执行所述第二函数;
在所述第二函数完成时,将所述堆栈指针寄存器从指向所述第二堆栈改变为指向所述第一堆栈;
将位于所述第二堆栈上的第二数据值从所述第二堆栈复制到所述第一堆栈;
返回到所述第一应用程序;并且
继续使用所述第一堆栈执行所述第一应用程序;
执行所述第二应用程序,其中在执行所述第二应用程序时,所述堆栈指针寄存器指向所述第二堆栈;并且
在执行所述第二应用程序时:
调用所述第二应用程序的所述第一函数,其中调用所述第一函数包括将数据值推送到所述第二堆栈上;
执行所述第一函数,其中执行所述第一函数包括确定所述堆栈指针寄存器是正在指向所述第一堆栈还是正在指向所述第二堆栈;
至少部分地基于确定所述堆栈指针寄存器正在指向所述第二堆栈,保持所述堆栈指针寄存器指向所述第二堆栈;
从所述第一函数调用所述第二函数;以及
使用所述第二堆栈执行所述第二函数。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201762549637P | 2017-08-24 | 2017-08-24 | |
US62/549,637 | 2017-08-24 | ||
PCT/US2018/047981 WO2019040892A1 (en) | 2017-08-24 | 2018-08-24 | BATTERY SAFETY FOR INDEPENDENTLY DEFINED OPERATIONS |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111133419A CN111133419A (zh) | 2020-05-08 |
CN111133419B true CN111133419B (zh) | 2023-11-07 |
Family
ID=63490783
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880062179.XA Active CN111133419B (zh) | 2017-08-24 | 2018-08-24 | 用于独立定义的操作的堆栈安全 |
Country Status (6)
Country | Link |
---|---|
US (2) | US11036569B2 (zh) |
EP (1) | EP3673368A1 (zh) |
CN (1) | CN111133419B (zh) |
CA (1) | CA3073525C (zh) |
MX (1) | MX2020002104A (zh) |
WO (1) | WO2019040892A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA3017375C (en) * | 2018-09-10 | 2024-02-13 | Avigilon Coporation | Secured multi-process architecture |
EP3872606B1 (en) | 2020-02-25 | 2023-08-02 | NXP USA, Inc. | Processor system |
CN113377466B (zh) * | 2021-06-29 | 2022-11-25 | 展讯通信(天津)有限公司 | 算法执行方法、装置和电子设备 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1234548A (zh) * | 1997-10-06 | 1999-11-10 | 太阳微系统有限公司 | 混合执行堆栈及异常处理 |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6141697A (en) * | 1997-06-25 | 2000-10-31 | Unisys Corp. | System and method for performing external procedure calls in heterogeneous computer systems utilizing program stacks |
US6128641A (en) * | 1997-09-12 | 2000-10-03 | Siemens Aktiengesellschaft | Data processing unit with hardware assisted context switching capability |
CA2386200A1 (en) * | 1999-10-12 | 2001-04-19 | Autodesk, Inc. | Geographic maps on a personal digital assistant (pda) and server |
US6772292B2 (en) * | 2002-06-04 | 2004-08-03 | Isaak Garber | Two area stack |
US7617496B2 (en) * | 2004-04-23 | 2009-11-10 | Apple Inc. | Macroscalar processor architecture |
EP1622009A1 (en) * | 2004-07-27 | 2006-02-01 | Texas Instruments Incorporated | JSM architecture and systems |
KR100577366B1 (ko) * | 2004-09-25 | 2006-05-10 | 삼성전자주식회사 | 이종의 자바 메소드를 실행하는 방법 및 장치 |
WO2006069484A1 (en) * | 2004-12-30 | 2006-07-06 | Intel Corporation | Methods and apparatuses to maintain multiple execution contexts |
US7685601B2 (en) | 2005-02-28 | 2010-03-23 | Sony Computer Entertainment Inc. | Methods and apparatus for segmented stack management in a processor system |
TWI261197B (en) * | 2005-05-20 | 2006-09-01 | Benq Corp | Method for finding function call stack in run time for a computer system |
US9135054B1 (en) * | 2008-07-16 | 2015-09-15 | Apple Inc. | Method and apparatus to migrate stacks for thread execution |
JP5392203B2 (ja) * | 2010-08-19 | 2014-01-22 | 株式会社リコー | 情報処理装置、情報処理システム、インストール支援方法、及びインストール支援プログラム |
IN2013CH04831A (zh) | 2013-10-28 | 2015-08-07 | Empire Technology Dev Llc | |
US9483272B2 (en) * | 2014-09-30 | 2016-11-01 | Freescale Semiconductor, Inc. | Systems and methods for managing return stacks in a multi-threaded data processing system |
US9916141B2 (en) * | 2015-10-15 | 2018-03-13 | International Business Machines Corporation | Modifying execution flow in save-to-return code scenarios |
CN106681692A (zh) * | 2015-11-09 | 2017-05-17 | 联发科技(新加坡)私人有限公司 | 控制装置、集成电路及任务栈的管理方法 |
US10318450B2 (en) * | 2016-07-01 | 2019-06-11 | Intel Corporation | Efficient context based input/output (I/O) classification |
US11782762B2 (en) * | 2019-02-27 | 2023-10-10 | Qualcomm Incorporated | Stack management |
-
2018
- 2018-08-24 CA CA3073525A patent/CA3073525C/en active Active
- 2018-08-24 CN CN201880062179.XA patent/CN111133419B/zh active Active
- 2018-08-24 US US16/112,328 patent/US11036569B2/en active Active
- 2018-08-24 MX MX2020002104A patent/MX2020002104A/es unknown
- 2018-08-24 EP EP18765338.1A patent/EP3673368A1/en active Pending
- 2018-08-24 WO PCT/US2018/047981 patent/WO2019040892A1/en unknown
-
2021
- 2021-06-14 US US17/346,950 patent/US11907774B2/en active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1234548A (zh) * | 1997-10-06 | 1999-11-10 | 太阳微系统有限公司 | 混合执行堆栈及异常处理 |
Also Published As
Publication number | Publication date |
---|---|
WO2019040892A1 (en) | 2019-02-28 |
US20190065293A1 (en) | 2019-02-28 |
EP3673368A1 (en) | 2020-07-01 |
US11907774B2 (en) | 2024-02-20 |
CN111133419A (zh) | 2020-05-08 |
CA3073525A1 (en) | 2019-02-28 |
US20220043700A1 (en) | 2022-02-10 |
CA3073525C (en) | 2022-07-05 |
MX2020002104A (es) | 2020-09-18 |
US11036569B2 (en) | 2021-06-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11907774B2 (en) | Stack safety for independently defined operations | |
USRE48997E1 (en) | Memory system in which extended function can easily be set | |
EP3491519B1 (en) | Optimized uefi reboot process | |
US5999989A (en) | Plug-and-play | |
US9348730B2 (en) | Firmware ROM patch method | |
EP2972809B1 (en) | Boot sequencing for multi boot devices | |
EP2508990A1 (en) | Hypervisor replacing method and information processing device | |
AU2013407292B2 (en) | Devices, updaters, methods for controlling a device, and methods for controlling an updater | |
EP2375323A1 (en) | Firmware image update and management | |
EP1241571A2 (en) | Methods and apparatus for upgrading firmware in an embedded system | |
US7185331B2 (en) | Method and apparatus for downloading executable code in a non-disruptive manner | |
JP2007206885A (ja) | コンピュータシステム及びシステム起動方法 | |
US5825649A (en) | Kernel substitution method in multi-processor system and multi-processor system having kernel substitution function | |
JP2007172591A (ja) | マルチノード・システムにおいてアクティブなプロセッサの数を動的に変更する方法及び構成 | |
CN102662749A (zh) | 一种双Boot切换的实现方法及装置 | |
WO2012071852A1 (zh) | 引导程序的升级方法和装置 | |
CN100362470C (zh) | 一种bios在线升级装置及方法 | |
CN109189429A (zh) | 双核处理器amp模式下cpu0更新cpu1程序的方法 | |
US20090199216A1 (en) | Multi-level driver configuration | |
CN105630530A (zh) | 数字信号处理器多级启动方法及系统 | |
CN105204896A (zh) | 一种数字存储示波器的BootLoader设计方法 | |
US8464040B2 (en) | Systems and methods to control multiple peripherals with a single-peripheral application code | |
US20220147343A1 (en) | Tranistionary firmware packages | |
JP2013214122A (ja) | 情報処理装置、情報処理方法、及び情報処理プログラム | |
US8108645B2 (en) | Optimized memory allocation via feature extraction |
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 |