处理器及其原生MPU的SBoot处理方法转让专利

申请号 : CN201911343420.9

文献号 : CN111143821B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杜宽森王大永谭永伟

申请人 : 上海航芯电子科技股份有限公司

摘要 :

本发明提供了一种处理器及其原生MPU的SBoot处理方法,其中,结合ARMv7‑M架构权限模式和原生MPU特性,提供了执行关键代码的接口,进而能够以非特权级权限引导进入一级用户的关键代码,避免了关键代码被任意调取,从而既能保护一级用户的关键代码,又能使得二级用户正常开发。同时,还可结合ARMv7‑M架构权限模式和原生MPU特性接管中断,实现执行关键代码的关键步骤;以及最终让处理器工作在Thread模式下,以非特权级权限引导进入用户中断处理程序,进一步实现对一级用户关键代码的保护,以及二级用户正常开发。

权利要求 :

1.一种处理器原生MPU的SBoot处理方法,其特征在于,包括:在二级用户应用工作在非特权级权限时,二级用户应用若需调用禁止访问区的关键代码,则:调用只读区中相应的接口函数,以向调用管理函数传递目标函数相应的索引值;

触发第一SVC中断,并使得:退出所述第一SVC中断后,处理器的工作权限被配置为特权级权限,并跳转至调用管理函数,以使得所述调用管理函数执行所述索引值对应的目标函数;

目标函数执行完成后,触发第二SVC中断,并使得:退出所述第二SVC中断后,处理器的工作权限恢复为非特权级权限。

2.根据权利要求1所述的方法,其特征在于,在二级用户应用工作在非特权级权限时,若二级用户应用运行中产生中断,则:进入SBoot的中断处理过程,处理器此时工作在Handler模式,应用获取特权级权限;

在所述SBoot的中断处理过程中触发嵌套的第三SVC中断,并使得所述处理器在退出所述第三SVC中断后工作在Thread模式;工作在所述Thread模式的处理器的工作权限被配置为非特权级权限;

在所述Thread模式下,调用二级用户的中断处理程序;

在调用结束后触发嵌套的第四SVC中断,并使得所述处理器在退出所述第四SVC中断后恢复工作在Handler模式。

3.根据权利要求1或2所述的方法,其特征在于,在二级用户应用工作在非特权级权限之前,还包括:当一级用户完成开发工作后,将所述SBoot下载到芯片并设置为默认启动程序;

在所述SBoot启动之后,分别确定所述禁止访问区与所述只读区;

将一级用户已经开发完成的关键代码下载至所述禁止访问区,并在所述只读区中记录用于调用目标函数的接口函数。

4.根据权利要求1或2所述的方法,其特征在于,退出所述第二SVC中断后,还包括:退出至所述只读区中接口函数的返回地址,继续主流程的运行。

5.根据权利要求1或2所述的方法,其特征在于,所述SBoot中未设有读存储空间的接口。

6.根据权利要求1或2所述的方法,其特征在于,所述SBoot中各中断的优先级中,SVC中断优先级最高。

7.根据权利要求1或2所述的方法,其特征在于,当所述处理器处于Thread模式时,特权级权限与非特权级权限是通过控制寄存器的设置变化的。

8.一种处理器,其特征在于,用于执行权利要求1至7任一项所述的处理方法。

说明书 :

处理器及其原生MPU的SBoot处理方法

技术领域

[0001] 本发明涉及处理器领域,尤其涉及一种处理器及其原生MPU的SBoot处理方法。

背景技术

[0002] 以ARMv7‑M架构处理器为例的部分处理器有面积小,功耗低,性能强劲等优点,在嵌入式领域的应用越来越广泛。随着应用场景的复杂化,尤其是在合作开发的情境下,为了保护用户的关键代码不被泄露,需要提供一种既能保证其他用户(以下简称“二级用户”)正常开发,又能保护当前用户(以下简称“一级用户”)关键代码的方案。而ARMv7‑M架构处理器原生MPU由于其局限性,无法直接使用以达到此目的。
[0003] 解决此问题的方法主要有两种。一是使用MPU经过特殊设计的芯片,一级用户设置MPU保护关键代码区后,直接提供给二级用户进行开发,无需担心代码泄露;二是一级用户引入操作系统,二级用户的程序以App的形式运行在操作系统上,无法获取关键代码的访问权。
[0004] 采用专用芯片的方法简单且易于操作,无需额外的软件设计,但由于需要使用专用芯片,会增加平台迁移的成本,而且这类芯片一般价格较贵;引入操作系统的方法,使用繁琐浪费资源,而且会导致二级用户无法进行深度开发。
[0005] 可见,现有相关技术中,难以兼顾一级用户关键代码的保护,以及二级用户的正常开发。

发明内容

[0006] 本发明提供一种处理器及其原生MPU的SBoot处理方法,以解决难以兼顾一级用户关键代码的保护,以及二级用户的正常开发的问题。
[0007] 根据本发明的第一方面,提供了一种ARMv7‑M架构处理器原生MPU的SBoot处理方法,包括:
[0008] 在二级用户应用工作在非特权级权限时,二级用户应用若需调用禁止访问区的关键代码,则:
[0009] 调用只读区中相应的接口函数,以向调用管理函数传递目标函数相应的索引值;
[0010] 触发第一SVC中断,并使得:退出所述第一SVC中断后,处理器的工作权限被配置为特权级权限;
[0011] 跳转至调用管理函数,以使得所述调用管理函数执行所述索引值对应的目标函数;
[0012] 目标执行完成后,触发第二SVC中断,并使得:退出所述第二SVC中断后,处理器的工作权限恢复为非特权级权限。
[0013] 可选的,在二级用户应用工作在非特权级权限时,若二级用户应用运行中产生中断,则:
[0014] 进入SBoot的中断处理过程,处理器此时工作在Handler模式,应用(自动)获取特权级权限;
[0015] 在所述SBoot的中断处理过程中触发嵌套的第三SVC中断,并使得所述处理器在退出所述第三SVC中断后工作在Thread模式;工作在所述Thread模式的处理器的工作权限被配置为非特权级权限;
[0016] 在所述Thread模式下,调用二级用户的中断处理程序;
[0017] 在调用结束后触发嵌套的第四SVC中断,并使得所述处理器在退出所述第四SVC中断后恢复工作在Handler模式。
[0018] 可选的,调用只读区中相应的接口函数之前,还包括:
[0019] 当一级用户完成开发工作后,将所述SBoot下载到芯片并设置为默认启动程序;
[0020] 在所述SBoot启动之后,分别确定所述禁止访问区与所述只读区;
[0021] 将一级用户已经开发完成的关键代码下载至所述禁止访问区,并在所述只读区中记录用于调用关键代码的接口函数。
[0022] 可选的,退出所述第二SVC中断后,还包括:
[0023] 退出至所述只读区中接口函数的返回地址,继续主流程的运行。
[0024] 可选的,所述SBoot中未设有读存储空间的接口。
[0025] 可选的,所述SBoot中各中断的优先级中,SVC中断优先级最高。
[0026] 可选的,当所述处理器处于Thread模式时,特权级权限与非特权级权限是通过控制寄存器的设置变化的。
[0027] 根据本发明的第二方面,提供了一种ARMv7‑M架构处理器,用于执行第一方面及其可选方案涉及的处理方法。
[0028] 本发明提供的处理器及其原生MPU的SBoot处理方法中,结合ARMv7‑M架构权限模式和原生MPU特性,提供了执行关键代码的接口,进而能够以非特权级权限引导进入一级用户的关键代码,避免了关键代码被任意调取,从而既能保护一级用户的关键代码,又能使得二级用户正常开发。进一步方案中,还可结合ARMv7‑M架构权限模式和原生MPU特性接管中断,实现执行关键代码的关键步骤;以及最终让处理器工作在Thread模式下,以非特权级权限引导进入用户代码,进一步实现对一级用户关键代码的保护,以及二级用户正常开发。

附图说明

[0029] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0030] 图1是本发明一实施例中图1是本发明一实施例中ARMv7‑M架构处理器原生MPU的SBoot处理方法中设置禁止访问区与只读区的流程示意图;
[0031] 图2a是本发明一实施例中Eflash分区示意图;
[0032] 图2b是本发明一实施例中SRAM分区示意图;
[0033] 图3是本发明一实施例中ARMv7‑M架构处理器原生MPU的SBoot处理方法中关键代码调用的流程示意图;
[0034] 图4是本发明一实施例中ARMv7‑M架构处理器原生MPU的SBoot处理方法中关键代码调用的处理过程示意图;
[0035] 图5是本发明一实施例中ARMv7‑M架构处理器原生MPU的SBoot处理方法中中断处理的流程示意图;
[0036] 图6是本发明一实施例中ARMv7‑M架构处理器原生MPU的SBoot处理方法中中断处理的处理过程示意图。

具体实施方式

[0037] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0038] 本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0039] 下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
[0040] 本实施例所涉及的SBoot可理解为安全引导系统,其主要分为通用功能(代码下载和读取参数等)和代码保护功能,其中代码保护功能主要由中断处理过程和关键代码调用两部分组成。
[0041] 图3、图4所示内容可理解为是对其中关键代码调用过程的示意,其中图5和图6所示内容可理解为是对中断处理过程的示意。同时,中断的处理中可能需实施关键代码的调用,关键代码的调用也可能需实施中断处理。
[0042] 在分别实现以上关键代码调用与终端处理之前,还可通过图1和图2所示内容设置记录一级用户关键代码的禁止访问区,以及记录接口的只读区。
[0043] 其中一种实施方式中,可以包括:
[0044] S101:当一级用户完成开发工作后,将所述SBoot下载到芯片并设置为默认启动程序;
[0045] S102:在所述SBoot启动之后,分别确定所述禁止访问区与所述只读区;
[0046] S103:将一级用户已经开发完成的关键代码下载至所述禁止访问区,并在所述只读区中记录用于调用关键代码的接口函数。
[0047] 具体实施过程中,在步骤S102中,SBoot启动之后,可以通过命令行设置受保护代码地址(不可访问区),以及受保护代码的调用接口区(只读区)。
[0048] 此后,在步骤S103中,可将一级用户已经开发完成的代码通过SBoot下载到指定受保护位置,即禁止访问区和只读区中的所需位置,然后即可交付二级用户进行开发。
[0049] 在二级用户看来,存储分配结构如图2a与图2b所示,只需要据此设置代码和RAM的地址空间即可,其它的开发工作并不受影响。
[0050] 此外,为保护一级用户代码,SBoot取消读存储空间的接口,即:所述SBoot中未设有读存储空间的接口。进而,获取参数(如版本号,序列号等)只能通过专用接口访问。二级用户下载完应用并设置默认跳转标志后,芯片上电会按照芯片默认Boot(如果有)、SBoot、二级用户应用的顺序,依次跳转执行。
[0051] ARMv7‑M架构处理器上的应用程序可以工作在特权级(Privileged)和非特权级(Unprivileged)。工作在特权级时,应用可以访问所有资源;而工作在非特权级时,应用只能在MPU的限制下拥有部分资源的部分访问权限。
[0052] ARMv7‑M架构处理器的工作模式分为Handler模式和Thread模式。Thread模式用于执行应用程序;Handler模式用于处理异常中断,一旦执行完异常处理立即返回Thread模式。
[0053] 当处理器处于Handler模式时,应用总是工作在特权级(Privileged);而当处理器处于Thread模式时,可以通过控制寄存器的设置,使应用拥有特权级(Privileged)或非特权级(Unprivileged)权限,即:当所述处理器处于Thread模式时,特权级权限与非特权级权限是通过控制寄存器的设置变化的。
[0054] SBoot在实际处理过程中主要面临两个问题:第一,为保护一级用户关键代码不被访问,二级用户应用的所有操作都必须工作在非特权级,处理器必须处于Thread模式。因此,SBoot必须接管中断,以避免二级用户通过中断进入Handler模式,从而获取特权级权限。而与此矛盾的是,SBoot还要在中断里面完成对二级用户中断处理程序的调用。第二,为保证一级用户关键代码不被访问,MPU必须禁止二级用户对关键代码区的读权限。可是根据ARMv7‑M架构处理器的特性,要想执行这些关键代码,又必须先具有对相应区域的读权限。
[0055] 为解决执行关键代码的矛盾问题,本实施例可通过封装关键代码的接口来实现,接口函数位置详见图2a所示的只读区。二级用户调用这些接口后,触发SVC中断,SVC中断会根据传入的参数执行相应代码,请参考图3,具体可例如包括:
[0056] S104:二级用户应用工作在非特权级权;
[0057] S105:是否需调用禁止访问区的关键代码;
[0058] 若步骤S105的判断结果为是,则可实施步骤S106:调用只读区中相应的接口函数,以向调用管理函数传递目标函数相应的索引值;
[0059] S107:触发第一SVC中断,并使得:退出所述第一SVC中断后,处理器的工作权限被配置为特权级权限;并跳转至调用管理函数,以使得所述调用管理函数执行所述索引值对应的目标函数;
[0060] S108:关键代码执行完成后,触发第二SVC中断,并使得:退出所述第二SVC中断后,处理器的工作权限恢复为非特权级权限。
[0061] 针对于以上过程,为了让二级用户可以以非特权级权限调用受保护的代码,以上实施方式可对一级用户关键代码中提供的函数(称为“目标函数”)进行封装。首先,一级用户需要定义一个目标函数地址数组(目标函数列表),其索引值与目标函数一一对应,并向SBoot提供该列表的初始化函数。其次,一级用户还需要提供一个调用管理函数,所有对目标函数的调用,最终以向该函数传递索引值的方式完成调用。函数列表初始化函数的地址和调用管理函数的地址,按约定存放在一级用户工程的中断向量表最后两个位置,以便SBoot查找。最后,一级用户需要提供面向二级用户的接口函数(简称“接口函数”),接口函数参数和目标函数相同。所有接口函数都要编译在图2所示的只读区,函数内部传递目标函数列表的索引值,并通过触发第一SVC中断,跳转至调用管理函数。
[0062] 具体实施过程中,二级用户调用一级用户关键代码的过程如图4所示。首先,调用只读区内的接口函数,通过寄存器传递相应目标函数在目标函数列表中的索引值,触发SVC(2),即第一SVC中断。在SVC(2)中断处理程序中设置应用为特权级,然后跳转至调用管理函数。调用管理函数执行所述索引值对应的目标函数,并触发SVC(3),即第二SVC中断。SVC(3)中断处理程序将应用重新恢复为非特权级,并设置上下文,中断退出至接口函数的返回地址,继续主流程的运行。
[0063] 具体的,以图4为例,在步骤S106中,通过寄存器(R12)传递索引值,以确定目标函数地址在目标函数列表中的位置。在步骤S107的第一SVC中断中,将栈中接口函数的返回地址(LR)保存在全局变量中,并将栈中的PC值改为调用管理函数的地址,然后设置寄存器,使所述第一SVC中断退出后,处理器工作在Thread模式,应用处于特权级。然后,退出所述第一SVC中断跳转至调用管理函数,根据R12寄存器传递的索引值,完成对目标函数的调用。在步骤S108中的第二SVC中断中,将栈中的PC值改为上述S107过程保存的中断返回值地址,然后设置寄存器,使处理器工作在Thread模式,应用处于非特权级,然后退出中断至接口函数的返回地址,继续主流程的运行。
[0064] 为解决中断执行的矛盾问题,本实施例可首先在SBoot中设置中断的优先级。将SVC中断优先级设置为最高,其它中断优先级低于SVC中断,即:所述SBoot中各中断的优先级中,SVC中断优先级最高。当中断来临时,在中断内部再触发SVC中断,通过嵌套执行SVC中断强制设置处理器工作在Thread模式,而二级用户中断处理程序工作在非特权模式。执行完二级用户中断处理程序后,再次触发SVC回复原始上下文结束中断。请参考图5,具体可例如包括:
[0065] S104:二级用户应用工作在非特权级权限;
[0066] S109:二级用户应用运行中是否产生中断;
[0067] 若步骤S109的判断结果为是,则可实施步骤S110:进入SBoot的中断处理过程,处理器此时工作在Handler模式,应用(自动)获取特权级权限;
[0068] S111:在所述SBoot的中断处理过程中触发嵌套的第三SVC中断,并使得所述处理器在退出所述第三SVC中断后工作在Thread模式;工作在所述Thread模式的处理器的工作权限被配置为非特权级权限;
[0069] S112:在所述Thread模式下,以非特权级权限调用二级用户的中断处理程序;
[0070] S113:在调用结束后触发嵌套的第四SVC中断,并使得所述处理器在退出所述第四SVC中断后恢复工作在Handler模式。
[0071] 具体实施过程中,中断来临,首先进入SBoot的中断处理过程,处理器工作在Handler模式,应用具有特权级权限。然后SBoot在中断处理程序中触发SVC(0)中断,即第三SVC中断,并嵌套进入SVC(0)中断。在SVC(0)中断处理过程中配置相关寄存器,使SVC(0)中断退出后,处理器进入Thread模式。为使二级用户中断处理程序可以工作在非特权模式,先将SBoot相关代码(16字节)拷贝到二级用户的栈中并运行——设置控制寄存器进入非特权级,然后调用二级用户的中断处理程序,调用结束触发SVC(1)中断,即第二SVC中断。在SVC(1)嵌套中断中手动设置上下文,使SVC(1)中断退出后,处理器恢复至Handler模式。最终退出整个中断。对于二级用户来说,中断处理程序前后的操作都是透明的。详细流程参见图6所示意的内容。
[0072] 以图6为例,使用寄存器记录中断号,并设置触发标志,防止二级用户调用SVC从而获取特权级权限。然后触发嵌套的第三SVC,在第三SVC中断中设置寄存器,使所述第三SVC中断退出时,处理器工作在Thread模式,应用工作在特权级,然后退出所述第三SVC中断。然后,将R4至R7寄存器压栈,以免调用二级用户中断处理程序时破坏当前上下文;保存当前栈指针的值,用于完全退出中断时恢复上下文;要调用二级用户的中断处理程序,需要设置寄存器使应用处于非特权级,而此时SBoot中断处理过程代码位于MPU保护区,因此一旦进入上述非特权模式,后续代码将无权限执行,因此,将代码拷贝至栈(不受MPU保护)中,执行调用二级用户中断程序的工作;然后,嵌套触发第四SVC中断,在第四SVC中断中设置寄存器,使退出所述第四SVC中断时,处理器工作在Handler模式,然后退出所述第四SVC中断。然后,根据上述保存的值,恢复栈指针,再将R4至R7出栈。此时的上下文即进入SBoot中断处理程序时的上下文。最后恢复中断发生时应用的特权级,退出整个中断过程。
[0073] 可见,本实施例所涉及的方案只需一级用户配合SBoot做少量的工作,二级用户除了无法设置中断优先级之外基本不受影响。可以广泛应用于需要合作开发的,基于ARMv7‑M架构处理器原生MPU的大部分项目,为用户带来开发上的便利。
[0074] 本实施例还提供了一种ARMv7‑M架构处理器,用于执行以上处理方法,以及其可选方案所涉及的处理方法。
[0075] 综上,本发明提供的处理器及其原生MPU的SBoot处理方法中,结合ARMv7‑M架构权限模式和原生MPU特性,提供了执行关键代码的接口,进而能够以非特权级权限引导进入一级用户的关键代码,避免了关键代码被任意调取,从而既能保护一级用户的关键代码,又能使得二级用户正常开发。进一步方案中,还可结合ARMv7‑M架构权限模式和原生MPU特性接管中断,提供执行关键代码的接口,最终让处理器工作在Thread模式,并以非特权级权限引导进入用户代码,进一步实现对一级用户关键代码的保护,以及二级用户正常开发。
[0076] 本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0077] 最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。