一种访问协处理器寄存器的方法及装置的制作方法

文档序号:6337402阅读:339来源:国知局
专利名称:一种访问协处理器寄存器的方法及装置的制作方法
技术领域
本发明涉及协处理器寄存器(CPR)数据存取领域,特别是指一种访问CPR的方法
及装置。
背景技术
精简指令集计算机(RISC)体系架构下的CPU至少具有两种工作模式非特权模式和特权模式。非特权模式又叫用户模式或者用户态,特权模式又分为内核模式即内核态、管理员(supervisor)模式、调试模式等。工作在特权模式下,CPU可以对所有的资源进行访问;工作在非特权模式下,CPU访问不了特权模式下的资源,例如CPR等。现代操作系统(OS),以下简称系统,的内核一般都运行在特权模式下,应用程序一般运行在非特权模式下。但是应用程序在某些场景下也需要访问CPR,例如用户态下进行锁中断;在脱离⑶B(the GNU ProjectDebugger)或者其它集成调试环境的情况下,监控某段内存的非法操作,则需要对Watch寄存器进行设置;用户态CPU性能监控,需要通过CPR 读取CPU性能参数,所述性能参数包括CPU每一时钟周期内所执行的指令条数(IPC) ,Cache Miss率、TLB Refill次数等,这样,应用程序就需要访问特权模式下的资源。目前特权模式下,主要通过C预处理器形成与所要访问的目的CPR相对应的汇编指令,再通过汇编器生成系统能识别的机器码来访问目的CPR。下面,对访问CPR的汇编指令、即访问CPR指令格式进行描述\)X MIPS (Microprocessor without Interlocked Piped Stages) WM^a^T^i^ 处理器为例,一个MIPS体系结构的系统最大可支持四个协处理器CPO CP3,每个协处理器最多可包含256个寄存器,以CPO为例,其访问CPR指令格式如图1所示,共包含6个部分, 其中101为协处理器编号;102为功能号,功能号中的最低比特位,即图1中最右边的χ标识的比特位表示所操作的CPR的位宽,0为32比特,1为64比特,第3比特位,即图1中左边的χ标识的比特位表示读写,0为要对CPR进行读操作,1为要对CPR进行写操作;103为通用寄存器(GPR)编号;104与106中的数字共同组成CPR编号,所述CPR编号用于标识目的CPR ;105为空字节。由图1所述的访问CPR指令格式可以看出,访问任意一个协处理器中的CPR,也就是目的CPR,都需要与目的CPR对应的指令参数值,包括协处理器编号、功能号、CPR编号、GPR编号参数值等相对应,也就是说,需要一条与目的CPR对应的访问CPR指令。用户态下访问CPR的主要方式是通过系统调用进入到特权模式,存取完目的CPR 的值后再返回用户态,所述系统调用是指通过syscall指令触发系统异常进入特权模式, 执行编译器静态构造的访问CPR指令,从而实现访问CPR的过程,主要有以下两种方案。方案一输入CPR指令参数,且参数值固定,然后通过系统调用进入特权模式,一个系统调用仅能访问一个或者几个CPR,若访问CPR的需求过多,则系统调用数过多,系统难以维护;方案二 输入CPR指令参数,且参数值不固定,然后通过系统调用进入特权模式,参数取值不同,可以访问不同的CPR,然后返回用户态。但是,因访问任意一个协处理器中的 CPR都需要有一条与之对应的访问CPR指令,编译器在静态构造访问CPR指令时,需要预先通过if-else或者switch-case结构来区分4*32*8 = 1024个分支,根据输入的指令参数就可以实现访问协处理器中任意一个CPR的目的,但是,该方案需要预先构造覆盖所有CPR 的指令,导致该方案过于复杂和繁琐。 针对上述方案中存在的问题,现有技术中尚未提出有效的解决方案。

发明内容
有鉴于此,本发明的主要目的在于提供一种访问CPR的方法及装置,简化方案,有利于系统维护,实现访问CPR的通用性。为达到上述目的,本发明的技术方案是这样实现的本发明提供了一种访问协处理器寄存器CPR的方法,该方法包括在用户态下CPU构造访问CPR指令,执行输入的异常指令,进入特权模式,CPU运行异常处理程序,异常处理程序根据异常指令调用内核处理函数,内核处理函数执行访问CPR 指令,返回用户态。上述方案中,所述执行输入的异常指令,进入特权模式,CPU运行异常处理程序包括输入异常指令,CPU执行异常指令,进入特权模式,运行异常处理程序,同时,CPU将产生异常的指令地址保存到异常程序计数寄存器EPC中。上述方案中,所述异常处理程序根据异常指令调用内核处理函数包括异常处理程序读取EPC中的产生异常的指令地址,根据产生异常的指令地址获取内存中的异常指令,根据异常指令的内容,调用相应的内核处理函数。上述方案中,所述内核处理函数执行访问CPR指令包括内核处理函数读取寄存器中的访问CPR指令,保存到全局变量的后四个字节,将全局变量中的数据保存到下一级存储介质,然后将指令缓存中包含旧CPR指令所在的指令行无效,更新指令缓存,从更新后的指令缓存中的全局变量起始地址处开始执行指令,根据延时槽原理,访问CPR指令先于全局变量起始地址处的返回指令执行完毕。上述方案中,所述保存到全局变量的后四个字节包括有一个CPU时,内核处理函数直接将读取的访问CPR指令,保存到全局变量的后四个字节;或者,有一个以上的CPU,内核处理函数读取第一协处理器中的当前运行的CPU编号,根据CPU编号与全局变量的对应关系,将读取的访问CPR指令保存到与CPU编号对应的全局变量的后四个字节。上述方案中,所述访问CPR指令先于全局变量起始地址处的返回指令执行完毕之后,该方法进一步包括内核处理函数将EPC中异常的指令地址加四并保存到EPC,然后执行返回用户态指令,系统返回用户态。本发明还提供了一种访问CPR的装置,该装置包括指令构造模块,用于在用户态下,构造访问CPR指令并保存到寄存器中;异常处理模块,用于执行输入的异常指令,进入特权模式,调用内核处理模块;内核处理模块,用于执行访问CPR指令,返回用户态。上述方案中,所述异常处理模块具体包括异常指令执行单元;所述异常指令执行单元,用于执行输入的异常指令,进入特权模式,并将产生异常的指令地址保存到EPC,调用内核处理模块。上述方案中,所述异常处理模块进一步包括调用单元;所述调用单元,用于读取在EPC中保存的产生异常的指令地址,根据所述产生异常的指令地址获取内存中的异常指令,根据异常指令的内容,调用相应的内核处理模块。上述方案中,所述内核处理模块具体包括指令保存单元和指令执行单元;所述指令保存单元,用于读取寄存器中的访问CPR指令,保存到全局变量的后四个字节,将全局变量中的数据保存到下一级存储介质,然后将指令缓存中旧CPR指令所在的指令行无效, 更新指令缓存;所述指令执行单元,用于从更新后的指令缓存中的全局变量的起始地址处开始执行指令,根据延时槽原理,访问CPR指令先于全局变量起始地址处的返回指令执行完毕。上述方案中,所述指令保存单元,有一个CPU时,用于直接将读取的访问CPR指令, 保存到全局变量的后四个字节;或者,有一个以上的CPU时,用于读取第一协处理器中的当前运行的CPU编号,根据CPU编号与全局变量的对应关系,将读取的访问CPR指令保存到与 CPU编号对应的全局变量的后四个字节。上述方案中,所述内核处理模块进一步包括返回单元;所述返回单元,用于将 EPC中异常的指令地址加四并保存到EPC,然后执行返回用户态指令,系统返回用户态。由此可见,采用本发明所述的方法及装置,在用户态下先根据指令格式构造访问 CPR指令,然后触发CPU异常进入特权模式,执行访问CPR的操作,相对于现有技术中要预先构造覆盖所有CPR的分支,然后根据指令参数访问CPR,简化了方案,有利于系统维护;并且,本发明方案可通过用户态下构造访问CPR指令访问任意的目的CPR,然后通过异常指令进入特权模式,相对于现有技术中一个系统调用仅能访问一个或几个CPR,实现了访问CPR 的通用性。


图1为访问CPR指令格式示意图;图2为本发明实现访问CPR的方法流程示意图;图3为本发明中全局变量结构示意图;图4为本发明实现访问CPR的装置组成示意图。
具体实施例方式本发明的基本思想是用户态下构造访问CPR指令,通过异常指令主动触发CPU异常进入特权模式,CPU运行异常处理程序,异常处理程序根据异常指令调用内核处理函数, 由内核处理函数执行访问CPR指令并返回用户态。下面通过具体实施例与附图来对本发明进行详细说明,如附图2所示一种访问CPR的方法,具体步骤如下步骤201、用户态下构造访问CPR指令,通过异常指令主动触发CPU异常进入特权模式,运行异常处理程序;CPU根据图1所示的访问CPR指令格式,及用户输入的指令参数,构造需要的访问 CPR指令,并保存到预先设定的寄存器中,例如,保存到第八号寄存器,所述指令参数包括FUNC、rt、rd、sel等。CPU根据用户输入的异常指令,产生异常,进入特权模式,CPU会将产生异常的指令地址保存到异常程序计数寄存器(EPC)中,同时,CPU运行异常处理程序。所述异常指令是指可以使CPU产生异常的指令,包括trap指令、保留指令、break指令、syscall 指令等;所述EPC用于保存产生异常的指令地址,并根据异常指令的内容,预先设定用于保存访问CPR指令的寄存器。步骤202、CPU在特权模式下,通过异常处理程序,调用内核处理函数,快速执行访问CPR指令;异常处理程序读取EPC中的产生异常的指令地址,根据产生异常的指令地址获取内存中相应地址中的异常指令,根据异常指令的内容,即异常指令的参数,调用相应的内核处理函数,所述内核处理函数用于执行访问CPR指令,预先设定可以调用普通系统调用内核处理函数的异常指令参数的范围,以及可以调用快速系统调用内核处理函数的异常指令参数的范围,例如,syscall指令的参数为0时,调用普通系统调用内核处理函数,syscall 指令的参数不为0时,调用快速系统调用内核处理函数。异常指令的参数的每一个取值,与快速系统调用内核处理函数相对应,即异常指令的参数值不同,则调用不同的快速系统调用内核处理函数,不同的快速系统调用内核处理函数会读取不同的寄存器中的数据;执行快速系统调用内核处理函数时,系统不需要保存上下文,所述上下文指系统状态,例如通用寄存器值和系统的运行参数等,执行普通系统调用内核处理函数则需要保存上下文,这样会影响系统的处理速度,本发明方案中的异常指令的参数均在可以调用快速系统调用内核处理函数的异常指令参数范围内。异常处理程序根据异常指令的内容,以及预置的异常指令参数与内核处理函数的对应关系,调用相应的内核处理函数,本发明方案中所述的内核处理函数均指快速系统调用的内核处理函数。内核处理函数在预先设定的寄存器中读取保存的访问CPR指令,保存在全局变量中。所述全局变量为在内存中预定义的存储空间,占八个字节,因内存的某些内存段中数据的读写需要经过缓存,所以将访问CPR指令保存到内存时,可以通过写回指令Hit_ feiteBack来实现,若全局变量所在的内存段数据的读写需要经过缓存,则将内核处理函数保存到缓存的访问CPR指令写回到内存中,若全局变量所在的内存段数据的读写不需要经过缓存,则该指令为空操作,直接将访问CPR指令写回到内存。所述全局变量结构如图3所示,全局变量前四个字节预先存储了返回原函数指令,即jr kl指令,及相应的机器码,所述 jrkl指令用于返回到之前的函数,所述机器码为指令的唯一标识码。内核处理函数将读取的访问CPR指令保存到全局变量后四个字节中,若全局变量的起始地址为A,则将访问CPR 指令保存到A+4处。若系统支持一个以上CPU,例如对称多处理系统(SMP)OS架构下,有多个独立CPU运行,假设有N个CPU,则预先定义N个全局变量,每个全局变量与一个CPU对应,且每个全局变量占八个字节,内核处理函数读取第一个协处理器中,即CPO中保存的当前运行的CPU编号(ID),根据CPU ID,将访问(PR指令保存在相应的全局变量的后四个字节中。例如,假设从CPO中读取的当前运行的CPU ID号为三,则将(PR指令保存在与第三个CPU相关联的全局变量的后四个字节中。在数据Cache与指令Cache分开的系统中,所述数据与指令是分别保存在数据 Cache和指令Cache中的,CPU所要执行的指令都是从指令Cache中读取的,全局变量中的数据保存在数据Cache中,因此需要将数据Cache中的数据更新到指令Cache中,才能保证CPU所执行的CPR指令是最新的。但是,指令Cache只能从下一级存储介质中获取指令数据,所以内核处理函数将CPR指令及jr kl指令写入到下一级存储介质中,然后将指令 Cache中包含旧的访问CPR指令的指令行无效,内核处理函数在执行全局变量中的指令时, 更新指令Cache中的数据,所述更新为将下一级存储介质中的数据更新到指令Cache中。内核处理函数执行全局变量中的访问CPR指令,所述执行具体过程为内核处理函数执行跳转指令jalr kl,k0,所述跳转指令用于将返回地址保存到kl寄存器,同时跳到 k0寄存器所指向的地址处开始执行。所述返回地址为jalr kl,k0指令的下两条指令的地址,因每个指令为四个字节,所以返回地址即为jalrkl,k0地址加八,所述k0寄存器中的地址为预置的全局变量的起始地址。内核处理函数从更新后的指令Cache中的全局变量起始地址处开始执行指令,根据延时槽原理,全局变量的后四个字节中的指令要先于前四个字节中的指令执行完毕,即CPU执行jr kl指令,确定要跳转到kl寄存器中保存的地址对应的指令之前,内核处理函数先执行访问CPR指令,内核处理函数执行完毕访问CPR指令执行后,返回到内核处理函数继续执行。步骤203、返回用户态,访问CPR流程结束。内核处理函数更新EPC中的地址,所述更新为将EPC中保存的产生异常的指令地址加四,重新写入到EPC中,因为每条指令占四个字节,所以加四以后的地址,对应产生异常指令的下一条指令的地址,这样,可以防止系统继续根据EPC中原来的产生异常的指令地址执行异常指令,从而避免进入死循环。内核处理函数执行预置的返回用户态指令,即 eret指令,返回用户态,所述eret指令用于使操作返回用户态,访问CPR流程结束。CPU可以继续读取输入的下一条指令,并执行相应的程序。基于以上方法,本发明还提供了一种访问CPR的装置,如图4所示,该装置包括指令构造模块401、异常处理模块402和内核处理模块403 ;指令构造模块401,用于在用户态下根据用户输入的参数,及图1所示的指令格式,构造访问CPR指令,并保存到寄存器中;异常处理模块402,用于在用户态下,执行异常指令,进入特权模式,调用内核处理模块403 ;内核处理模块403,用于执行访问CPR指令,然后返回用户态。异常处理模块402具体包括异常指令执行单元4021 ;异常指令执行单元4021,用于执行异常指令,产生异常,触发系统进入特权模式, 同时将产生异常的指令地址保存到EPC中。异常处理模块402进一步包括调用单元4022 ;调用单元4022,用于读取EPC中保存的产生异常的指令地址,根据产生异常的指令地址获取内存中相应地址中的异常指令,然后,根据异常指令的内容,即异常指令的参数,调用相应的内核处理模块403;预先设定可以调用普通系统调用内核处理函数的异常指令参数的范围,以及可以调用快速系统调用内核处理函数的异常指令参数的范围,本发明方案中的异常指令的参数均在可以调用快速系统调用内核处理函数的异常指令参数范围内,所述调用包括根据参数值以及预置的参数值与内核处理模块的对应关系,调用相应的内核处理模块403。内核处理模块403具体包括指令保存单元4031和指令执行单元4032 ;
指令保存单元4031,用于读取寄存器中的访问CPR指令,保存到预置的全局变量的后四个字节中;或者,有一个以上CPU时,读取CPO中的当前运行的CPU ID,根据CPU ID 及本地保存的CPU ID与全局变量的对应关系,将访问(PR指令保存到与该CPU的ID对应的全局变量的后四个字节中;然后将全局变量中的数据,包括访问CPR指令、jr kl指令及机器码,写入到下一级存储介质中,将指令Cache中的包含旧的访问CPR指令的指令行无效, 更新指令Cache中的数据;指令执行单元4032,用于根据跳转指令,将返回地址保存到kl寄存器,然后从更新后的指令Cache中的全局变量的起始地址处开始执行指令,根据延时槽原理,全局变量中后四个字节中的指令先于前四个指令执行完毕,所以,后四个字节中的访问CPR指令执行完毕后,跳回到jr kl指令中的kl寄存器所保存的内核处理函数中jalr kl, k0指令的下两条指令处开始执行。内核处理模块403进一步包括返回单元4033 ;返回单元4033,把EPC中异常的指令地址加四并存于EPC中,使EPC指向异常指令的下一条指令,执行返回用户态指令,即eret指令,返回到用户态。以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种访问协处理器寄存器CPR的方法,其特征在于,该方法包括在用户态下CPU构造访问CPR指令,执行输入的异常指令,进入特权模式,CPU运行异常处理程序,异常处理程序根据异常指令调用内核处理函数,内核处理函数执行访问CPR指令,返回用户态。
2.根据权利要求1所述的方法,其特征在于,所述执行输入的异常指令,进入特权模式,CPU运行异常处理程序包括输入异常指令,CPU执行异常指令,进入特权模式,运行异常处理程序,同时,CPU将产生异常的指令地址保存到异常程序计数寄存器EPC中。
3.根据权利要求2所述的方法,其特征在于,所述异常处理程序根据异常指令调用内核处理函数包括异常处理程序读取EPC中的产生异常的指令地址,根据产生异常的指令地址获取内存中的异常指令,根据异常指令的内容,调用相应的内核处理函数。
4.根据权利要求1所述的方法,其特征在于,所述内核处理函数执行访问CPR指令包括内核处理函数读取寄存器中的访问CPR指令,保存到全局变量的后四个字节,将全局变量中的数据保存到下一级存储介质,然后将指令缓存中包含旧CPR指令所在的指令行无效,更新指令缓存,从更新后的指令缓存中的全局变量起始地址处开始执行指令,根据延时槽原理,访问CPR指令先于全局变量起始地址处的返回指令执行完毕。
5.根据权利要求4所述的方法,其特征在于,所述保存到全局变量的后四个字节包括 有一个CPU时,内核处理函数直接将读取的访问CPR指令,保存到全局变量的后四个字节;或者,有一个以上的CPU,内核处理函数读取第一协处理器中的当前运行的CPU编号,根据 CPU编号与全局变量的对应关系,将读取的访问CPR指令保存到与CPU编号对应的全局变量的后四个字节。
6.根据权利要求4或5所述的方法,其特征在于,所述访问CPR指令先于全局变量起始地址处的返回指令执行完毕之后,该方法进一步包括内核处理函数将EPC中异常的指令地址加四并保存到EPC,然后执行返回用户态指令, 系统返回用户态。
7.一种访问CPR的装置,其特征在于,该装置包括指令构造模块,用于在用户态下,构造访问CPR指令并保存到寄存器中; 异常处理模块,用于执行输入的异常指令,进入特权模式,调用内核处理模块; 内核处理模块,用于执行访问CPR指令,返回用户态。
8.根据权利要求7所述的装置,其特征在于,所述异常处理模块具体包括异常指令执行单元;所述异常指令执行单元,用于执行输入的异常指令,进入特权模式,并将产生异常的指令地址保存到EPC,调用内核处理模块。
9.根据权利要求8所述的装置,其特征在于,所述异常处理模块进一步包括调用单元;所述调用单元,用于读取在EPC中保存的产生异常的指令地址,根据所述产生异常的指令地址获取内存中的异常指令,根据异常指令的内容,调用相应的内核处理模块。
10.根据权利要求7所述的装置,其特征在于,所述内核处理模块具体包括指令保存单元和指令执行单元;所述指令保存单元,用于读取寄存器中的访问CPR指令,保存到全局变量的后四个字节,将全局变量中的数据保存到下一级存储介质,然后将指令缓存中旧CPR指令所在的指令行无效,更新指令缓存;所述指令执行单元,用于从更新后的指令缓存中的全局变量的起始地址处开始执行指令,根据延时槽原理,访问CPR指令先于全局变量起始地址处的返回指令执行完毕。
11.根据权利要求10所述的装置,其特征在于,所述指令保存单元,有一个CPU时,用于直接将读取的访问CPR指令,保存到全局变量的后四个字节;或者,有一个以上的CPU时,用于读取第一协处理器中的当前运行的CPU编号,根据CPU编号与全局变量的对应关系,将读取的访问CPR指令保存到与CPU编号对应的全局变量的后四个字节。
12.根据权利要求10或11所述的装置,其特征在于,所述内核处理模块进一步包括 返回单元;所述返回单元,用于将EPC中异常的指令地址加四并保存到EPC,然后执行返回用户态指令,系统返回用户态。
全文摘要
本发明公开了一种访问协处理器寄存器CPR的方法,该方法包括在用户态下构造访问CPR指令,执行输入的异常指令,进入特权模式,CPU运行异常处理程序,异常处理程序根据异常指令调用内核处理函数,内核处理函数执行访问CPR指令,返回用户态。本发明还公开了一种访问CPR的装置,采用本方法及装置,在实现访问CPR的通用性的同时,简化方案,有利于系统维护。
文档编号G06F13/18GK102486758SQ20101056896
公开日2012年6月6日 申请日期2010年12月1日 优先权日2010年12月1日
发明者曹厚华, 王忠波, 胡小龙 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1