一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

堆栈寄存器的控制方法及装置、控制装置和电子设备与流程

2023-03-08 23:25:17 来源:中国专利 TAG:


1.本公开涉及但不限于计算机技术领域,尤其涉及一种堆栈寄存器的控制方法及装置、控制装置、电子设备和存储介质。


背景技术:

2.相关技术中,不同体系结构的处理器对堆栈寄存器的实现方式不同,例如,对于arm,处理器在不同的工作态下分别使用不同的堆栈寄存器,那么在处理器进行工作态变换时,按照入栈出栈运行即可。而对于一些架构的处理器,处理器在不同的工作态下共用同一个堆栈寄存器,那么在处理器进行工作态切换时,需要多条操作指令来保存上下文信息,存在操作复杂度高、增加了运行开销等问题。


技术实现要素:

3.本公开实施例至少提供一种堆栈寄存器的控制方法及装置、控制装置、电子设备和存储介质。
4.本公开实施例的技术方案是这样实现的:
5.本公开实施例提供一种堆栈寄存器的控制方法,所述方法包括;响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中;将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
6.本公开实施例提供一种控制装置,所述装置包括处理器和栈内存,所述处理器中包括任务控制块和堆栈寄存器,所述栈内存中包括内核态栈内存;所述处理器,用于响应于检测到进入内核态的请求,基于所述任务控制块的栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;将上下文信息保存至所述目标第一存储地址对应的内存中,并将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
7.本公开实施例提供一种堆栈寄存器的控制装置,所述装置包括:确定模块,用于响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;保存模块,用于将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中;更新模块,用于将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
8.本公开实施例提供一种电子设备,包括处理器和存储器,所述存储器存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法。
9.本公开实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法。
10.在本公开实施例中,通过响应于检测到进入内核态的请求,基于所述处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中;将所述堆
栈寄存器的指向地址更新为所述目标第一存储地址。这样,一方面,通过在任务控制块中添加栈结构体,可以快速获取目标第一存储地址,缩短保存上下文信息的时长,从而可以降低操作复杂度、提高操作效率;另一方面,通过该栈结构体,实现了快速对堆栈寄存器的控制,不仅提高了控制的准确度,而且可以降低处理器在工作态切换时的运行开销。
11.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本公开。
附图说明
12.此处的附图被并入说明书中并构成本说明书的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。
13.图1为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图;
14.图2为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图;
15.图3为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图;
16.图4a为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图;
17.图4b为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图;
18.图4c为本公开实施例提供的一种工作态切换的示意图;
19.图5a为本公开实施例提供的一种控制装置的组成结构示意图;
20.图5b为本公开实施例提供的一种堆栈寄存器的控制装置的组成结构示意图;
21.图6为本公开实施例中电子设备的一种硬件实体示意图。
具体实施方式
22.为了使本公开的目的、技术方案和优点更加清楚,下面将结合附图对本公开作进一步地详细描述,所描述的实施例不应视为对本公开的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本公开保护的范围。
23.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
24.在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本公开实施例能够以除了在这里图示或描述的以外的顺序实施。
25.除非另有定义,本文所使用的所有的技术和科学术语与属于本公开的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本公开实施例的目的,不是旨在限制本公开。
26.安全操作系统是一种特殊的操作系统,它为实现一些安全功能而设计,并且可以动态加载安全应用,安全应用用于完成具体的安全功能。为了安全操作系统的简洁性,安全应用的加载、地址映射、以及运行等功能需要进行单任务封装,并为linux提供接口。
27.相关技术中,由于安全操作系统要求保持简洁性,因此要求安全应用能够快速单任务启动,需要在一次系统调用中完成功能,而linux需要多次系统调用才能完成任务启
动。同时对于linux等常见操作系统,加载运行应用程序都是通过创建新任务的方式(例如,fork exec),每运行一个新的应用就会启动一个任务。这些协助启动新任务的系统调用一般不会涉及到用户态与内核态的嵌套调用,即:从用户态发起一个系统调用,到内核态完成一个功能,再返回用户态,也不会存在一个需要再次调用到用户态的系统调用。因此安全操作系统在一些架构的处理器上,无法使用linux的栈内存方式。
28.不同体系结构的处理器对堆栈寄存器的实现方式不同。例如,对于arm,无论是32位,还是64位,处理器在不同的工作态下分别使用不同的堆栈寄存器(简称sp寄存器),那么在处理器进行工作态变换时,按照入栈出栈运行即可。而对于一些架构的处理器(例如,riscv架构),处理器在不同的工作态下共用同一个堆栈寄存器,那么在处理器进行工作态切换时,需要多条操作指令来保存上下文信息,同时如果工作态切换涉及到复杂的嵌套关系时,需要更加多且复杂的指令来完成相应的操作,存在操作复杂度高、增加了运行开销等问题。
29.下面,将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述。
30.图1为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图,如图1所示,该方法包括步骤s11至步骤s13,其中:
31.步骤s11、响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址。
32.这里,处理器的工作态可以包括但不限于用户态、内核态、虚拟化监控态等。在不同的处理器架构中,工作态的名称可以相同或不相同。
33.进入内核态的请求可以包括但不限于系统调用、中断、异常等。其中,系统调用是主动要求切换到内核态的一种方式,例如,调用系统函数、创建新进程等。中断是指处理器在顺序执行程序指令流的过程中突然被中断请求打断而中止执行当前的程序,转而去处理别的事情,中断请求的来源则称之为中断源(interrupt source),中断源可以包括但不限于外围硬件设备等,中断是一种正常的机制,而非一种错误。异常是指应用程序发生了非正常的错误(例如,缺页异常),需要切换到内核态才能进行处理。
34.任务控制块(task control block,tcb)主要用于记录任务的堆栈栈顶指针、指向下一个任务控制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。
35.栈内存是内存中的一个区域。在一些实施方式中,栈内存可以包括但不限于内核态栈内存、用户态栈内存等。其中,用户态栈内存主要用于保护各个函数的参数、返回值、局部变量等。内核栈内存主要是用于存放处理器的上下文信息,其中,上下文信息可以包括但不限于在用户态时sp寄存器所指向的用户态栈内存的地址信息、安全应用在运行的过程中所使用的一些寄存器的值等。
36.内核态栈内存可以是由一段连续的存储空间形成的,每一存储空间分别包括一个第一存储地址,该第一存储地址是一个标识符,即:通过该第一存储地址,便可以访问对应的存储空间。
37.栈结构体主要用于记录处理器主动进入用户态时,该堆栈寄存器所指向的内核态栈内存的存储地址。该栈结构体可以通过任意合适的方式来实现。例如,数组、位图、树等。
在实施时,本领域技术人员可以根据实际需求自主选择实现栈结构体的方式,本公开实施例不作限定。
38.在一些实施方式中,所述步骤s11中的“基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址”包括步骤s111至步骤s112,其中:
39.步骤s111、从所述栈结构体中的至少一个第二存储地址中确定目标第二存储地址。
40.这里,每一第二存储地址分别对应处理器进入用户态时堆栈寄存器所指向的内核态栈内存的一个第一存储地址。在实施时,每一安全应用在启动时,处理器会由内核态主动进入用户态,此时,通过该栈结构体记录堆栈寄存器所指向的内核态栈内存的一个存储地址。
41.在一些实施方式中,由于安全应用在运行的过程中,可能会调用其它的安全应用,那么,其它安全应用在启动时,处理器会由内核态主动进入用户态,此时,通过该栈结构体记录堆栈寄存器所指向的内核态栈内存的一个存储地址。
42.在一些实施方式中,在所述栈结构体为预设的存储结构的情况下,所述存储结构中的至少一个元素对应用于存储所述内核态栈内存的一个第一存储地址;所述步骤s111包括步骤s1111至步骤s1112,其中:
43.步骤s1111、从每一所述元素中确定目标元素。
44.这里,存储结构可以包括但不限于数组、位图、idr树等。在实施时,该存储结构中包括至少一个元素。每一所述元素用于存储处理器进入用户态时堆栈寄存器所指向的内核态栈内存的一个存储地址。
45.目标元素可以包括但不限于指定位置的元素、通过多个元素计算得到的等。例如,对于数组而言,可以将第一个非零元素或最后一个非零元素作为该目标元素。又例如,对于位图而言,可以将第一个元素、最后一个非零元素、或某一位置的非零元素等作为该目标元素。还例如,对于idr树,通过至少一个层中的至少一个元素来表征存储地址的信息,此时,可以根据多个元素计算得到目标元素。
46.步骤s1112、将所述目标元素对应的值作为所述目标第二存储地址。
47.例如,假设栈结构体为一数组,该数组中包括100个元素,其中,前5个元素的值不为0(即:数组记录了五个第二存储地址),其余元素的值均为0,此时,可以将第五个元素作为目标元素,并将该目标元素的值作为该目标第二存储地址。
48.步骤s112、基于所述目标第二存储地址,从所述内核态栈内存中的每一所述第一存储地址中,确定所述目标第一存储地址。
49.这里,目标第一存储地址不大于目标第二存储地址。由于栈是一种后进先出的队列,在处理器中,将数据放入栈中成为压栈,从栈中移除数据称为出栈或弹栈。在一些实施方式中,栈是按照从高到低的地址顺序增长,通过减栈指针将数据进行压栈,通过增加栈指针缩小栈,从而弹出栈中的值。那么按照压栈减针的方式,可以将目标第二存储地址的下一存储地址作为该目标第一存储地址。
50.步骤s12、将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中。
51.这里,上下文信息可以包括但不限于在用户态时sp寄存器所指向的用户态栈内存的地址信息、安全应用在运行的过程中所使用的一些寄存器的值等。
52.在一些实施方式中,所述步骤s12包括步骤s121至步骤s123,其中:
53.步骤s121、基于预设的读取指令,读取所述任务控制块中的缓存区的存储地址。
54.这里,缓存区用于临时存储上下文信息。在初始化时,可以将缓存区的存储地址保存在预设的寄存器中。其中,预设的寄存器可以是通过预设的选取规则,从处理器的至少一个寄存器中选取的寄存器,该选取规则可以包括但不限于自定义、用户喜好、随机等。在实施时,该寄存器不参与后续的逻辑运算。
55.读取指令用于对预设的寄存器进行读取的指令。不同的寄存器可以对应相同或不同的读取指令。例如,在将sscratch寄存器作为该预设的寄存器的情况下,那么该读取指令可以为csrrw指令,利用该csrrw指令直接从sscratch寄存器中读取该缓存区的地址。
56.步骤s122、基于所述缓存区的存储地址,从所述缓存区中获取所述处理器的上下文信息。
57.这里,通过该存储地址,从缓存区中获取该上下文信息。
58.步骤s123、将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中。
59.这里,将获取的上下文信息保存至对应的内核态栈内存中。
60.步骤s13、将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
61.这里,在进入内核态之前,堆栈寄存器的指向地址为用户态栈内存的一个地址,在进入内核态之后,将堆栈寄存器的指向地址更新为目标第一存储地址,以便于处理器进行后续的逻辑运算。
62.在本公开实施例中,通过响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中;将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。这样,一方面,通过在任务控制块中添加栈结构体,可以快速获取目标第一存储地址,缩短保存上下文信息的时长,从而可以降低操作复杂度、提高操作效率;另一方面,通过该栈结构体,实现了快速对堆栈寄存器的控制,不仅提高了控制的准确度,而且可以降低处理器在工作态切换时的运行开销。
63.在一些实施方式中,在步骤s12之前,所述方法还包括步骤s14至步骤s15,其中:
64.步骤s14、基于预设的读取指令,获取所述任务控制块中的缓存区的存储地址。
65.这里,在初始化时,可以将缓存区的存储地址保存在预设的寄存器中。不同的寄存器可以对应相同或不同的读取指令。例如,对于sscratch寄存器,可以通过csrrw指令来读取该sscratch寄存器中的内容。
66.步骤s15、基于所述缓存区的存储地址,将所述上下文信息保存至所述缓存区中。
67.在本公开实施方式中,通过基于预设的读取指令,获取所述任务控制块中的缓存区的存储地址;基于所述缓存区的存储地址,将所述上下文信息保存至所述缓存区中。这样,在进入内核态之前,通过缓存区临时保存上下文信息,不仅可以降低上下文信息丢失的可能性,从而可以提高上下文信息的准确性和完整性,而且还可以提高处理器的工作效率。
68.在一些实施方式中,在步骤s12之后,所述方法还包括步骤s16至步骤s17,其中:
69.步骤s16、基于所述读取指令,获取所述缓存区的存储地址。
70.这里,在初始化时,可以将缓存区的存储地址保存在预设的寄存器中。不同的寄存器可以对应相同或不同的读取指令。
71.步骤s17、基于所述缓存区的存储地址,清空所述缓存区。
72.这里,通过该存储地址,清空缓存区的内容,降低因读写错误导致数据丢失、因覆盖不全导致数据错误等可能性。
73.在本公开实施方式中,通过基于所述读取指令,获取所述缓存区的存储地址;基于所述缓存区的存储地址,清空所述缓存区。这样,在将上下文信息保存至内核态栈内存后,及时对缓存区的内容进行清空,可以降低上下文信息读写错误的可能性,从而可以提高上下文信息的准确度。
74.图2为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图,如图2所示,该方法包括步骤s21至步骤s26,其中:
75.步骤s21、响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址。
76.步骤s22、将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中。
77.步骤s23、将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
78.这里,上述步骤s21至步骤s23分别对应于前述步骤s11至步骤s13,在实施时,可以参照前述步骤s11至步骤s13的具体实施方式。
79.步骤s24、响应于检测到返回用户态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第四存储地址。
80.这里,目标第四存储地址表征对应存储目标第三存储地址的存储空间的地址。其中,目标第三存储地址为处理器进入内核态时堆栈寄存器所指向的用户态栈内存的一个存储地址。
81.在一些实施方式中,该目标第四存储地址与目标第一存储地址相同,也可以不同。例如,在目标第一存储地址对应的存储空间中存储目标第三存储地址的情况下,目标第四存储地址与目标第一存储地址相同。又例如,在其它第一存储地址对应的存储空间中存储目标第三存储地址的情况下,目标第四存储地址与目标第一存储地址则不相同。
82.在一些实施方式中,确定目标第四存储地址的方式与前述步骤s11中确定目标第一存储地址的方式类似,在实施时,可以参照前述步骤s11的具体实施方式。
83.步骤s25、将所述堆栈寄存器的指向地址更新为所述目标第四存储地址。
84.这里,由于安全应用在内核态完成相应功能后,需要返回用户态继续运行。此时,需要将堆栈寄存器的指向地址更新为用户态栈内存的一个存储地址。
85.在一些实施方式中,堆栈寄存器的指向地址的更新方式与前述步骤s13类似,在实施时,可以参照前述步骤s13的具体实施方式。
86.步骤s26、基于所述目标第四存储地址,从所述内核态栈内存中获取所述上下文信息中的目标第三存储地址,并将所述堆栈寄存器的指向地址更新为所述目标第三存储地址。
87.这里,目标第三存储地址表征处理器进入内核态时堆栈寄存器所指向的用户态栈
内存的一个存储地址。在返回用户态时,将堆栈寄存器的指向地址更新为进入内核态之前所指向的目标第三存储地址。
88.在本公开实施例中,通过响应于检测到返回用户态的请求,基于处理器的任务控制块的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第四存储地址;将堆栈寄存器的指向地址更新为目标第四存储地址;基于目标第四存储地址,从内核态栈内存中获取上下文信息中的目标第三存储地址,并将堆栈寄存器的指向地址更新为目标第三存储地址。这样,一方面,利用该栈结构体,可以从内核态栈内存中快速获取目标第三存储地址,在缩短了获取目标第三存储地址的时长的同时也提高了目标第三存储地址的准确度,从而可以降低操作复杂度、提高操作效率;另一方面,通过该栈结构体,实现了快速对堆栈寄存器的控制,不仅提高了控制的准确度,而且可以降低处理器在工作态切换时的运行开销。
89.图3为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图,如图3所示,该方法包括步骤s31至步骤s35,其中:
90.步骤s31、响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址。
91.步骤s32、将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中。
92.步骤s33、将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
93.这里,上述步骤s31至步骤s33分别对应于前述步骤s11至步骤s13,在实施时,可以参照前述步骤s11至步骤s13的具体实施方式。
94.步骤s34、响应于检测到进入用户态的请求,获取所述堆栈寄存器所指向的存储地址。
95.这里,存储地址可以是内核态栈内存中的一个第一存储地址。在实施时,每一安全应用在启动时,处理器会由内核态主动进入用户态,此时,通过该栈结构体记录当前堆栈寄存器所指向的内核态栈内存的一个存储地址。
96.在一些实施方式中,可以通过对应的汇编指令,获取该堆栈寄存器所指向的存储地址。
97.步骤s35、将所述堆栈寄存器所指向的存储地址保存至所述栈结构体中。
98.这里,通过栈结构体保存至少一个处理器主动进入用户态时,该堆栈寄存器所指向的内核态栈内存的存储地址。
99.在本公开实施例中,通过响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址,并将堆栈寄存器的指向地址更新为目标第一存储地址;响应于检测到进入用户态的请求,获取堆栈寄存器所指向的存储地址;将堆栈寄存器所指向的存储地址保存至栈结构体中。这样,通过在栈结构体中保存至少一个进入用户态时堆栈寄存器所指向的内核态栈内存的一个存储地址,以便于后续通过该栈结构体,可以快速获取目标第一存储地址,在缩短获取目标第一存储地址的时长的同时也提高了目标第一存储地址的准确度,从而可以降低操作复杂度、提高操作效率;另一方面,通过该栈结构体,实现了快速对堆栈寄存器的控制,不仅提高了控制的准确度,而且可以降低处理器在工作态切换时的运行开销。
100.在一些实施方式中,所述方法还包括步骤s36至步骤s37,其中:
101.步骤s36、响应于检测到返回内核态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第五存储地址。
102.这里,目标第五存储地址为上一次主动进入用户态时,堆栈寄存器所指向的内核态栈内存的一个存储地址。在实施时,目标第五存储地址为栈结构体中保存的一个存储地址。
103.在一些实施方式中,确定目标第五存储地址的方式与前述步骤s11中确定目标第一存储地址的方式类似,在实施时,可以参照前述步骤s11的具体实施方式。
104.步骤s37、将所述堆栈寄存器的指向地址更新为所述目标第五存储地址,并从所述栈结构体中删除所述目标第五存储地址。
105.这里,由于安全应用在用户态完成相应任务后,需要返回内核态,此时需要将堆栈寄存器的指向地址更新为内核态栈内存的一个存储地址。
106.在一些实施方式中,堆栈寄存器的指向地址的更新方式与前述步骤s13类似,在实施时,可以参照前述步骤s13的具体实施方式。
107.在安全应用的启动完成后,此时,堆栈寄存器的指向地址与进入用户态之前的指向地址一致,那么,需要从栈结构体中删除对应的存储地址。
108.在本公开实施方式中,通过响应于检测到返回内核态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第五存储地址;将所述堆栈寄存器的指向地址更新为所述目标第五存储地址,并从所述栈结构体中删除所述目标第五存储地址。这样,一方面,利用该栈结构体,可以从内核态栈内存中快速获取目标第五存储地址,在缩短了获取目标第五存储地址的时长的同时也提高了目标第五存储地址的准确度,从而可以降低操作复杂度、提高操作效率;另一方面,处理器在工作态切换完成后,及时从该栈结构体中删除对应的存储地址,可以提高栈结构体中存储地址的准确度。
109.下面说明本公开实施例提供的堆栈寄存器的控制方法在实际场景中的应用,以对基于riscv架构的处理器为例进行说明。
110.相关技术中,对于riscv架构的处理器,处理器在不同的工作态下共用同一个堆栈寄存器(sp寄存器),那么在处理器进行工作态切换时,需要多条操作指令来保存上下文信息,同时如果工作态切换涉及到复杂的嵌套关系时,需要更加多且复杂的指令来完成相应的操作,存在操作复杂度高、增加了运行开销等问题。
111.本公开实施例提供一种堆栈寄存器的控制方法,通过在任务控制块中添加栈结构体和缓存区,基于该栈结构体和缓存区,准确及高效的对sp寄存器进行控制。其中,该栈结构体主要用于记录处理器主动进入用户态时,该sp寄存器所指向的内核态栈内存的存储地址。缓存区主要用于保存上下文信息,该上下文信息中包括在进入内核态之前,sp寄存器所指向的用户态栈内存的地址信息。
112.图4a为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图,如图4a所示,该方法包括步骤s411至步骤s412,其中:
113.步骤s411、响应于检测到进入用户态的请求,获取sp寄存器所指向的存储地址,并将该存储地址保存至栈结构体中;
114.这里,安全应用启动时,会从内核态发起进入用户态。sp寄存器所指向的存储地址
为内核态栈内存的一个存储地址。
115.步骤s412、响应于检测到返回内核态的请求,基于该栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第五存储地址,并将sp寄存器的指向地址更新为目标第五存储地址。
116.这里,安全应用启动/运行完成后,需要从用户态返回内核态。此时,sp寄存器的指向地址应该由用户态栈内存的存储地址更新为内核态栈内存的存储地址。在实施时,该目标第五存储地址为主动进入用户态时该sp寄存器所指向的内核态栈内存的一个存储地址。
117.图4b为本公开实施例提供的一种堆栈寄存器的控制方法的实现流程示意图,如图4b所示,该方法包括步骤s421至步骤s430,其中:
118.步骤s421、将tcb的缓存区的地址保存至sscratch寄存器中;
119.步骤s422、响应于检测到进入内核态的请求,通过csrrw指令,从sscratch寄存器中读取该缓存区的存储地址,并基于缓存区的存储地址,将上下文信息保存至缓存区中;
120.这里,安全应用在运行的过程中,由于系统调用、中断或异常等,需要陷入内核态。此时,sp寄存器的指向地址应该由用户态栈内存的存储地址更新为内核态栈内存的存储地址。
121.步骤s423、基于该栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;
122.这里,该目标第一存储地址可以是栈结构体中的最后一个非零、或第一个非零的存储地址。
123.步骤s424、通过csrrw指令,从sscratch寄存器中读取该缓存区的存储地址,并基于缓存区的存储地址,从缓存区中获取上下文信息;
124.步骤s425、将上下文信息保存至目标第一存储地址对应的内存中;
125.步骤s426、将sp寄存器的指向地址更新为目标第一存储地址;
126.步骤s427、响应于检测到返回用户态的请求,基于该栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第四存储地址;
127.这里,安全应用在内核态完成相应功能后,需要返回用户态继续运行。此时,sp寄存器的指向地址应该由内核态栈内存的存储地址更新为用户态栈内存的存储地址。
128.目标第四存储地址为内核态栈内存的一个存储地址,该存储地址对应的存储空间中存储了目标第三存储地址,该目标第三存储地址为进入内核态时sp寄存器所指向的用户态栈内存的一个存储地址。
129.步骤s428、将sp寄存器的指向地址更新为目标第四存储地址;
130.步骤s429、基于目标第四存储地址,从内核态栈内存中获取目标第三存储地址;
131.步骤s430、将sp寄存器的指向地址更新为目标第三存储地址。
132.这里,在返回用户态后,该sp寄存器应该指向用户态栈内存,以便于后续的逻辑运算。
133.图4c为本公开实施例提供的一种工作态切换的示意图,如图4c所示,当安全应用启动时,进入第一切换模式41,即:处理器从内核态401发起进入用户态402;当启动完成或执行完成后,进入第二切换模式42,即:从用户态402返回内核态401。在安全应用运行的过程中,若发生系统调用、异常、中断等,进入第三切换模式43,即:从用户态402进入内核态
401;当在内核态401中完成相应功能后,进入第四切换模式44,即:从内核态401返回用户态402。
134.在一些实施方式中,在安全应用运行的过程中,可能会存在至少一次系统调用、异常、中断等,那么在进入第四切换模式44之前,会存在多次嵌套新的第三切换模式43和新的第四切换模式44。这样,通过该栈结构体保存的存储地址,可以准确得到sp寄存器的指向地址,一方面,可以降低因嵌套多个工作态切换所带来的运行开销,另一方面,可以提高控制的准确度,保障系统的正常运行。
135.在一些实施方式中,在安全应用运行的过程中可能会调用其它的安全应用,即:在进入第四切换模式44之前,会嵌入新的第一切换模式41和新的第二切换模式42。在进入新的第二切换模式42之前,若发生至少一次系统调用、异常、中断等情况,则在新的第一切换模式41之后、新的第二切换模式42之前,会嵌入至少一个新的第三切换模式43和新的第四切换模式44。这样,通过该栈结构体保存的存储地址,可以准确得到sp寄存器的指向地址,一方面,可以降低因嵌套多个工作态切换所带来的运行开销,另一方面,可以提高控制的准确度,保障系统的正常运行。
136.在本公开实施例中,首先,通过在任务控制块中添加栈结构体,可以快速获取对应的存储地址,在缩短了获取存储地址的时长的同时也提高了存储地址的准确度,从而可以降低操作复杂度、提高操作效率;其次,在进入内核态之前,通过缓存区临时保存上下文信息,不仅可以降低上下文信息丢失的可能性,从而可以提高上下文信息的准确性和完整性,而且还可以提高处理器的工作效率;再次,通过该栈结构体,实现了快速对堆栈寄存器的控制,不仅提高了控制的准确度,而且可以降低处理器在工作态切换时的运行开销。
137.基于上述实施例,本公开实施例提供一种控制装置,图5a为本公开实施例提供的一种控制装置,如图5a所示,所述装置500包括处理器501和栈内存502,所述处理器501中包括任务控制块5011和堆栈寄存器5012,所述栈内存502中包括内核态栈内存5021,其中:
138.所述内核态栈内存5021,用于存储所述处理器的上下文信息;
139.所述处理器501,用于响应于检测到进入内核态的请求,基于所述任务控制块的栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;将所述上下文信息保存至所述目标第一存储地址对应的内存中,并将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
140.在一些实施方式中,所述处理器501,还用于从所述栈结构体中的至少一个第二存储地址中确定目标第二存储地址;其中,每一所述第二存储地址分别对应所述处理器进入用户态时所述堆栈寄存器所指向的所述内核态栈内存的一个第一存储地址;基于所述目标第二存储地址,从所述内核态栈内存中的每一所述第一存储地址中,确定所述目标第一存储地址。
141.在一些实施方式中,在所述栈结构体为预设的存储结构的情况下,所述存储结构中的至少一个元素对应用于存储所述内核态栈内存的一个第一存储地址;所述处理器501,还用于从每一所述元素中确定目标元素;其中,所述目标元素包括以下之一:第一个非零元素、最后一个非零元素;将所述目标元素对应的值作为所述目标第二存储地址。
142.在一些实施方式中,所述栈内存502还包括用户态栈内存,所述上下文信息中包括所述处理器进入内核态时所述堆栈寄存器所指向的所述用户态栈内存的目标第三存储地
址;所述处理器501,还用于响应于检测到返回用户态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第四存储地址;将所述堆栈寄存器的指向地址更新为所述目标第四存储地址;基于所述目标第四存储地址,从所述内核态栈内存中获取所述目标第三存储地址,并将所述堆栈寄存器的指向地址更新为所述目标第三存储地址。
143.在一些实施方式中,所述任务控制块5011中包括缓存区;所述缓存区,用于存储所述上下文信息;所述处理器501,还用于基于预设的读取指令,读取所述缓存区的存储地址;基于所述缓存区的存储地址,从所述缓存区中获取所述上下文信息,并将所述上下文信息保存至所述目标第一存储地址对应的内存中。
144.在一些实施方式中,所述处理器501,还用于基于预设的读取指令,获取所述缓存区的存储地址;基于所述缓存区的存储地址,将所述上下文信息保存至所述缓存区中。
145.在一些实施方式中,所述处理器501,还用于基于所述读取指令,获取所述缓存区的存储地址;基于所述缓存区的存储地址,清空所述缓存区。
146.在一些实施方式中,所述处理器501,还用于响应于检测到进入用户态的请求,获取所述堆栈寄存器所指向的存储地址;将所述堆栈寄存器所指向的存储地址保存至所述栈结构体中。
147.在一些实施方式中,所述处理器501,还用于响应于检测到返回内核态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第五存储地址;将所述堆栈寄存器的指向地址更新为所述目标第五存储地址,并从所述栈结构体中删除所述目标第五存储地址。
148.基于上述实施例,本公开实施例提供一种堆栈寄存器的控制装置,图5b为本公开实施例提供的一种堆栈寄存器的控制装置,如图5b所示,所述装置510包括确定模块51、保存模块52及更新模块53,其中:
149.所述确定模块51,用于响应于检测到进入内核态的请求,基于处理器的任务控制块中的栈结构体,从内核态栈内存中的至少一个第一存储地址中确定目标第一存储地址;
150.所述保存模块52,用于将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中;
151.所述更新模块53,用于将所述堆栈寄存器的指向地址更新为所述目标第一存储地址。
152.在一些实施方式中,所述确定模块51,还用于:从所述栈结构体中的至少一个第二存储地址中确定目标第二存储地址;其中,每一所述第二存储地址分别对应所述处理器进入用户态时所述堆栈寄存器所指向的所述内核态栈内存的一个第一存储地址;基于所述目标第二存储地址,从所述内核态栈内存中的每一所述第一存储地址中,确定所述目标第一存储地址。
153.在一些实施方式中,在所述栈结构体为预设的存储结构的情况下,所述存储结构中的至少一个元素对应用于存储所述内核态栈内存的一个第一存储地址;所述确定模块51,还用于:从每一所述元素中确定目标元素;其中,所述目标元素包括以下之一:第一个非零元素、最后一个非零元素;将所述目标元素对应的值作为所述目标第二存储地址。
154.在一些实施方式中,所述上下文信息中包括所述处理器进入内核态时所述堆栈寄
存器所指向的用户态栈内存的目标第三存储地址,所述装置还包括第一更新模块,所述第一更新模块,用于:响应于检测到返回用户态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第四存储地址;将所述堆栈寄存器的指向地址更新为所述目标第四存储地址;基于所述目标第四存储地址,从所述内核态栈内存中获取所述目标第三存储地址,并将所述堆栈寄存器的指向地址更新为所述目标第四存储地址。
155.在一些实施方式中,所述保存模块52,还用于:基于预设的读取指令,读取所述任务控制块中的缓存区的存储地址;基于所述缓存区的存储地址,从所述缓存区中获取所述处理器的上下文信息;将所述处理器的上下文信息保存至所述目标第一存储地址对应的内存中。
156.在一些实施方式中,所述装置还包括第一保存模块;所述第一保存模块,用于:基于预设的读取指令,获取所述任务控制块中的缓存区的存储地址;基于所述缓存区的存储地址,将所述上下文信息保存至所述缓存区中。
157.在一些实施方式中,所述装置还包括清空模块;所述清空模块,用于:基于所述读取指令,获取所述缓存区的存储地址;基于所述缓存区的存储地址,清空所述缓存区。
158.在一些实施方式中,所述装置还包括第二保存模块,所述第二保存模块,用于:响应于检测到进入用户态的请求,获取所述堆栈寄存器所指向的存储地址;将所述堆栈寄存器所指向的存储地址保存至所述栈结构体中。
159.在一些实施方式中,所述装置还包括删除模块;所述删除模块,用于:响应于检测到返回内核态的请求,基于所述栈结构体,从所述内核态栈内存中的至少一个第一存储地址中确定目标第五存储地址;将所述堆栈寄存器的指向地址更新为所述目标第五存储地址,并从所述栈结构体中删除所述目标第五存储地址。
160.以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本公开装置实施例中未披露的技术细节,请参照本公开方法实施例的描述而理解。
161.需要说明的是,本公开实施例中,如果以软件功能模块的形式实现上述方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一台电子设备(可以是个人计算机、服务器、或者网络设备等)执行本公开各个实施例所述方法的全部或部分。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read only memory,rom)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本公开实施例不限制于任何特定的硬件和软件结合。
162.本公开实施例提供一种电子设备,包括处理器和存储器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一方法。
163.本公开实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述任一方法。所述计算机可读存储介质可以是瞬时性的,也可以是非瞬时性的。
164.本公开实施例提供一种计算机程序产品,所述计算机程序产品包括存储了计算机程序的非瞬时性计算机可读存储介质,所述计算机程序被处理器读取并执行时,实现上述
方法中的部分或全部步骤。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
165.需要说明的是,图6为本公开实施例中电子设备的一种硬件实体示意图,如图6所示,该电子设备600的硬件实体包括:处理器601、通信接口602和存储器603,其中:
166.处理器601通常控制电子设备600的总体操作。
167.通信接口602可以使电子设备通过网络与其他终端或服务器通信。
168.存储器603配置为存储由处理器601可执行的指令和应用,还可以缓存待处理器601以及电子设备600中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(flash)或随机访问存储器(random access memory,ram)实现。处理器601、通信接口602和存储器603之间可以通过总线604进行数据传输。
169.这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本公开存储介质和设备实施例中未披露的技术细节,请参照本公开方法实施例的描述而理解。
170.应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本公开的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本公开的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本公开实施例的实施过程构成任何限定。上述本公开实施例序号仅仅为了描述,不代表实施例的优劣。
171.需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
172.在本公开所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
173.上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
174.另外,在本公开实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集
成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
175.本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(read only memory,rom)、磁碟或者光盘等各种可以存储程序代码的介质。
176.或者,本公开上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台电子设备(可以是个人计算机、服务器、或者网络设备等)执行本公开各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、rom、磁碟或者光盘等各种可以存储程序代码的介质。
177.以上所述,仅为本公开的实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献