发明内容
针对上述问题,在本申请中提供了在超级用户模式下快速高效地获取物理地址的方案。
根据本申请实施例的第一方面,提供了一种用于超级用户模式中获取物理地址的方法,其包括:在超级用户模式中将待转换的虚拟地址写入对超级用户模式可用的寄存器中;响应于检测到所述寄存器的状态变化,在机器模式中从所述寄存器中读取所述虚拟地址,通过查询页表获取与所述虚拟地址对应的物理地址,并将其写入至所述寄存器中;以及在超级用户模式中通过读取所述寄存器来获取与所述虚拟地址对应的物理地址。该寄存器还可以包括状态标识位,用于指示其当前存储的是虚拟地址还是物理地址。
在该实施例中,通过提供超级用户模式和机器模式共享的寄存器,以及将遍历查询页表的操作全部放在机器模式中执行,使得在超级用户模式下能快速地获取虚拟地址对应的物理地址,克服了超级用户模式中纯软件查询页表的性能限制,不仅提高了地址转换的效率,还减少了软件编程的复杂度。
在一些实施例中,该方法还可以包括:在机器模式中将通过查询页表获取的与所述虚拟地址对应的物理地址以及所述虚拟地址保存在第一快速地址转换表中。这样,在响应于检测到所述寄存器的状态变化,在机器模式中从所述寄存器中读取所述虚拟地址时,先从所述第一快速地址转换表中查找与待转换的虚拟地址相对应的物理地址;若未找到,则通过查询页表获取与所述虚拟地址对应的物理地址。
在上述实施例中,引入了第一快速地址转换表保存先前的地址转换历史,如果先前已经执行过对于相应虚拟地址的转换,则在这个表中可以快速地定位到该虚拟地址对应的物理地址,由此可避免后续遍历多级页表的过程,从而可以进一步提高地址转换的速度和效率。
在一些实施例中,该方法还可包括:在超级用户模式中将通过读取所述寄存器获取的与所述虚拟地址对应的物理地址以及所述虚拟地址保存在第二快速地址转换表中。这样,在超级用户模式中响应于将虚拟地址转换成物理地址的请求,从所述第二快速地址转换表中查找与待转换的虚拟地址相对应的物理地址,若未找到,则待转换的虚拟地址作为参数写入所述寄存器中,并通过读取所述寄存器来获取与所述虚拟地址对应的物理地址。
在上述实施例中,在超级用户模式引入了第二快速地址转换表保存先前的地址转换历史,如果先前已经执行过对于相应虚拟地址的转换,则在超级用户模式中通过这个表中可以快速地定位到该虚拟地址对应的物理地址,由此可避免后续读写寄存器以及遍历多级页表的过程,从而可以进一步提高地址转换的速度和效率。
根据本申请实施例的第二方面,提供了一种处理器,至少具有机器模式和超级用户模式,并且至少包括在机器模式下运行的地址转换模块和对超级用户模式可用的寄存器,其中所述寄存器用于保存虚拟地址和物理地址;以及其中所述地址转换模块被配置为:响应于检测到所述寄存器的状态变化,从所述寄存器中读取所述虚拟地址,通过查询页表获取与所述虚拟地址对应的物理地址,并将其写入至所述寄存器中。其中所述寄存器还可以包括状态标识位,用于指示其当前存储的是虚拟地址还是物理地址。
在一些实施例中,该地址转换模块还可被配置为:将通过查询页表获取的与所述虚拟地址对应的物理地址以及所述虚拟地址保存在第一快速地址转换表中;以及在响应于检测到所述寄存器的状态变化,从所述寄存器中读取所述虚拟地址之后,首先从所述第一快速地址转换表中查找与待转换的虚拟地址相对应的物理地址;若未找到,则通过查询页表获取与所述虚拟地址对应的物理地址。
根据本申请实施例的第三方面,提供了一种计算机可读存储介质,其上存储有计算机指令,所述计算机指令被处理器执行时实现根据本申请实施例的第一方面所述的方法。
在现有的仅使用虚拟地址的超级用户模式下,在基于多级页表进行虚拟地址与物理地址的转换过程中,需要将每一级页表查询操作得到的物理地址再次映射为虚拟地址,才能继续进行下一级的查询。因此,在遍历至页表的叶子项节点之前,需要经历频繁的地址映射操作;而且还需要软件上额外地维护部分物理地址与虚拟地址之间的直接映射,以便将从各级页表取出来的物理地址简单地映射为相应的虚拟地址。因此,这种超级用户模式下通过软件查表的方式将虚拟地址简单地转换为物理地址在整体上效率很低,而且还增加了软件编程复杂度。
而在本申请的实施例中,通过提供超级用户模式和机器模式共享的寄存器,以及将遍历查询页表的操作全部放在机器模式中执行,使得在超级用户模式能快速地完成虚拟地址到物理地址的转换,不仅提高了地址转换的效率,还减少了软件编程的复杂度。而且在该实施例中仅需要扩展一个寄存器,也节省了硬件资源。
与现有的使用虚拟地址的超级用户模式不同,在机器模式中运行的线程使用的是物理地址,因此不需要如上文提到的软件查表那样将每一级页表查询操作得到的物理地址再映射为虚拟地址,而是可以直接使用每一级页表查询操作得到的结果来继续进行下一级的查询。由此,避免了纯软件遍历页表过程中频繁的地址映射操作,从而可以更快速地完成了虚拟地址到物理地址的转换。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
具体实施方式
为了使本申请的目的,技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本申请进一步详细说明。应当理解,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动下获得的所有其他实施例,都属于本申请保护的范围。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本申请的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本申请的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本申请的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
基于RISC-V架构的处理器通常有三种工作模式:普通用户模式(User mode,简称U模式),超级用户模式(Supervisor mode,简称S模式)和机器模式(Machine mode,简称M模式)。其中M模式权限最高,S模式次之,而U模式权限最低。M模式下运行的硬件线程对内存、I/O等启动和配置系统来说必要的底层功能有着完全的使用权。S模式提供了基于页面的虚拟内存系统,将内存划分为固定大小的页来进行地址转换和对内存内容的保护。U模式适用于运行具体的应用程序。
在基于RISC-V架构的处理器中,任一个处理器线程必须运行在某个模式下,例如普通用户模式、超级用户模式和机器模式。区分这些工作模式的原因是为不同的软件栈部件提供保护。当一个线程试图执行当前模式下不允许的操作,将会产生异常。机器模式可拦截来自任何S/U模式环境的中断和异常。超级用户模式支持诸如Linux,Windows之类的操作系统、诸如OP-TEE之类的可信执行环境软件栈等的运行。
S模式提供了基于页面的虚拟内存系统,将内存划分为固定大小的页来进行地址转换和对内存内容的保护。在S模式和U模式中所使用的地址都是虚拟地址,如果要访问物理内存,它们必须被转换为真正的物理地址。在目前RISC-V规范中是通过遍历以树结构存储的多级页表来实现,该页表中的叶节点指示是否已经被映射到了真正的物理页面。
页表用于存储虚拟地址到物理地址的映射关系,页表的级数与系统支持的虚拟地址空间、访存性能需求等有关,可以有二级页表、三级页表、四级页表等等。以大小为32比特的虚拟地址及其对应的为三级页表为例:该三级页表包括页目录、页表和页表项;该虚拟地址分为3个部分:页目录索引、页表索引和页内偏移。虚拟地址的第22位到第31位这10位(最高10位)指示页目录中的索引;第12位到第21位这10位指示页表中的索引;第0位到第11位这12位(低12位)指示的是页内偏移。当需要将这样的虚拟地址转换为物理地址时,从树根部的页目录起始地址开始,找到页目录所在的物理页;然后根据虚拟地址的第22位到第31位这10位的值作为索引,找到相应的页目录项PDE(page directory entry),PDE中有这个虚拟地址所对应页表的物理地址;有了页表的物理地址,根据虚拟地址的第12位到第21位这10位的值作为索引,找到该页表中相应的页表项PTE(page table entry);页表项中就有这个虚拟地址所对应物理页的物理地址;最后用虚拟地址的最低12位,也就是页内偏移,加上这个物理页的物理地址,就得到了该虚拟地址所对应的物理地址,从而可以找到对应的数据或者指令。由页全局目录(Page global directory,PGD)、页上级目录(Page upperdirectory,PUD)、页中级目录(Page Middle directory,PMD)和页表项(Page tableentry,PTE)构成的四级页表也是类似的过程,从根部PGD的起始地址开始,逐级遍历。为方便描述,下文均以三级页表为例来进行说明,但应理解本文的实施例适用于各种多级页表系统。
在多级页表系统中,其实每级页表都可以视为一种“虚拟地址”向“物理地址”的转换,只是这里的“虚拟地址”是待转换的虚拟地址的一个位域子集,而除了最后一级页表PTE是直接指向物理页面的,其他级别页表里的“物理地址”都是指向对应下一级页表的首地址。
通常普通用户模式和超级用户模式下运行的软件使用的都是虚拟地址,而在机器模式下使用物理地址。但是对于例如OP-TEE、Trusty、SierraTEE等的有高安全需求的软件栈,有时需要在超级用户模式下将虚拟地址翻译成物理地址。例如,OP-TEE软件栈在执行过程中有时候需要使用物理地址来执行一些安全检查。又例如,在可信执行环境(TEE,Trusted Execution Environment)中,为满足更高效率的要求,将设备的驱动程序以运行在TEE内部的安全应用的方式进行开发集成和管理,这样的驱动程序的内存是在S模式下动态分配的,得到的是虚拟地址,而驱动程序需要使用的是物理地址,这时也需要在S模式下将虚拟地址翻译成物理地址。
下面以OP-TEE(可信执行环境TEE操作系统的一个开源版本)为例,对于现有的S模式下虚拟地址转换为物理地址的过程进行举例说明。目前OP-TEE软件栈是通过软件查表的方式,逐级遍历,直到叶子项。如上文提到的在多级页表中,每级页表都是从“虚拟地址”向“物理地址”的转换,除了最后一级页表PTE是直接指向物理页面的,其他级别页表所获取的是指向对应下一级页表的起始地址的“物理地址”。但是,由于OP-TEE运行在S模式下,只能使用虚拟地址,因此需要将每一级页表查询操作得到的物理地址再转换为虚拟地址,才能继续进行下一级的查询。因此,这样的通过软件查表的方式,在遍历至页表的叶子项节点之前,需要多次查询和多次地址转换操作;而且还需要软件上额外地维护部分物理地址与虚拟地址之间的直接映射,以便能将从各级页表取出来的物理地址简单地转换为虚拟地址。因此,这种超级用户模式下通过软件查表的方式将虚拟地址简单地转换为物理地址在整体上效率很低。
图1示出了根据本申请一个实施例的用于超级用户模式中快速获取物理地址的方法的流程示意图。该方法主要包括:步骤S1:在超级用户模式中将待转换的虚拟地址写入对超级用户模式可用的指定的寄存器中;步骤S2:由机器模式中响应于检测到该指定的寄存器的状态变化,从该寄存器中读出虚拟地址,并根据页表获取与所读取的虚拟地址对应的物理地址,并将其写入至该指定的寄存器中;步骤S3:在超级用户模式中通过读取该指定的寄存器来获取与待转换的虚拟地址对应的物理地址。在该实施例中,将地址转换过程中页表查询操作下放到机器模式中执行,避免了上文提到的超级用户模式中纯软件查表的限制,能实现超级用户模式中从虚拟地址到物理地址的快速转换,提高了地址转换的效率。
更具体地,在步骤S1,在超级用户模式中将待转换的虚拟地址写入对超级用户模式可用的指定的寄存器中。在基于RISC-V架构的处理器中可以为不同模式设置相应的可用寄存器,高权限模式可以访问低权限模式的寄存器。例如在机器模式中可以存取所有的对超级用户模式可用的寄存器,但在不经允许的情况下超级用户模式没有权限访问机器模式中的寄存器。在该实施例中,设置了对超级用户模式可用的指定寄存器供虚拟地址和物理地址的转换使用。该指定的寄存器可以采用RISC-V架构处理器的标准的控制与状态寄存器CSR来实现。在标准RISC-V架构中有多达4,096个CSR,并可以根据规范扩展额外的CSR,因此可以扩展一个CSR寄存器作为专门用于超级用户模式中进行虚拟地址和物理地址转换的寄存器,下文将该指定的寄存器称为地址转换寄存器(记为,SVAT)。当在超级用户模式中需要进行地址转换时,可以将待转换的虚拟地址作为访问寄存器指令的参数来将该虚拟地址写入寄存器中。例如可以使用将虚拟地址作为参数r0写入SVAT寄存器的指令:csrw svat r0,其中csrw为写寄存器的指令。同样地,在超级用户模式中可以通过读取SVAT寄存器来获取转换后的物理地址,例如可以使用将SVAT寄存器中保存的物理地址读取至参数r1的指令:csrr r1 svat,其中csrr为读寄存器的指令。
在一个实施例中,在该地址转换寄存器SVAT中还可包括状态标识位,用于指示其当前存储的是虚拟地址还是物理地址。当该寄存器中保存的内容发生变化时,其相应的状态标识位也需要进行相应的改变。
在又一个实施例中,也可以扩展两个CSR寄存器来用于超级用户模式中虚拟地址和物理地址之间的转换,其中一个寄存器(例如记为svat1)用于存放待转换的虚拟地址,而另一个寄存器(例如记为svat2)用于存放与该虚拟地址对应的物理地址。当在超级用户模式中需要进行地址转换时,可以将待转换的虚拟地址写入寄存器svat1中;而通过读取寄存器svat2来获取转换后的物理地址。这样的方式虽然在软件设计上更简单,但是会比上文仅采用一个地址转换寄存器的方式占用更多硬件资源。
继续参考图1,在步骤S2,响应于检测到地址转换寄存器的状态变化,在机器模式中从地址转换寄存器中读出虚拟地址,并根据页表获取与所读取的虚拟地址对应的物理地址,将其写入至该地址转换寄存器中。在基于RISC-V架构的处理器中机器模式是高权限模式,在机器模式中可以存取对超级用户模式可用的寄存器。在一个实施例中,随着待转换的虚拟地址在超级用户模式中被写入地址转换寄存器,在机器模式中可以通过比较该地址转换寄存器所保存的内容是否发生变化来检测地址转换寄存器的状态变化。例如,如果检测到从地址转换寄存器中读取的当前内容与之前写入的内容不同,则将所读取的内容作为虚拟地址。在地址转换寄存器包括状态标识位的一些实施例中,可以通过检测地址转换寄存器的状态标识位来识别地址转换寄存器的状态变化。如果地址转换寄存器的状态标识位指示当前存放的是虚拟地址,则从该寄存器中读取该虚拟地址。
在从地址转换寄存器获得待转换的虚拟地址之后,可以通过读取页表基地址寄存器获得页表的起始地址(即根地址),进而通过查询页表获得与待转换的虚拟地址相对应的物理地址。如上文提到的,在多级页表中,除了最后一级页表是直接指向物理页面之外,查询每一级页表所获取的都是指向对应下一级页表的起始地址的“物理地址”。但与仅使用虚拟地址的超级用户模式不同,在机器模式中运行的线程使用的是物理地址,因此不需要如上文提到的软件查表那样将每一级页表查询操作得到的物理地址再映射为虚拟地址,而是可以直接使用每一级页表查询操作得到的结果来继续进行下一级的查询。由此,避免了纯软件遍历页表过程中频繁的地址映射操作。
在机器模式下通过查询页表获取到与待转换的虚拟地址对应的物理地址后,可以将获取的物理地址写入至地址转换寄存器,以便超级用户模式中也能获得该物理地址。这样,在步骤S3,在超级用户模式中通过读取该指定的地址转换寄存器就能获取与待转换的虚拟地址对应的物理地址,从而快速地完成了虚拟地址到物理地址的转换。
可以看出,在本申请的实施例中,通过提供超级用户模式和机器模式共享的寄存器,以及将遍历查询页表的操作全部放在机器模式中执行,使得在超级用户模式能快速地完成虚拟地址到物理地址的转换,不仅提高了地址转换的效率,还减少了软件编程的复杂度。
应理解,上文结合步骤S2介绍的过程可以由在机器模式中运行的特定功能模块(例如可以称为地址转换模块)来执行。该地址转换模块可以是以独立编程的硬件电路或硬件部件形式来实现,也可以是集成在中央处理器的控制单元或内存管理单元等硬件部件中的功能模块的形式来实现。本文对此不进行任何限制,只要是能支持实现本申请中描述的功能、过程或步骤的任何软件、硬件或软硬件的组合都可适用。
在又一个实施例中,在机器模式中通过查询页表获取到与待转换的虚拟地址对应的物理地址之后,可以将该物理地址与虚拟地址之间的对应关系保存在一个独立于多级页表的表格中。这样,在步骤S2响应于检测到地址转换寄存器的状态变化,从其中读取所述虚拟地址后,可以首先从这个表格中查找是否已经保存了这个虚拟地址与物理地址的对应关系,如果先前已经执行过对于这个虚拟地址的转换,则在这个表格中可以快速地定位到该虚拟地址对应的物理地址,由此避免了遍历多级页表的过程。
可以看出,通过该实施例的方案可以进一步提高地址转换的速度和效率。相应地,这样的独立于页表的表格也可以称为快速地址转换表。如果在快速地址转换表中没有未找到与待转换的虚拟地址相对应的物理地址,则正常执行上文结合步骤S2所介绍的通过查询页表获取与虚拟地址对应的物理地址的过程。
另外,应理解在本申请的实施例中,不仅仅是提供了超级用户模式中快速地获取物理地址的方法,而且也可以支持普通用户模式快速获取物理地址,从而满足一些特殊应用的需求。例如在普通用户模式下可以通过诸如系统调用之类的手段来将虚拟地址转换成物理地址的请求传递至超级用户模式,从而在超级用户模式中响应于收到的将虚拟地址转换成物理地址的请求,执行上述步骤S1-S3来获取物理地址,并将所获取的物理地址作为对请求的响应返回至普通用户模式中。
在又一个实施例中,在步骤S3读取地址转换寄存器中与待转换的虚拟地址对应的物理地址后,还可以将该物理地址与虚拟地址的对应关系保存在不同于页表和上文提到快速地址转换表的一个表格中。这样,在超级用户模式中需要进行地址转换时或者响应于将虚拟地址转换成物理地址的请求,可以首先从这个表格中查找是否已经保存了这个虚拟地址与物理地址的对应关系,如果先前已经执行过对于这个虚拟地址的转换,则在这个表格中可以快速地定位到该虚拟地址对应的物理地址,由此避免了后续读写地址转换寄存器和遍历多级页表的过程。
可以看出,通过该实施例的方案可以进一步提高地址转换的速度和效率。相应地,可以将该实施例中这个超级用户模式中维护的表格称为第二快速地址转换表。如果在第二快速地址转换表中没有未找到与待转换的虚拟地址相对应的物理地址,则正常执行上文的步骤S1-S3来获取物理地址。
图3给出了在本申请的又一个实施例中提供了一种支持超级用户模式中快速获取物理地址的处理器的功能结构示意图。该处理器至少具有两种工作模式:超级用户模式和机器模式。该处理器至少包括对超级用户模式可用的地址转换寄存器和机器模式中运行的地址转换模块。如图3所示,诸如Linux,Windows之类的操作系统、诸如OP-TEE之类的可信执行环境软件栈等作为系统软件模块运行在处理器的超级用户模式中;内存管理单元运行在机器模式中,其包括地址转换模块;页表基地址寄存器保存有页目录表的起始物理地址。应理解,尽管在图3中将地址转换模块显示为内存管理单元内部的一个功能模块,但该地址转换模块也可以是处于内存管理单元外部的以独立编程的硬件电路或硬件部件,或者也可以是集成在处理器的控制单元中的功能模块。本文对地址转换模块的具体实现形式不进行任何限制,只要是能支持实现本申请中描述的功能、过程或步骤的任何软件、硬件或软硬件的组合都可适用。
如上文提到的,该地址转换寄存器可以供超级用户模式中运行的系统软件模块进行存取,其用于保存待转换的虚拟地址和转换后的物理地址。该寄存器还可以包括状态标识位,用于指示其当前存储的是虚拟地址还是物理地址。当在超级用户模式中系统软件模块需要进行地址转换时,可以将待转换的虚拟地址作为访问寄存器指令的参数来将该虚拟地址写入寄存器中。
在该实施例中,地址转换模块被配置为从地址转换寄存器中读取待转换的虚拟地址,通过查询存储单元中的页表获取与该虚拟地址对应的物理地址,并将其写入至地址转换寄存器中。
图3示出了该处理器中地址转换模块执行从虚拟地址到物理地址的转换的示例过程。如图3所示,地址转换模块在从地址转换寄存器获得待转换的虚拟地址之后,通过读取页表基地址寄存器获得页目录表的起始的物理地址(即根地址),找到页目录所在的物理页,接着根据虚拟地址的页目录索引,找到相应的页目录项PDE,其中记录有这个虚拟地址所对应页表的起始物理地址;有了页表的物理地址,根据虚拟地址的页表索引,找到该页表中相应的页表项PTE,该页表项中就有这个虚拟地址所对应物理页的起始物理地址;最后页内偏移,加上这个物理页的起始物理地址,就得到了该虚拟地址所对应的物理地址。可以看出,在机器模式中运行的地址转换模块将每一级页表查询操作得到的物理地址直接用于下一级的查询,由此,避免了超级用户模式中纯软件遍历页表过程中频繁的地址映射操作,提高了地址转换的速度和效率。
在又一个实施例中,该处理器还可包括与地址转换模块对应的缓存区,该缓存区用于保存快速地址转换表。该地址转换模块可以在通过查询页表获取的与虚拟地址对应的物理地址后,将该物理地址与相应的虚拟地址保存在这个快速地址转换表中。这样,当地址转换模块在响应于检测到地址转换寄存器的状态变化,从中读取待转换的虚拟地址之后,可以首先从快速地址转换表中查找与待转换的虚拟地址相对应的物理地址,如果先前已经执行过对于这个虚拟地址的转换,则在这个快速地址转换表中可以快速地定位到该虚拟地址对应的物理地址,由此避免了后续遍历多级页表的过程,进一步提高地址转换的速度和效率。反之,如果在快速地址转换表中没有未找到与待转换的虚拟地址相对应的物理地址,则继续通过查询页表获取与虚拟地址对应的物理地址。
应指出,尽管上文以RISC-V架构的处理器工作模式为例对本申请的实施例进行介绍,但本领域普通技术人员应理解上述实施例也适用在ARM架构的处理器中。
在本申请的又一个实施例中,还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上文结合图1所介绍的方法。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或与其结合使用。
应理解,对于本文中提到的步骤、过程或方法,以及诸如地址转换模块之类的模块及其功能,除了以纯计算机可读程序代码方式实现之外,完全可以通过将相应功能模块、过程或步骤进行逻辑编程在使得这些模块以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等形式来实现相同功能。因此,这样实现的模块或装置可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的子模块也可以视为硬件部件的内部结构。或者,可以将用于实现各种功能的装置视为既可以是实现相关过程或方法步骤的软件模块又可以是硬件部件内的结构。
本说明书中针对“各个实施例”、“一些实施例”、“一个实施例”、或“实施例”等的参考指代的是结合所述实施例所描述的特定特征、结构、或性质包括在至少一个实施例中。因此,短语“在各个实施例中”、“在一些实施例中”、“在一个实施例中”、或“在实施例中”等在整个说明书中各地方的出现并非必须指代相同的实施例。此外,特定特征、结构、或性质可以在一个或多个实施例中以任何合适方式组合。因此,结合一个实施例中所示出或描述的特定特征、结构或性质可以整体地或部分地与一个或多个其他实施例的特征、结构、或性质无限制地组合,只要该组合不是非逻辑性的或不能工作。
本说明书中“包括”和“具有”以及类似含义的术语表达,意图在于覆盖不排他的包含,例如包含了一系列步骤或单元的过程、方法、系统、产品或设备并不限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其他步骤或单元。“一”或“一个”也不排除多个的情况。另外,本申请附图中的各个元素仅仅为了示意说明,并非按比例绘制。
虽然本申请已经通过上述实施例进行了描述,然而本申请并非局限于这里所描述的实施例,在不脱离本申请范围的情况下还包括所做出的各种改变以及变化。