处理器、用于保存和恢复上下文数据的装置、方法及芯片与流程

文档序号:31597468发布日期:2022-09-21 07:25阅读:70来源:国知局
处理器、用于保存和恢复上下文数据的装置、方法及芯片与流程

1.本技术涉及程序执行领域,具体而言本技术涉及处理器、用于保存和恢复上下文数据的装置、方法及芯片。


背景技术:

2.在通用计算机中,一般为了提高处理器的数据并行处理性能,通常会对基本指令系统进行向量扩展,以便于提高计算机的数据处理能力,设计出专门的simd指令和simd寄存器(也称浮点寄存器),该类寄存器可以用来存放一个或一组数据(可以是整数,也可以是浮点数)。
3.然而现代cpu体系架构中,通常定义了一系列的异常(权限)级别,cpu执行程序的时候,有着固定的程序执行权限级别。通常一个程序在执行时会在处理器的寄存器上存储该程序的上下文(例如,采用通用寄存器、程序计数器和simd寄存器等来存储正在执行的程序的上下文数据),此时若有更高级别的程序需要执行时就需要将这些寄存器中存储的上下文数据进行保存以便后续恢复这些数据来继续执行被中止的程序。


技术实现要素:

4.本技术实施例的目的在于提供一种处理器、用于保存和恢复上下文数据的装置、方法及芯片,采用本技术实施例在软件上需要设置针对目标寄存器组的压栈和出栈对应的控制位,并在硬件上检查控制位是否使能,如果是,在满足条件时就需要把所有目标寄存器组中的数据进行压栈且在必要的时候对这些数据进行出栈操作,极大的提升了处理器的工作效率。
5.第一方面,本技术的一些实施例提供一种处理器,所述处理器包括:目标寄存器组,被配置为存储与执行第一对象相关的数据,其中,所述第一对象包括:一段程序;堆栈指针寄存器,被配置为指向目标栈区域的栈顶,其中,所述目标栈区域用于在满足入栈条件时接收并存储所述数据并在满足出栈条件时将所述数据重新赋值给所述目标寄存器组;控制寄存器,所述控制寄存器设置有控制位,所述控制位通过存储不同数值来开启或关闭针对所述数据的入栈操作和出栈操作;控制器,被配置为在识别到满足所述入栈条件时将所述数据存入所述目标栈区域,并在识别到满足所述出栈条件时通过将所述目标栈区域的所述数据赋值给所述目标寄存器组。
6.本技术的一些实施例提供一种处理器,通过该处理器可以借助硬件实现程序上下文数据的入栈和出栈操作,在有中断等情况发生时能有效提升处理器的工作效率。
7.在一些实施例中,所述入栈条件包括:用户态通过系统调用陷入到内核态且所述控制位表征开启所述入栈操作;或者,用户态通过中断的方式陷入到内核态且所述控制位表征开启所述入栈操作。
8.本技术的一些实施例在用户态陷入内核态时将与被中止执行的程序的上下文数据存入目标栈区域中,可以即时保存并恢复这些数据,提升处理器的工作效率。
9.在一些实施例中,所述出栈条件包括:所述内核态执行完毕返回到所述用户态且所述控制位表征开启所述出栈操作。
10.本技术的一些实施例还提供了从目标栈区域出栈操作的条件。
11.在一些实施例中,所述控制寄存器采用一比特位作为所述控制位。
12.在一些实施例中,通过在所述控制位存储第一数值来表征开启所述入栈操作和所述出栈操作。
13.本技术的一些实施例通过在控制位上写入第一数值来提示入栈操作和出栈操作已开启,可以有效控制入栈和出栈条件,提升技术方案的通用性。
14.在一些实施例中,所述目标寄存器组为多个浮点寄存器。
15.在一些实施例中,所述入栈条件包括:用户态通过系统调用陷入到内核态且所述控制位存储的数据为第一数值;或者,用户态通过中断的方式陷入到内核态且所述控制位存储的数据为第一数值。
16.在一些实施例中,所述出栈条件包括:所述内核态执行完毕返回到所述用户态且所述控制位存储的数据为第一数值。
17.本技术的一些实施例通过验证控制位所存的数据是否是第一数据来确认入栈操作和出栈操作是否开启。
18.第二方面,本技术的一些实施例提供一种芯片,所述芯片包括:内部存储器,设置有目标栈区域,所述目标栈区域被配置为满足入栈条件时存储目标寄存器组中的数据并在满足出栈条件时将所述数据赋值给所述目标寄存器组,其中,所述数据属于被中止程序的上下文数据;以及如第一方面任一实施例所述的处理器;其中,所述目标寄存器组位于所述处理器上。
19.第三方面,本技术的一些实施例提供一种用于保存和恢复上下文数据的方法,应用于如第二方面任意实施例所述的芯片上,所述方法包括:当满足入栈条件时,将处理器包括的目标寄存器组的数据保存至目标栈区域中;当满足出栈条件时,将所述目标栈区域存储的数据赋值给所述目标寄存器组包括的各目标寄存器。
20.在一些实施例中,所述入栈条件包括:用户态通过系统调用或者中断的方式陷入到内核态;所述出栈条件包括所述内核态执行完毕返回到所述用户态。
21.在一些实施例中,在所述将处理器包括的目标寄存器组的数据保存至目标栈区域中之前,所述方法还包括:在所述内核态初始化一部分内存区域作为所述目标栈区域,且将堆栈指针寄存器中所存储的数据设置为指向所述目标栈区域的栈顶地址。
22.在一些实施例中,在所述将处理器包括的目标寄存器组的数据保存至目标栈区域中之前,所述方法还包括:将控制寄存器的控制位使能,使得当前正在执行的程序被中止时,所述处理器自动的将所述目标寄存器组中所存储的所述程序的上下文数据存入所述目标栈区域完成入栈操作,或者使得当所述程序需要继续执行时从所述目标栈区域中读取所述数据重新赋值给所述目标寄存器组。
23.在一些实施例中,在所述将所述目标栈区域存储的数据赋值给所述目标寄存器组中各目标寄存器之后,所述方法还包括:根据所述目标寄存器组中存储的所述数据继续执行所述用户态的程序。
附图说明
24.为了更清楚地说明本技术实施例的技术方案,下面将对本技术实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本技术的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
25.图1为本技术实施例提供的计算机系统的架构图;图2为本技术实施例提供的处理器上设置的寄存器组的组成框图;图3为本技术实施例提供的控制寄存器的示意图;图4为本技术实施例提供的目标栈区域分布示意图;图5为本技术实施例提供的芯片结构示意图;图6为相关技术提供的进程控件分配示意图;图7为本技术实施例提供的入栈操作和出栈操作的示意图;图8为本技术实施例提供的用于保存和恢复上下文数据的方法流程图。
具体实施方式
26.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行描述。
27.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本技术的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
28.当处理器从低权限级别进入到高权限级别、产生中断的时候或者线程切换时,处理器需要进行异常处理,为了确保当前正在执行的程序(即属于由于中断等原因导致即将被中止执行的程序)的上下文的正确性,需要对通用寄存器和浮点寄存器组中的数据进行恢复保存工作。由于某些寄存器组(例如,浮点寄存器组或称为向量寄存器组)的数据位宽大且数量多,每次从低权限级别进入到高权限级别或者响应中断的时候,保存和恢复浮点寄存器将会是一繁重且耗时的任务。相关技术中利用纯软件程序将显示的目标寄存器组的数据进行保存和恢复。
29.至少为了解决上述问题本技术的一些实施例提供一种用于保存和恢复上下文数据的方法(即隐藏上下文保存恢复的异常机制),通过本技术实施例的技术方案软件编程不需要对浮点寄存器显示并进行恢复保存(即软件无感知),用于提升目标寄存器组上下文切换的效率。
30.请参看图1,图1为本技术一些实施例提供的计算机系统的组成示意图,图1的计算机系统10包括:处理器100、输入设备200、内部存储器300以及输出设备400。
31.输入设备包括键盘等,输出设备包括显示器等,可以理解的是各种输入输出外部设备是人机间的信息转换器,由输入-输出控制系统管理外部设备与内部存储器(中央处理器)之间的信息交换。
32.运算器102可以执行定点或浮点算术运算操作、移位操作以及逻辑操作,也可执行地址运算和转换。控制器101,主要是负责对指令译码,并且发出为完成每条指令所要执行的各个操作的控制信号。其结构有两种:一种是以微存储为核心的微程序控制方式;一种是以逻辑硬布线结构为主的控制方式。寄存器组110为寄存器部件,包括通用寄存器、专用寄
存器和控制寄存器等。通用寄存器又可分定点数和浮点数两类寄存器,它们用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果,通用寄存器是中央处理器的重要部件之一。
33.下面简要示意处理器100的工作过程。
34.第一阶段,提取,从内部存储器300或高速缓冲存储器(图中未示出)中检索指令(为数值或一系列数值)。由图2的程序计数器(program counter)指定存储器的位置。(程序计数器保存供识别程序位置的数值。换言之,程序计数器记录了cpu在程序里的踪迹)。
35.第二阶段:解码(控制器),由控制器实现。
36.第三阶段:执行,例如,运算器包括的算术逻辑单元(alu,arithmetic logic unit)将会连接到一组输入和一组输出。输入提供了要相加的数值,而输出将含有总和的结果。alu内含电路系统,易于输出端完成简单的普通运算和逻辑运算(比如加法和位元运算)。如果加法运算产生一个对该cpu处理而言过大的结果,在标志暂存器里可能会设置运算溢出(arithmetic overflow)标志。
37.第四阶段:回写,缓冲cache或者更大更廉价的低俗存储器(内存、硬盘等等)。
38.需要说明的是,寄存器组包括的各寄存器是集成电路中非常重要的一种存储单元,通常由触发器组成。
39.下面结合图2-图5示例性阐述本技术实施例的处理器。需要说明的是,本技术的一些实施例的处理器还包括控制器(图2未示出该单元)。
40.如图2所示,本技术的一些实施例提供的处理器包括如下寄存器:目标寄存器组113、堆栈指针寄存112、控制寄存器114以及控制器。
41.目标寄存器组113,被配置为存储与执行第一对象相关的数据,其中,所述第一对象包括:一段程序。例如,与执行第一对象相关的数据包括被中止程序的上下文数据。例如,这些目标寄存器组113属于通用寄存器中的部分寄存器。
42.可以理解的是,该目标寄存器组113用于存储正在执行的第一对象的上下文数据。
43.堆栈指针寄存器112,被配置为指向目标栈区域的栈顶,其中,所述目标栈区域用于在满足入栈条件时接收并存储所述数据并在满足出栈条件时将所述数据重新赋值给所述目标寄存器组。
44.需要说明的是,目标栈区域是在内部存储器上的一段存储空间。例如,如图4所示,该图示出了内部存储器300上设置的目标栈区域301,且指针a指向该目标栈区域301的栈顶,则堆栈指针寄存器112被配置为存储数值a。
45.控制寄存器114设置有控制位,且该控制位通过存储不同数值来开启或关闭针对所述数据的入栈操作和出栈操作。
46.例如,如图3所示,该图示出了一个包括64比特位的控制寄存器114,在该控制寄存器上的第0比特位为所述控制位。例如,若该控制位存储数值0表征入栈操作和出栈操作已关闭,在这种情况下即使正在执行的第一对象被中断执行时也不会将与该第一对象对应的上下文数据存入目标栈区域;若该控制位存储数值1表征入栈和出栈操作已开启,则如果正在执行的第一对象被中断时则会将与被中止执行的第一对象相关的上下文数据存入目标栈区域,并在可恢复对第一对象执行时将目标栈区域的数据重新赋值给所述目标寄存器组。可以理解的是,通过设置该控制位的数值可以在使用向量计算时才开启入栈或者出栈
操作,增加技术方案的通用性。
47.需要说明的是,本技术一些实施例处理器还包括控制器,如图5所示,该控制器101被配置为在识别到满足所述入栈条件时(至少包括控制寄存器114上的控制位表征入栈和出栈操作已开启)将所述数据(即存储在目标寄存器组113上的与被中止执行的第一对象相关的上下文数据)存入所述目标栈区域301,并在识别到满足所述出栈条件时至少包括控制寄存器114上的控制位表征入栈和出栈操作已开启)将所述目标栈区域的所述数据赋值给所述目标寄存器组113。例如,该控制器通过入栈指令将所述数据存入所述目标栈区域,并通过出栈指令将所述数据赋值给所述目标寄存器组113。
48.可以理解的是,本技术的一些实施例提供一种处理器,通过该处理器可以借助硬件实现程序上下文数据的入栈和出栈操作,在有中断等情况发生时能有效提升处理器的工作效率。
49.下面示例性阐述入栈条件和出栈条件。
50.例如,在本技术的一些实施例中,所述入栈条件包括:用户态通过系统调用陷入到内核态且所述控制位表征开启所述入栈操作;或者,用户态通过中断的方式陷入到内核态且所述控制位表征开启所述入栈操作。
51.也就是说,本技术的一些实施例在用户态陷入内核态时将与被中止执行的程序的上下文数据(即与第一对象相关的数据)存入目标栈区域中,可以即时保存并恢复这些数据,提升处理器的工作效率。
52.例如,在本技术的一些实施例中,所述出栈条件包括:所述内核态执行完毕返回到所述用户态且所述控制位表征开启所述出栈操作。
53.本技术的一些实施例还提供了从目标栈区域出栈操作的条件。
54.下面结合控制位上的数值阐述入栈条件和出栈条件。
55.例如,在本技术的一些实施例中,所述控制寄存器采用一比特位作为所述控制位。具体地,通过在所述控制位存储第一数值来表征开启所述入栈操作和所述出栈操作。所述入栈条件包括:用户态通过系统调用陷入到内核态且所述控制位存储的数据为第一数值;或者,用户态通过中断的方式陷入到内核态且所述控制位存储的数据为第一数值。所述出栈条件包括:所述内核态执行完毕返回到所述用户态且所述控制位存储的数据为第一数值。
56.本技术的一些实施例通过验证控制位所存的数据是否是第一数据来确认入栈操作和出栈操作是否开启。本技术的一些实施例通过在控制位上写入第一数值来提示入栈操作和出栈操作已开启,可以有效控制入栈和出栈条件,提升技术方案的通用性。
57.下面结合图6和图7示例性阐述本技术的一个示例,在该示例中目标寄存器组为多个浮点寄存器。
58.下面简要阐述现有技术以及现有技术存在的技术缺陷。
59.在通用计算机中,一般多核处理器为了提高数据并行处理性能,通常会对基本指令系统进行向量扩展,以便于提高计算机的数据处理能力,设计出专门的simd指令和simd寄存器(也称浮点寄存器)。然而现代cpu体系架构中,通常定义了一系列的异常(权限)级别,cpu执行程序的时候,有着固定的程序执行权限级别,通常一个程序的cpu上下文包括各种寄存器,如通用寄存器、程序计数器和simd寄存器等。
60.当cpu从低权限级别进入到高权限级别或者cpu产生中断的时候,cpu需要进行异常处理,为了确保当前程序执行上下文的正确性,需要对通用寄存器包括的浮点simd寄存器进行恢复保存工作。由于浮点simd寄存器数据位宽大且数量多,每次从低权限级别进入到高权限级别或者响应中断的时候,保存和恢复浮点simd寄存器将会是一繁重且耗时的任务。本技术的一些实施例基于此问题提出了一种隐藏上下文保存恢复的异常机制,用于提升simd寄存器上下文切换的效率。
61.相关技术的操作系统将进程的运行空间分为内核空间(即图6的kernel模块)和用户空间(即图6的user模块),并且内核态程序和用户态程序分别运行在不同的权限级别上,若从用户态进入内核态时需要保持cpu上下文(即与第一对象相关的数据),若从内核态进入用户态时需要恢复cpu上下文以继续执行用户态的第一对象。例如,以arm64为例,用户态程序在el0权限级别执行,内核态程序在el1权限级别执行,当用户态程序和内核态程序都使用simd寄存器并且用户态程序通过系统调用接口或者中断陷入到内核态执行的时候,在内核态需要通过编写代码显示的对当前cpu的所有simd寄存器进行保存操作,从内核态返回到用户态的时候,也需要通过使用硬编码的方式对当前cpu的所有simd寄存器进行恢复操作,由于simd寄存器数据位宽大且数量多,此种情况下,采用相关技术的技术方案需要添加大量的恢复和保存simd寄存器的代码,需要耗费很大部分的cpu资源去执行保存恢复代码,从而极大的影响了cpu的执行效率。
62.下面示例性阐述本技术的一些实施例提供的用于保存和恢复上下文数据的方法。
63.至少为了解决上述技术问题,本技术的一些实施例基于上述问题提出了一种基于硬件处理器的用于保存和恢复上下文数据的方法,该硬件处理器需要实现所有simd寄存器的压栈和出栈的操作,处理器系统寄存器中需要单独设置一个控制位(即控制寄存器上的控制位)来控制所有simd寄存器压栈和出栈的开启和关闭,当系统的控制寄存器的使能位为1时,用户态通过系统调用或者产生中断的时候,处理器硬件对所有simd寄存器的值进行压栈操作,当从内核态执行完毕返回到用户态执行的时候,硬件上需要将之前保存在栈中的所有数据赋值给simd寄存器,具体的实现过程包括如下步骤:第一步,在内核态需要初始化一片足够的内存区域作为栈区域使用(即构建目标栈区域301),将sp寄存器(即堆栈指正寄存器)指向内存区域的高地址。
64.第二步,将系统的控制寄存器使能位使能(即将控制位的数据设置为表征使能的数值),使得系统调用或中断的时候,处理器能自动的将所有simd寄存器进行保存和恢复操作。
65.第三步,当用户态通过系统调用或者中断的方式陷入到内核态的时候,处理器硬件将所有的simd寄存器(即目标寄存器组)的值进行压栈保存操作,将所有simd寄存器的值保存到栈(即目标栈区域)中。如图7所示,保存向量寄存器中的值,即将浮点寄存器组中的数据压入由堆栈指针寄存器sp中所存储指针指向的目标栈区域中,在目标栈区域存储v1、v2、v3、
……
,vn等数据。
66.第四步,当内核态执行完毕返回到用户态的时候,处理器硬件能将所有simd寄存器的值进行出栈恢复操作,将栈中的值赋给simd寄存器,从而达到了simd寄存器的恢复保存操作。如图7所示,回复向量寄存器中的值,即将目标栈区域所存储的数据赋值给相应的向量寄存器(或称为浮点寄存器)。
67.可以理解的是,本技术的一些实施例采用硬件自动实现所有simd寄存器的压栈和出栈操作,省去了内核态中所有simd寄存器的恢复和保存代码实现,设置相应的系统控制寄存器,只在使用simd的情况下,才需要保存和恢复simd寄存器,间接的提高了cpu的执行效率。
68.本技术的一些实施例提出了一种隐藏上下文保存恢复的异常机制,当用户态进行系统调用或者中断的方式陷入到内核态的时候,硬件处理器上设计系统控制寄存器使能所有simd寄存器自动保存和恢复的操作,极大的提高了cpu的执行效率。
69.本技术的一些实施例提供一种芯片,该芯片包括:内部存储器300以及处理器100。
70.内部存储器300设置有目标栈区域301,所述目标栈区域301被配置为满足入栈条件时存储目标寄存器组中的数据并在满足出栈条件时将所述数据赋值给所述目标寄存器组113,其中,所述数据属于被中止程序的上下文数据;以及如上述实施例所述的处理器100,其中,所述目标寄存器组位于所述处理器上。
71.为避免重复在此不过多赘述处理器100的结构,具体可参考上文描述。
72.如图8所示,本技术的一些实施例提供一种用于保存和恢复上下文数据的方法,应用于如上述实施例所述的芯片上,所述方法包括:s101,当满足入栈条件时,将处理器包括的目标寄存器组的数据保存至目标栈区域中;s102,当满足出栈条件时,将所述目标栈区域存储的数据赋值给所述目标寄存器组包括的各目标寄存器。
73.例如,在本技术的一些实施例中,所述入栈条件包括:用户态通过系统调用或者中断的方式陷入到内核态;所述出栈条件包括所述内核态执行完毕返回到所述用户态。
74.例如,在本技术的一些实施例中,在所述将处理器包括的目标寄存器组的数据保存至目标栈区域中之前,所述方法还包括:在所述内核态初始化一部分内存区域作为所述目标栈区域,且将堆栈指针寄存器中所存储的数据设置为指向所述目标栈区域的栈顶地址。
75.例如,在本技术的一些实施例中,在所述将处理器包括的目标寄存器组的数据保存至目标栈区域中之前,所述方法还包括:将控制寄存器的控制位使能,使得当前正在执行的程序被中止时,所述处理器自动的将所述目标寄存器组中所存储的所述程序的上下文数据存入所述目标栈区域完成入栈操作,或者使得当所述程序需要继续执行时从所述目标栈区域中读取所述数据重新赋值给所述目标寄存器组。
76.例如,在本技术的一些实施例中,在所述将所述目标栈区域存储的数据赋值给所述目标寄存器组中各目标寄存器之后,所述方法还包括:根据所述目标寄存器组中存储的所述数据继续执行所述用户态的程序。
77.在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本技术的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每
个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
78.另外,在本技术各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
79.所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
80.以上所述仅为本技术的实施例而已,并不用于限制本技术的保护范围,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
81.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应所述以权利要求的保护范围为准。
82.需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1