通用寄存器保留恢复的实现方法与流程

文档序号:24377762发布日期:2021-03-23 11:12阅读:74来源:国知局
通用寄存器保留恢复的实现方法与流程

本发明涉及一种通用寄存器保留恢复的实现方法,属于国产申威多核服务器操作系统技术领域。



背景技术:

在高性能计算中,由于大型应用课题平均运行时间常常超过高性能计算机群(highperformancecomputing,hpc)系统的有效稳定运行时间,因此用户大型应用课题需要使用检查点技术进行容错。系统级的保留恢复是一种对用户透明的检查点技术,其中涉及到一个重要的技术点就是进程的系统级保留恢复。进程的系统级保留恢复是用户进程通过特定的系统调用接口进入到操作系统内核态,在内核态保留进程的空间、信号、通用寄存器等信息到文件中;恢复时,用户恢复进程通过特定的系统调用接口进入到操作系统内核态,在内核态从保留的文件中恢复用户进程的空间、信号以及寄存器信息。

当前在国产申威多核服务器操作系统中,主要是在系统调用中保存用户进程的部分寄存器,寄存器$9~$15由于与编译器约定是不保留的,因此在进程的系统保留中无法保留这些寄存器,只能在进程的系统中保留寄存器$0~$8,$16~$29。由此可知,在国产申威多核服务器操作系统的保留/恢复流程中,由于走的是通用的系统调用流程,无法保存$9~$15这几个寄存器,因此对于某些应用会导致恢复失败;同时,国产申威处理器上的操作系统无法完整的保留所有的通用寄存器,因此有可能造成进程恢复时不正确。



技术实现要素:

本发明的目的是提供一种通用寄存器保留恢复的实现方法,该通用寄存器保留恢复的实现方法解决了通用寄存器保留不完整的问题。

为达到上述目的,本发明采用的技术方案是:一种通用寄存器保留恢复的实现方法,包括进程保留方法和进程恢复方法,所述进程保留方法包括以下步骤,

s11、用户进程通过用户态系统调用进入内核态,用户进程调用系统调用ioctl函数;

s12、在所述ioctl函数中设置进程flag的保留/恢复标志位;

s13、用户进程通过用户态系统调用进入内核态执行完成后,内核态切换到用户态,根据linux信号处理机制,会进入到对保留/恢复标志位的判断;如果存在保留/恢复标志位,进入do_work_pending处理函数,否则不进入do_work_pending处理函数;

s14、do_work_pending处理函数中将内核栈上的通用寄存器$0~$29全部保存到文件或指定内存中;

所述进程恢复方法包括以下步骤,

s21、用户进程通过用户态系统调用进入内核态,用户进程调用系统调用ioctl函数;

s22、在所述ioctl函数中设置进程flag的保留/恢复标志位;

s23、用户进程通过用户态系统调用进入内核态执行完成后,内核态切换到用户态,根据linux信号处理机制,会进入到对保留/恢复标志位的判断;如果存在保留/恢复标志位,进入do_work_pending处理函数,否则不进入do_work_pending处理函数;

s24、do_work_pending处理函数中将文件或指定内存中保存的通用寄存器$0~$29恢复到内核栈上,在do_work_pending处理函数退出后,将内核栈上的通用寄存器$0~$29的值设置到处理器相对应的寄存器中,用户进程返回用户态。

上述技术方案中进一步改进的方案如下:

1.上述方案中,所述保留/恢复标志位于所述flag进程的第14-32中任意一位。

由于上述技术方案的运用,本发明与现有技术相比具有下列优点:

本发明通用寄存器保留恢复的实现方法,其利用了linux的信号处理机制,通过在进程flag中增加保留/恢复标志位,将保留/恢复标志位的主要动作放在了系统调用退出的流程中执行,从而能够在现有的架构下以最小的代价完成了对所有通用寄存器的保留/恢复,为完善国产申威处理器操作系统对系统级保留/恢复的支持提供了基础。

附图说明

附图1为本发明通用寄存器保留恢复的实现方法流程图。

附图2为本发明通用寄存器保留恢复的实现方法流程简图。

具体实施方式

在本专利的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制;术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性;此外,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本专利的具体含义。

如图1和2所示,一种通用寄存器保留恢复的实现方法,包括进程保留方法和进程恢复方法,所述进程保留方法包括以下步骤,

s11、用户进程通过用户态系统调用进入内核态,用户进程调用系统调用ioctl函数;

s12、在所述ioctl函数中设置进程flag的保留/恢复标志位;

s13、用户进程通过用户态系统调用进入内核态执行完成后,内核态切换到用户态,根据linux信号处理机制,会进入到对保留/恢复标志位的判断;如果存在保留/恢复标志位,进入do_work_pending处理函数,否则不进入do_work_pending处理函数;

s14、do_work_pending处理函数中将内核栈上的通用寄存器$0~$29全部保存到文件或指定内存中;

所述进程恢复方法包括以下步骤,

s21、用户进程通过用户态系统调用进入内核态,用户进程调用系统调用ioctl函数;

s22、在所述ioctl函数中设置进程flag的保留/恢复标志位;

s23、用户进程通过用户态系统调用进入内核态执行完成后,内核态切换到用户态,根据linux信号处理机制,会进入到对保留/恢复标志位的判断;如果存在保留/恢复标志位,进入do_work_pending处理函数,否则不进入do_work_pending处理函数;

s24、do_work_pending处理函数中将文件或指定内存中保存的通用寄存器$0~$29恢复到内核栈上,在do_work_pending处理函数退出后,将内核栈上的通用寄存器$0~$29的值设置到处理器相对应的寄存器中,用户进程返回用户态。

所述保留/恢复标志位于所述flag进程的第14-32中任意一位。

实施例进一步解释如下:

linux的信号处理机制就是在内核态中把信号的相关信息在写入到其他进程的task_struct(进程信号)或者signal_struct(线程组信号)中,然后内核在一定的时机去处理进程中未处理的信号。系统调用后、系统中断或者异常、用户进程返回用户态之前都会处理当前进程未处理的信号。具体是通过在系统调用返回用户态,其中系统调用退出流程syscall_exit,该流程是操作系统用户进程的系统调用的标准流程中的一部分。检查进程标志位(该标志是一个32位的数据,存在于进程的thread_struct的结构中)中是否有信号的标志位存在;如果有,则跳转到内核中的do_work_pending处理函数中,在跳转过去之前,内核会将所有的寄存器$0~$29都保存在进程的内核栈上,从do_work_pending处理函数返回后,再将$0~$29的寄存器从内核栈上恢复。

利用linux的信号处理机制,本发明在用户进程的flag标志位中定义了一位保留/恢复标志位,用于表示系统保留/恢复位,并在系统调用返回时,信号的判断中增加对该保留/恢复标志位的判断,以便用户调用的保留/恢复系统调用在返回时,能够进入到do_work_pending处理函数中将内核栈上的$0~$29寄存器进行保留/恢复。

新的进程保留流程如下:(1)用户进程可以通过调用linux操作系统提供的系统调用编程接口进入到操作系统中,也就是从用户态切换到内核态;即用户进程通过用户态系统调用进入内核态,用户进程调用系统调用iotcl函数,其中iotcl是linux操作系统提供给用户的posix系统调用接口之一,该调用接口可以认为是一个函数。调用接口定义:ioctl是设备驱动程序中对设备的i/o通道进行管理的函数。从用户态进入内核态的系统调用处理函数。

(2)在ioctl函数中设置进程flag的保留/恢复标志位。进程flag是32位长度的数值,保留/恢复标志位是根据实际情况自定义的,只要不和linux操作系统中定义的位冲突即可,目前linux操作系统中使用了0~13位,即保留/恢复标志位可以为14-32位中任意一位,即14或15或16位等。保留/恢复标志位是在申威多核服务器操作系统中对进程flag中标志位的一种扩展定义,如进程flag=0x4(对应的二进制数为0100),就表示第2位为1,这一位为1可以表示该进程的拥有某一种属性或是状态,比如处于保留/恢复的状态。当对进程flag(32位长度的数值)中系统自定义的保留/恢复位进行操作,将这位由0修改为1,其他位不变。

(3)当用户进程调用系统调用进入操作系统执行完成后,就会从操作系统返回到用户态,即从内核态切换回用户态时,系统调用也处于返回时,按照linux信号处理机制流程,会进入到对信号标志位判断流程中,在该流程中,增加了对保留/恢复标志位的判断,如果存在保留/恢复标志位,进入do_work_pending处理函数。

(4)在do_work_pending处理函数中将内核栈上的通用寄存器$0~$29全部保存到文件或指定内存中。

新的进程恢复流程如下:

(1)用户进程通过用户态系统调用进入内核态,用户进程调用系统调用iotcl函数。

(2)在所述ioctl函数中设置进程flag的保留/恢复标志位。

(3)用户进程通过用户态系统调用进入内核态执行完成后,内核态切换到用户态,根据linux信号处理机制,会进入到对保留/恢复标志位的判断;如果存在保留/恢复标志位,进入do_work_pending处理函数,否则不进入do_work_pending处理函数。

(4)do_work_pending处理函数中将文件或指定内存中保存的通用寄存器$0~$29恢复到内核栈上,在do_work_pending处理函数退出后,内核栈上的通用寄存器$0~$29的值设置到处理器相对应的寄存器中,用户进程返回用户态。dowork_pending是运行在内核态内的,所以其使用的栈为内核栈。因栈是一块空间,用于保存程序间相互调用参数、返回值、返回点及子程序的局部变量。当用户进程处于用户态时,使用的栈对应的就是用户栈,当用户进程处于内核态时,对应的就是内核栈。

采用上述通用寄存器保留恢复的实现方法时,其利用了linux的信号处理机制,通过在进程flag中增加保留/恢复标志位,将保留/恢复标志位的主要动作放在了系统调用退出的流程中执行,从而能够在现有的架构下以最小的代价完成了对所有通用寄存器的保留/恢复,为完善国产申威处理器操作系统对系统级保留/恢复的支持提供了基础。

为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:

在这需要再明确几个基本概念:

通用寄存器:cpu中用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果的存储部件。

用户态和内核态的概念:当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。ring3状态不能访问ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。

特权级的概念:对于任何操作系统来说,创建一个进程是核心功能;创建进程要做很多工作,会消耗很多物理资源,比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。interx86架构的cpu一共有四个级别,0-3级,0级特权级最高,3级特权级最低。

用户态和内核态的切换:当在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有特权和能力完成的操作时就会切换到内核态

进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

系统调用:由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(applicationprogramminginterface,api),是应用程序同系统之间的接口。

内核栈:存在于内核空间,用于保存用户进程在内核态运行时的调用参数、返回值等。

上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1