技术领域
[0001] 本申请涉及通信技术领域,尤其涉及一种基于DPDK的数据处理方法及装置。
相关背景技术
[0002] 数据面开发套件(Data Plane Development Kit,DPDK)通过大页分配、管理内存,可以有效减少数据寻址处理的开销。目前基站可以采用DPDK技术来对内存进行管理。但是目前DPDK技术在对内存进行分块时,常规情况下按照设定大小对内存进行分块。但是固定块大小适配所有长度的业务数据来说,针对数据量较小的数据,空间利用率较低。
具体实施方式
[0050] 为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部份实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
[0051] 本申请实施例描述的应用场景是为了更加清楚的说明本申请实施例的技术方案,并不构成对于本申请实施例提供的技术方案的限定,本领域普通技术人员可知,随着新应用场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。其中,在本申请的描述中,除非另有说明,“多个”的含义是两个或两个以上。
[0052] 本申请实施例中涉及的网络设备还可以称为网络设备、接入网设备或者接入节点(英文:Access Node,简称:AN),为终端提供无线接入服务。网络设备具体可以是全球移动通信(Global System for Mobile communication,GSM)系统或码分多址(Code Division Multiple Access,CDMA)系统中的基站(Base Transceiver Station,BTS),也可以是宽带码分多址(Wideband Code Division Multiple Access,WCDMA)系统中的基站(NodeB)、或者小基站设备、无线访问节点(WiFi AP)、无线互通微波接入基站(Worldwide Interoperability for Microwave Access Base Station,WiMAX BS)等,还可以是LTE系统中的演进型基站(英文:Evolutional Node B,简称:eNB或eNodeB)、或者5G网络中的基站设备(gNB),本申请对此并不限定。
[0053] 参见图1所示,为网络设备的结构示意图。网络设备中包括:处理器101、存储器102、网卡103和总线104,且处理器101、存储器102和网卡103通过总线104互相通信。存储器
102中存储有:操作系统(Operating System,OS)105和应用程序106。其中,处理器101,为网络设备的运算核心(Core)和控制核心(Control Unit),其主要是解释计算机指令以及处理计算机软件中的数据。本申请实施例所指的处理器101,可以是一个处理器,也可以是多个处理元件的统称。例如,该处理器101可以是中央处理器(Central Processing Unit,简称CPU),也可以是特定集成电路(Application SpecificIntegrated Circuit,简称ASIC),或者是被配置成实施本申请实施例的一个或多个集成电路,例如:一个或多个微处理器(digital signal processor,简称DSP),或,一个或者多个现场可编程门阵列(Field Programmable Gate Array,简称FPGA)。
[0054] 存储器102,主要用于网络设备存储程序和各种数据。其可以是一个存储装置,也可以是多个存储元件的统称,且用于存储可执行程序代码等。且存储器102可以包括随机存储器(rand om access memory,RAM),也可以包括非易失性存储器(non‑volatile memory),例如磁盘存储器,闪存(Flash)等。
[0055] 网卡103,为网络接口卡(Network Interface Card,NIC)的简称,为主要工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。
[0056] 总线104,为网络设备各种功能部件之间传送信息的公共通信干线,由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。总线为处理器、内存、输入、输出设备传递信息的公用通道,计算机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。本申请实施例所指的总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component,PCI)总线或扩展工业标准体系结构(Extended Industry Standard Architecture,EISA)总线等。该总线104可以分为地址总线、数据总线、控制总线等。为便于表示,图1中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。存储器102中存储有操作系统105和应用程序106。其中,操作系统105是一台网络设备必不可少的系统软件,是整个计算机设备的灵魂。常见的操作系统包括Windows操作系统、Linux操作系统等。可以理解的是,虽然图1中未示出其他应用程序和硬件,但网络设备的具体实现中可能还包括其他硬件或应用程序。
[0057] 以操作系统为Linux操作系统为例,Linux操作系统从逻辑上将Linux操作系统可以划分为用户态空间(user‑space)和内核态空间(kernel space)。
[0058] 其中,用户态空间为上层应用程序的活动空间,用于存放用户程序的代码和数据。内核态空间为操作系统的活动空间,用于存放操作系统或内核的代码和数据。通常,位于用户态空间的用户程序或进程能访问的计算机设备的硬件资源有限,其仅能访问部分硬件设备;而位于内核态的系统程序拥有访问计算机设备的所有硬件设备的权限,能够访问计算机设备的所有硬件设备。此外,用户态空间的应用程序无法直接访问硬件设备,可以通过系统调用、库函数、Shell脚本的方式与内核态交互以及访问硬件设备。
[0059] 网络设备在用户态空间部署有应用层和DPDK适配层,还可以包括其它的层,本申请实施例对此不作限定。应用层可以可涵盖包括业务处理协议栈中的媒体接入控制(Media Access Control,MAC)层、无线链路控制(Radio Link Control,RLC)层和分组数据聚合协议(Packet Data Convergence Protocol,PDCP)层。参见图2所示。
[0060] 为了适应数据高速转发的需要,现有的一种方案为在Linux操作系统中引入了DPDK技术,DPDK技术是英特尔(INTEL)公司开发的基于数据面的数据处理框架,可以支持数据的快速转发,是X86平台报文快速处理的库和驱动集,大多数情况下工作在Linux用户态空间,被广泛应用于二层或三层转发功能的开发。DPDK对内存进行分块,在对分块进行封装是采用Mbuf结构体格式。参见图3所示,为Mbuf的具体结构。Mbuf由结构报头(struct rte_mbuf)(也可以称为Mbuf头部)、预留区域(Head room)、数据区域(data)和结尾保留区域(Tail room)共同构成。其中数据区域主要用于承载业务数据,承载的信息长度不能大于预分配的最大长度,可以小于长度储存信息。预留区域可以用来存储和系统中其他实体交互的信息,如控制信息、帧内容、事件等。结构报头(struct rte_mbuf)里存放有自身数据块的相关对象信息定义描述,其中包含数据区数据的长度信息、起始相对偏移信息,内存块的逻辑地址和物理地址信息等等。Mbuf的其起始逻辑地址存储在Mbuf结构报头的buffer_addr指针中。Mbuf的其起始物理地址存储在Mbuf结构报头的buffer_iova指针中。
[0061] 在DPDK应用到网络设备时,DPDK的Mbuf的大小是从网卡数据包收发的角度来设置的。网络设备在常规情况,都是按照设定大小对内存进行分块以及预留数据块中包括的mbuf的空间。一般情况下,网口支持1518byte的数据帧。为了容纳该数据帧大小的数据,参见图3所示,Mbuf的存储长度一般按照2048byte预留的。head room的长度一般采用128byte,struct rte_mbuf的长度一般采用128byte。因此,一般Mbuf的大小为2304byte。但是有些情况下,网络设备处理的数据长度可能小于网口标准的数据帧的长度,因此采用这种固定大小的配置Mbuf的方式,针对数据量较小的数据来说,空间利用率较低。
[0062] 基于此,本申请实施例提供一种基于DPDK的数据处理方法及装置,用以提高空间利用率。本申请实施例网络设备在处理数据时,申请内存资源,并对内存资源进行划分时,不再采用固定大小的方式。本申请实施例中可以将用户态内存池划分为多个缓存资源池。为了便于区分,将用于承载实际业务数据的用户态内存池称为第一用户态内存池。不同的缓存资源池对应不同的缓存区规格。比如128B(字节,byte)、256B、512B、1024B、1536B、
2048B等大小的多个缓存资源池。网络设备在初始化配置时,先申请一个大页内存作为应用层处理业务数据的内存空间,将这块大的内存空间按照128B、256B、512B、1024B、1536B、
2048B等颗粒大小划分多种规格。不同规格的缓存区的数量可以根据需求配置。同一规格的缓存区组成一个缓存资源池。本申请实施例中,每个缓存资源池通过资源池的名称(比如,一个字符串)进行唯一标识。
[0063] 一些实施例中,属于同一缓存资源池的缓存区的存储地址是连续的。比如,针对128B的缓存资源池来说,一个128B的缓存区的结束地址与另一个128B的缓存区的开始地址是连续的。在方式下,可以仅记录每个缓存资源池的首个缓存区的逻辑地址(*B_base_buf_addr)和首个缓存区的物理地址(*B_base_iova_addr)、缓存区的长度。可以减少记录的内容。
[0064] 一些实施例中,每个缓存资源池可以采用rte_mempool方式进行管理。rte_mempool是内存池管理组件,为DPDK应用程序和其它组件提供分配内存的接口。本申请实施例中第一用户态内存池中缓存资源池的管理信息与缓存资源池是分开存储的。本申请实施例可以理解是,将一块内存划分为多个内存池,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储不同的对像实体,如:数据报文缓存块等。例如,以128B大小的rte_mempool申请流程为例。可以先通过如下调用rte_mempool_create()函数来创建128B大小的rte_mempool。rte_mempool中的元素(elements)数量即为缓存资源池包括的缓存区的数量。调用rte_mempool_create()函数创建rte_mempool的时候,指定申请多少个rte_mbuf及每个rte_mbuf中elt_size大小。elt_size是为分配的缓存区的大小,即rte_mbuf‑>pkt.data的实际存储区域的大小,该举例中为128B。
[0065] 128B_Mp=rte_mempool_create("128B_size_mempool",NUM_DATA_128_BLK,sizeof(struct rte_mbuf),0,0,NULL,NULL,128B_obj_init,NULL,SOCKET_ID_ANY,0)。
[0066] 在对应的“128B_obj_init”初始化时,依次将之前划分的128B的缓存区的逻辑地址和物理地址、块长度添加到每一个对应rte_mbuf(buf_addr、buf_iova和buf_len)信息里,并对结构体的其他常量域进行初始化赋值。
[0067] 例如,可以通过如下代码对128B_obj_init进行初始化。
[0068]
[0069]
[0070] 在完成不同的空间大小的缓存资源池的初始化后,获得不同空间大小的缓存资源池的句柄,比如可以包括缓存资源池的首地址等。一些实施例中,可以通过rte_mempool_get()函数来从缓存资源池获取缓存区的地址,通过rte_mempool_put()函数来将完成使用的缓存器释放到缓存资源池中。可以通过rte_mempool_avail_count()函数查看缓存资源池中可以使用的元素个数。可以通过rte_mempool_in_use_count()函数查看缓存资源池中已经使用的元素个数。
[0071] 参见图4所示,为经过创建的各个缓存资源池的资源描述结构体的结构示意图。每个缓存资源池包括的缓存区用于存储实际的数据data,或者可以理解为rte_mbuf结构中的数据区域(data)。而缓存资源池的缓存区的地址存储在资源描述结构体中。一些实施例中,资源描述结构体也可以被称为KB_rte_mempool。K的不同取值表示不同规格的缓存资源池的资源描述结构体。一些场景中,每个缓存资源池中包括的缓存区地址是连续的,因此,每个缓存资源池也可以理解为一个rte_mempool内存块。rte_mempool内存块中最前面存储struct rte_mempool数据结构,后面紧接着是rte_pktmbuf_pool_private私有数据,再后面成员Obj(或者称为对象)用于存储每个缓存区的结构信息,比如包括缓存区的地址偏移量(即地址相对偏移信息)、数据长度、逻辑地址和物理地址信息等等。成员Obj指示的缓存区,用于存储实际要发送的业务数据。
[0072] 本申请实施例中,网络设备的基带的上行数据处理中,每个业务数据发送之前需要封装的报文头的大小相同。为了进一步提高资源利用率,针对业务数据创建用于承载报文头的资源池。为了便于区分,将用于封装报文头的内存块划分的各个缓存区组成的资源池称为第二用户态内存池。报文头可以理解为用于封装以太网信息和IP信息的头信息。第二用户态内存池可以是网络设备申请的一个内存块,该内存块与用于承载业务数据的内存块之间可以是不连续的,也可以连续的。比如申请一个内存块用于承载报文头,再申请另一个内存块用于承载实际业务数据。又比如,可以申请一个内存块,该内存块的一部分连续资源用于数据,另一部分连续用于承载报文头。
[0073] 作为一种举例,用于封装报文头信息的缓存资源池的缓存区的格式可以参见图5所示。封装报文头信息的缓存资源池包括的各个缓存区对应的内存块用于承载预留区域对应结构报头(struct rte_mbuf)+预留区域(Head room)。比如预留区域对应结构报头(struct rte_mbuf)可以包括预留区域(或者报文头的数据区)的地址偏移量(即地址相对偏移信息)、数据长度、逻辑地址和物理地址信息等等。预留区域用于承载ETH_hdr和IP_4_hdr。例如,ETH_hdr和IP_4_hdr占用34Byte。ETH_hdr表示以太网帧的头部,IP_4_hdr表示因特网IP协议头部。封装报文头信息的缓存资源池包括的缓存区的数量可以根据网卡发送数据的调度能力来确定。比如网卡发送队列的最大承载数量为N,N为正整数,封装报文头信息的缓存资源池包括的缓存区的数量大于N,比如可以是2N。
[0074] 第二用户态内存池可以采用rte_mempool方式进行管理。在大页内存中开辟一个连续的缓冲区作为第二用户态内存池。然后将该内存池进行分割,头部为struct rte_mempool内存池结构;紧接着是内存池的私有结构(private_data_size),私有结构的大小,可以由DPDK适配层设置。最后是多个连续的对象元素(也可以理解为Mbuf),参见图6所示的Mbuf#0‑Mbuf#(N‑1)。Mbuf#0‑Mbuf#(N‑1)都是处于同一个内存池中。每个对象元素(即Mbuf)又有对象的头部(比如struct rte_mbuf),对象的真实数据区域等。真实数据区域可以用于承载报文头部信息等。
[0075] 下面结合图7对本申请实施例提供的基于DPDK的数据处理方法进行说明。该方法可以应用于网络设备,网络设备中包括应用层和DPDK适配层。
[0076] 701,应用层获取待发送的业务数据。
[0077] 702,应用层根据业务数据的大小,将业务数据存储在第一用户态内存池的第一缓存区中,第一用户态内存池包括多个缓存资源池,不同的缓存资源池对应的不同的缓存区规格,第一缓存区属于多个缓存资源池中的第一缓存资源池,第一缓存资源池的缓存区规格与业务数据的大小匹配,第一缓存资源池包括第一缓存区在内的多个缓存区。
[0078] 一些实施例中,应用层获取待发送的业务数据时,先进行内存申请。根据业务数据的大小确定所需的缓存区的大小。应用层根据缓存区的大小向DPDK适配层申请资源。比如,应用层可以向DPDK适配层发送给资源申请请求。资源申请请求携带请求的缓存区的规格(比如128B、256B……2048B中的一个)。针对该业务数据,DPDK适配层根据应用层请求的缓存区的规格为该业务数据分配第一缓存区。示例性地,DPDK适配层根据缓存区的规格从所述第一用户态内存池确定第一缓存资源池。即第一缓存资源池所包括的缓存区的大小与应用层请求的缓存区的规格匹配。一些实施例,应用层还向DPDK适配层指示所需的缓存区的数量或者所需的总内存空间大小。DPDK适配层确定当前第一缓存资源池的剩余空间满足应用层请求的内存的需求时,则向应用层指示第一缓存区的地址。在本申请实施例中,DPDK适配层向应用层指示第一缓存区的资源描述结构体的地址。资源描述结构体包括所述第一缓存区的地址。
[0079] 一些场景中,第一缓存区的资源描述结构体的地址与第一缓存区的地址不连续。可以理解为,用于承载缓存资源池的描述信息的内存块与缓存资源池的内存块可以不属于同一个大块内存。一些场景中,应用层可以向DPDK适配层请求多个缓存区,则DPDK适配层向应用层反馈包括第一缓存区在内的多个缓存区的资源描述结构体的地址。进一步地,所述应用层从所述资源描述结构体的地址指示的内存空间中获取所述第一缓存区的地址。另一些场景中,DPDK适配层确定第一缓存资源池的剩余空间不满足应用层请求的内存的需求时,向应用层反馈申请失败。
[0080] 应用层在确定第一缓存区的地址后,根据第一缓存区的地址将所述接收到的业务数据存储到对应的第一缓存区中。然后应用层可以对第一缓存区存储的业务数据进行处理。
[0081] 应用层在完成业务数据的处理后,向DPDK适配层指示所述第一缓存区的地址。比如应用层可以向DPDK适配层发送第一缓存区的资源描述结构体的地址。
[0082] 703,DPDK适配层将业务数据的报文头信息添加在第二用户态内存池的第二缓存区中,第二用户态内存池包括第二缓存区在内的多个空间大小相同的缓存区。
[0083] 一些实施例中,DPDK适配层从所述第二用户态内存池中确定第二缓存区,并将业务数据的报文头信息添加到第二缓存区。例如,DPDK适配层将对应业务数据的L2和L3层头部信息存储到第二缓存区中。
[0084] 704,DPDK适配层向网络设备中的网卡指示第二缓存区的地址以及第一缓存区的地址。
[0085] 一些实施例中,DPDK适配层向网络设备中的网卡指示第二缓存区的地址以及第一缓存区的地址,可以通过如下方式实现:DPDK适配层向网络设备中的网卡发送第二缓存区的头指针,第二缓存区的头指针链接的下一级节点为第一缓存区的资源描述结构体。
[0086] 示例性地,参见图8所示。应用层根据待发送的业务数据,从DPDK适配层申请资源。DPDK适配层从第一用户态资源池中为应用层分配第一缓存区。然后将第一缓存区的资源描述结构体的地址发送给应用层。从而应用层获取到第一缓存区的资源描述结构体的地址。
图8中,以第一缓存区的资源描述结构体为Mbuf#0为例。应用层从Mbuf#0读取到第一缓存区的地址,比如通过头指针m‑>buf_addr和m‑>buf_iova读取到第一缓存区的物理地址和逻辑地址。应用层将待发送的业务数据缓存到第一缓存区。进一步,应用层调用DPDK适配层发送接口,将上面的Mbuf#0的头指针和目的端口传递给DPDK适配层。
[0087] DPDK适配层,从第二用户态内存池获取可用资源,比如第二缓存区。根据目的端口获取封装的以太层和IP层完成第二缓存区的信息填充。进一步地,将第二缓存区的结构报文头struct rte_mbuf中的头指针级联到Mbuf#0上。即struct rte_mbuf中的头指针m‑>next指向Mbuf#0。
[0088] 进一步地,DPDK适配层调用网卡的发送接口,将业务数据进行发送。DPDK适配层向网卡指示资源描述符的数量为2。将第二缓存区的起始数据的物理地址和数据长度添加到网卡的第一个资源描述符中。将第一缓存区的Mbuf#0的地址和数据长度添加到第二资源描述符中。进一步地,网卡硬件会自动根据两个资源描述符中的内存将用户空间的两部分数据,拼成一个完整的帧从网口发送出去。
[0089] 本申请实施例中,对于基带系统发送数据的封装,使用有限固定的、重复使用的内存资源开销去替换原本每一个内存块预留空间开销的方式。原本内存块预留空间开销的方式,可以参见图2所示的Mbuf的结构,每个Mbuf都是一个地址连续的一块内存块,并且在应用层处理数据时,需要预留headroom的空间用于后续的适配层封装报文头。本申请实施例中,对于应用层业务处理数据所占用内存空间的管理,不需要考虑封装适配的内存预留(给DPDK适配层的封装二、三层数据头长度),从而处理数据也更灵活,并且减少预留过大导致的空间浪费。一般情况下,应用层需要内存占用的容量很大,本申请实施例通过共享内存的方式,防止数据拷贝带来的计算开销。另外,DPDK适配层针对缓存区和缓存区的管理信息采用分段描述的方式,以少量的适配层内存资源就可以满足应用层的大容量的数据的封装。这样相对数据帧头的二、三层封装累计的资源空间就可以优化节省出来。应用层每次申请资源时,根据需求申请空间大小匹配的缓存块来缓存数据。防止较小的业务数据占用较大的内存块所导致的资源浪费。
[0090] 基于相同的技术构思,本申请实施例提供一种基于DPDK的数据处理装置900,参见图9所示,包括:处理器901以及存储器902。可选地,处理装置900中还可以包括通信接口903。
[0091] 其中,所述处理装置900通过所述通信接口903与其它设备进行通信,比如收发消息;存储器902,用于存储程序指令;处理器901,用于调用所述存储器902中存储的程序指令,按照获得的程序执行上述实施例中提出的任一方法。
[0092] 一些实施例中,处理器901运行存储器中的程序代码,以实现上述应用层和DPDK适配层的操作。
[0093] 本申请实施例中不限定上述处理器901、存储器902以及通信接口903之间的具体连接介质,比如总线,总线可以分为地址总线、数据总线、控制总线等。
[0094] 在本申请实施例中,处理器901可以是通用处理器、数字信号处理器、专用集成电路、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
[0095] 在本申请实施例中,存储器902可以是非易失性存储器,比如硬盘(hard disk drive,HDD)或固态硬盘(solID‑state drive,SSD)等,还可以是易失性存储器(volatile memory),例如随机存取存储器(random‑access memory,RAM)。存储器902还可以是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本申请实施例中的存储器还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
[0096] 本申请实施例还提供一种计算机可读存储介质,包括程序代码,当程序代码在计算机上运行时,程序代码用于使计算机执行上述本申请实施例上述提供的方法的步骤。
[0097] 本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0098] 本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0099] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0100] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0101] 显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。