一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

内存直接访问架构、系统、方法、电子设备和介质与流程

2022-05-08 05:25:31 来源:中国专利 TAG:
1.本技术涉及计算机
技术领域
:,特别涉及一种内存直接访问架构、系统、方法、电子设备和介质。
背景技术
::2.pci-express(peripheralcomponentinterconnectexpress)是一种高速串行计算机扩展总线标准,pcie具有两种数据传输方式:1、dma(directmemoryaccess),直接内存访问,在该模式下,数据传送不是由cpu(中央处理器)负责处理,而是由一个特殊的处理器dma控制器来完成,因此占用极少的cpu资源;2、pio(programmedinput-output),可编程输入输出,在该模式下,数据传送由cpu执行i/o端口指令来按照字节或更大的数据单位来处理,占用大量的cpu资源,数据传输速度也大大低于dma模式。故此,dma模式优于pio模式。3.目前实现dma的方式是有两种,链式dma与块dma方式。在dma传输数据的过程中,要求源物理地址和目标物理地址必须是连续的。但是在某些计算机体系中,连续的存储器地址在物理上不一定是连续的,所以dma传输要分成多次完成。如果在传输完一块物理上连续的数据后引起一次中断,然后再由主机进行下一块物理上连续的数据传输,则为块dma方式。链式dma方式则不同,它使用一个链表描述物理上不连续的存储空间,然后把链表首地址告诉dma控制器。dma控制器在传输完一块物理连续的数据后,不用发起中断,而是根据链表来传输下一块物理上连续的数据,直到传输完毕后再发起一次中断。然而,当前链式dma的传输效率仍较低。4.因此,相关技术存在的链式dma的传输效率仍较低的问题,是本领域技术人员需要解决的技术问题。技术实现要素:5.有鉴于此,本技术的目的在于提供一种内存直接访问架构、系统、方法、电子设备和介质,提高了dma的传输效率。6.为解决上述技术问题,本技术提供了一种内存直接访问架构,应用于数字电路,包括内存直接访问控制部件、读数据搬移部件、写数据搬移部件和数据存储部件;所述内存直接访问控制部件包括控制寄存器、读描述符存储部件、写描述符存储部件、读命令传输部件、写命令传输部件;所述控制寄存器用于被主机设置得到描述符地址信息;所述读描述符存储部件用于存储利用控制寄存器得到的读描述符;所述写描述符存储部件用于存储利用控制寄存器得到的写描述符;所述读命令传输部件用于向所述读数据搬移部件发送基于读描述符或所述描述符地址信息得到的读命令;所述写命令传输部件用于向所述写数据搬移部件发送基于读描述符得到的写命令;所述读数据搬移部件用于执行所述读命令,所述写数据搬移部件用于执行所述写命令,所述数据存储部件用于存储所述读命令执行后得到的读数据。7.可选地,所述数字电路为现场可编程逻辑门阵列电路,或者为数字集成电路。8.可选地,所述内存直接访问控制部件用于接收所述读数据搬移部件和所述写数据搬移部件发送的搬移完毕通知;所述内存直接访问控制部件包括状态更新部件,所述状态更新部件用于在检测到目标描述符执行完毕后,更新所述主机的系统内存中所述目标描述符对应的目标状态位数据。9.可选地,还包括先入先出缓存器,所述先入先出缓存器用于缓存所述读命令执行后得到的读数据包;所述读数据包包括与所述读命令对应的数据包标签,所述读数据包按照所述数据包标签进行先后顺序排列得到所述读数据。10.可选地,所述内存直接访问控制部件包括中断上报部件,所述中断上报部件用于在检测到目标描述符执行完毕后,向所述主机发送中断消息。11.可选地,还包括与目标总线连接的通讯部件;所述通讯部件用于向所述目标总线发送第一数据包,或者用于从所述目标总线上获取第二数据包,并基于所述第二数据包的数据包类型,将所述第二数据包发送至对应的部件。12.可选地,所述读描述符存储部件和写描述符存储部件为先入先出存储器,所述读描述符存储部件和写描述符存储部件被预先定义了存储地址;所述控制寄存器包括源地址寄存器、目的地址寄存器、描述符大小寄存器、触发寄存器,其中,所述目的地址寄存器用于存储任一所述存储地址。13.本技术还提供了一种电子设备,所述电子设备应用了上述的内存直接访问架构。14.本技术还提供了一种内存直接访问系统,包括主机和上述的电子设备,所述主机和所述电子设备通过目标总线连接。15.本技术还提供了一种内存直接访问方法,应用于上述的电子设备,所述方法包括:若检测到内存直接访问控制部件的控制寄存器被触发,则获取描述符地址信息;利用所述内存直接访问控制部件,基于所述描述符地址信息生成描述符读命令;利用读数据搬移部件执行所述描述符读命令,得到描述符,并将所述描述符写入所述内存直接访问控制部件的描述符存储部件;利用所述内存直接访问控制部件,基于所述描述符生成访问命令;基于所述访问命令的种类,利用读数据搬移部件或写数据搬移部件执行所述访问命令。16.本技术还提供了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现上述的内存直接访问方法。17.本技术提供的内存直接访问架构,应用于数字电路,包括内存直接访问控制部件、读数据搬移部件、写数据搬移部件和数据存储部件;内存直接访问控制部件包括控制寄存器、读描述符存储部件、写描述符存储部件、读命令传输部件、写命令传输部件;控制寄存器用于被主机设置得到描述符地址信息;读描述符存储部件用于存储利用控制寄存器得到的读描述符;写描述符存储部件用于存储利用控制寄存器得到的写描述符;读命令传输部件用于向读数据搬移部件发送基于读描述符或描述符地址信息得到的读命令;写命令传输部件用于向写数据搬移部件发送基于读描述符得到的写命令;读数据搬移部件用于执行读命令,写数据搬移部件用于执行写命令,数据存储部件用于存储读命令执行后得到的读数据。18.可见,该架构中设置了读数据搬移部件和写数据搬移部件,分别用于执行读命令和写命令,此外还分别对应设置了读描述符存储部件和写描述符存储部件,使得数字电路能够读写并行处理。此外,读数据搬移部件还能够执行描述符地址信息得到的读命令,能够实现对描述符的搬移,利用同一套部件完成对描述符以及数据的搬移,节省硬件资源。19.此外,本技术还提供了一种系统、方法、电子设备和介质,同样具有上述有益效果。附图说明20.为了更清楚地说明本技术实施例或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。21.图1为本技术实施例提供的一种内存直接访问架构的结构示意图;图2为本技术实施例提供的一种主机内存的结构示意图;图3为本技术实施例提供的一种具体的主机内存的机构示意图;图4为本技术实施例提供的一种数据搬移的过程示意图;图5为本技术实施例提供的一种内存直接访问方法的流程图;图6为本技术实施例提供的一种主机内存写入流程图;图7为本技术实施例提供的一种主机内存读取流程图。具体实施方式22.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。23.当前,链式dma存在传输效率较低的问题,具体包括在读取数据时不支持数据乱序接收、无法与标准总线互连、无法进行读写并行处理、带宽利用率较低等问题。24.为了解决上述问题,本技术提出了一种新的内存直接访问架构,该架构应用于数字电路,具体可以为现场可编程逻辑门阵列(fieldprogrammablegatearray,fpga)电路,或者可以为数字集成(digitalintegratedcircuit,数字ic)电路。整个架构包括内存直接访问控制部件、读数据搬移部件、写数据搬移部件和数据存储部件,内存直接访问控制部件进一步包括控制寄存器、读描述符存储部件、写描述符存储部件、读命令传输部件、写命令传输部件。25.请参考图1,图1为一种具体的实施方式,其中示出了内存直接访问控制部件dmadescriptorcontroller,读数据搬移部件pciereaddmadatamover,写数据搬移部件pciewritedmadatamover,数据存储部件ddr&ram。内存直接访问控制部件进一步包括控制寄存器controlregister、读描述符存储部件readdescriptortableslave、写描述符存储部件writedescriptortableslave、读命令传输部件readdmacontrolsource、写命令传输部件writedmacontrolsource。26.其中,控制寄存器用于被主机设置得到描述符地址信息,具体的,主机能够设置控制寄存器的寄存器值,使得控制寄存器能够根据写入的寄存器值定位描述符,即得到描述符地址,进而从主机内存中读出描述符,以便进一步根据描述符执行dma读写。在一种实施方式中,控制寄存器(或者可以称为dma描述符控制寄存器)通过bar(baseaddressregister,基地址寄存器)空间访问,例如可以对应于pcie总线的bar0,在这种情况下,控制寄存器对应的地址偏移量可以为0x0000,需要注意的是,该地址偏移量可以根据需要进行设置,具体不做限定。27.在一种实施方式中,控制寄存器的结构可以如下所示:表1读状态控制寄存器的结构示意图其中,msi为messagesignalinterrupt,是pcie设备通过写一个特定消息到特定地址,从而触发一个处理器中断的机制。rc,rootcomplex,根组件,通常指主机,ed,endpoint,终端设备,即本技术中的数字电路,例如可以指fpga电路。r表示读(read),w表示写(write)。28.在一种实施方式中,读描述符存储部件和写描述符存储部件为先入先出存储器,读描述符存储部件和写描述符存储部件被预先定义了存储地址。fifo为firstinputfirstoutput,先入先出队列,或称为先入先出存储器,在该实施方式中,描述符在数字电路中被存放于fifo中,并为fifo赋予地址,使得其能够被地址标识,以便使得该数字电路能够与标准总线互连,便于开发。相应的,控制寄存器包括源地址寄存器、目的地址寄存器、描述符大小寄存器、触发寄存器,其中,目的地址寄存器用于存储任一存储地址。29.需要说明的是,上述的示例为读取读描述符时的配置,在读取写描述符时,该控制寄存器结构为:表2写状态控制寄存器结构示意图二者区别在于,在该状态下,dma描述符控制寄存器的起始地址偏移量被设置为0x0100,当然,该地址偏移量同样可以根据需要进行设置,具体不做限定。30.其中,rcwritestatusanddescriptorbase(low)和rcwritestatusanddescriptorbase(high),或者rcreadstatusanddescriptorbase(low)和rcreadstatusanddescriptorbase(high),构成描述符地址信息,根据该描述符地址信息,能够定位读描述符或写描述符,进而进行读取。31.内存直接访问控制部件能够根据描述符或者描述符地址信息生成对应的读命令或写命令,读数据搬移部件和写数据搬移部件中同样具有控制器,例如图1中的readdmadatamaster和writedmadatamaster,用于控制指令执行。为了能够实现读写并行处理,本技术设置有读描述符存储部件和写描述符存储部件,其中,读描述符存储部件用于存储利用控制寄存器得到的读描述符,写描述符存储部件用于存储利用控制寄存器得到的写描述符。读描述符为指示数字电路从主机中读取数据到自身的描述符,写描述符为指示数字电路将自身的数据写入到主机中的描述符。与二者相配合工作的是读命令传输部件和写命令传输部件,读命令传输部件用于向读数据搬移部件发送基于读描述符得到的读命令,或者基于描述符地址信息得到的读命令,可以理解的是,基于描述符地址信息得到的读命令即用于读取描述符的命令,通过该方式,可以利用同一套部件完成对描述符以及数据的搬移,节省硬件资源。写命令传输部件用于向写数据搬移部件发送基于读描述符得到的写命令。此外,还包括读数据搬移部件和写数据搬移部件,读数据搬移部件用于执行读命令,写数据搬移部件用于执行写命令,数据存储部件用于存储读命令执行后得到的读数据。32.具体的,描述符预先存储在主机中,具体的,主机内存中具有描述符表,描述符表具有存储若干数量的描述符的空间,具体数量不做限定,例如可以为128个,每个描述符对应的空间大小不做限定,例如可以为8个word,或者可以为32个字节。此外,在另一种实施方式中,描述符表中还可以存在与各个描述符分别一一对应的状态表,状态表中的数据能够根据描述符的执行情况进行更新,在主机需要时,能够读取状态表中的数据,确定各个描述符的执行情况,在必要时,可以更新已经被执行完毕的描述符,以便数字电路能够连续不断地进行数据读写,提高效率。33.本实施例并不限定状态表和描述符表的具体形式,在一种实施方式中,请参考图2,图2示出了一种主机内存结构,主机内存中采用状态表 描述符表的形式,前面是状态表,后面是描述符表。状态表的地址可以为rcwritestatusanddescriptorbase或者rcreadstatusanddescriptorbase地址,在这种情况下,描述符表的地址即为基地址 偏移地址,偏移地址与状态表的总体大小相关,例如图2所示,当有128个状态表,每个状态表32个比特位时,偏移地址为0x200。每个状态表中有31个比特位为预留操作位(reserved),另一个为标识操作位(done),标识操作位用于表示对应的描述符的执行状态。34.描述符的具体结构不做限定,可以根据需要进行设置。具体的,在一种实施方式中,读描述符的结构可以为:表3读描述符结构示意图相应的,写描述符的结构可以为:表4写描述符结构示意图描述符的具体内容不做限定,可以根据实际需要进行设置,例如请参考图3,图3中示出了三个描述符的具体内容,即descriptor0、descriptor1和descriptor2。请参考图4,图4为本技术实施例提供的一种数据搬移的过程示意图,具体为将三个数据块从主机内存移动到fpga总线地址空间。35.为了完成该操作,主机首先需要计算需要分配所需的内存空间大小,在一种实施方式中,每个状态表中的条目为4字节,128个条目即需要512字节的内存;每个描述符的大小为32个字节,以图2和图3为例,三个描述符需要96字节的内存,因此状态表和描述符表的总内存分配为608字节。36.然后,主机在pciexpress地址空间中分配608字节的内存,具体的,分配内存的起始地址可以是0xf000_0000,将此地址写入rootcomplexreadstatusanddescriptor寄存器中。基地址为0xf000_0000,那么第一个描述符的地址即为基地址 偏移地址,即0xf000_0000 0x200,因此在主机内存空间的0xf000_0204中写入高32bit源地址0,在0xf000_0200中写入低32bit源地址0x1000_0000,在0xf000_0200c中写入高32bit目的地址0,在0xf000_0208中写入低32bit目的地址0x5000_0000,在0xf000_0210中写入0x0000_4000发送16kdwords(64kb),描述符id为0,完成对第一个描述符的具体设置。重复该步骤两次,完成剩余两个描述符的设置,完成后的效果图即为图3。37.主机通过bar0配置控制寄存器,以便控制寄存器读取读状态描述符基地址,具体可以使用64位地址。即主机在0x0000_0004中写入0x0000_0000ꢀ‑高32bit读状态描述符基地址,并在0x0000_0000中写入0xf000_0000ꢀ‑ꢀ低32bit读状态描述符基地址。数字电路能够在此基础上 0x200得到描述符地址。38.进一步的,主机通过bar0配置控制寄存器的fifo地址,由于fifo本身没有地址的概念,为了使其能够适配标准总线,在使用总线接口的fifo时,需要定义该fifo的地址。具体的,可以在0x0000_000c中写入0x0000_0000ꢀ‑高32bitfifo地址,并在0x0000_0008中写入0x0100_0000ꢀ‑ꢀ低32bitfifo地址。此时,该fifo在fpga内部总线上对应的地址为0x0100_0000。39.然后,主机写寄存器rd_dma_last_ptr,即在0x0000_0010写入0x2,表示共有3个描述符。40.最后,主机在0x0000_001c写入任意值,以便启动数字电路的dma操作。41.在上述的内存直接访问架构的基础上,该架构内还可以进一步增加其他部件,以便提高其性能。具体的,在一种实施方式中,内存直接访问控制部件用于接收读数据搬移部件和写数据搬移部件发送的搬移完毕通知。具体的,请参考图1,dmadescriptorcontroller中包括readdmastatussink(可称为读状态获取部件)和writedmastatussink(可称为写状态获取部件),分别与readdmastatussource(读状态生成部件)和writedmastatussource(写状态生成部件)相连,readdmastatussource和writedmastatussource分别在执行完描述符、或读命令/写命令后生成搬移完毕通知并发送至readdmastatussink和writedmastatussink,使得控制寄存器得知其状态。内存直接访问控制部件包括状态更新部件,例如图1中的status&msi部件,状态更新部件用于在检测到目标描述符执行完毕后,更新主机的系统内存中目标描述符对应的目标状态位数据。具体的,其可以通过reg&status&msimanager(可称为状态和中断管理部件)中的txslave(可称为状态和中断上报部件)更新主机内的目标描述符对应的目标状态表中的目标状态位数据。具体的,可以通过txslave生成mwr写数据包,并将其通过pcie总线发送给主机。42.需要说明的是,为了能够实现读写并行的效果,在本技术中,在主机处可以分别划分两个独立的内存空间,分别用于存储读描述符和对应的状态表,以及写描述符和对应的状态表。在完成后,数字电路可以发送中断信号,主机可以通过判断哪一个内存空间中的状态表均为完成状态,来确定是读完成还是写完成。43.进一步的,内存直接访问控制部件包括中断上报部件,中断上报部件用于在检测到目标描述符执行完毕后,向主机发送中断消息。继续参考图1,图1中reg&status&msimanage(可称为状态和中断管理部件)中的txslave同样可以承担中断上报的功能,dmadescriptorcontroller中的status&msi部件可以作为中断上报部件,与txslave配合生成mwr写数据包,并将其通过pcie总线发送给主机,起到中断上报的效果。可以理解的是,中断上报和状态位数据更新对应的mwr写数据包的内容不同。44.此外,在读数据的场景下,若同时读取多个数据包,读取的各个数据包可能会出现不按照读取顺序的其他顺序被获取,为了避免数据错误,通常会在一个时刻仅读取一个数据包,这样会使得带宽无法被充分利用。为了解决该问题,本技术中内存直接访问架构中还包括先入先出缓存器,先入先出缓存器用于缓存读命令执行后得到的读数据包。此外,各个读数据包包括与读命令对应的数据包标签,读数据包按照数据包标签进行先后顺序排列得到读数据。通过在先入先出缓存器中对多个数据包进行缓存,配合数据包读取时根据读命令得到的数据包标签,可以对各个数据包进行排序后存储,实现在一个时刻同时读取多个数据包,充分利用带宽的效果。45.可以理解的是,在读写并行,以及同时进行状态表更新或中断上报时,数字电路需要与主机进行多类型且高频的交互,为了保证数据交互的正常,内存直接访问架构中可以包括与目标总线连接的通讯部件。通讯部件用于向目标总线发送第一数据包,或者用于从目标总线上获取第二数据包,并基于第二数据包的数据包类型,将第二数据包发送至对应的部件。第一数据包,是指数字电路能够生成的任意一种数据包,例如写数据包,或者可以为终端数据包。第二数据包,是指从主机获取的任意一种类型的数据包,例如读数据包。请参考图1,图1中的schedule(即axi-stschedule,表示基于axi总线的通讯部件)即为通信部件。46.上述的数字电路可以单独作为一个设备工作,或者可以集成至其他的电子设备中,即电子设备可以应用上述的内存直接访问架构。该电子设备可以通过目标总线,例如pcie总线,与主机相连,共同组成内存直接访问系统。47.请参考图5,图5为本技术实施例提供的一种内存直接访问方法的流程图。该方法包括:s101:若检测到内存直接访问控制部件的控制寄存器被触发,则获取描述符地址信息。48.s102:利用内存直接访问控制部件,基于描述符地址信息生成描述符读命令。49.s103:利用读数据搬移部件执行描述符读命令,得到描述符,并将描述符写入内存直接访问控制部件的描述符存储部件。需要说明的是,描述符的数量不做限定,类型可以为读描述符和/或写描述符。50.s104:利用内存直接访问控制部件,基于描述符生成访问命令。51.s105:基于访问命令的种类,利用读数据搬移部件或写数据搬移部件执行访问命令。52.可以理解的是,访问命令可以读命令或者为写命令。53.具体的,请参考图6,图6为本技术实施例提供的一种主机内存写入流程图,其中包括如下步骤:1、主机cpu设置dma描述符控制寄存器,启动dma流程。54.2、控制寄存器命令读数据搬移器获取上位机(即主机,host)内的描述符表内描述符。55.3、将获取的描述符存入fpga内部写描述符fifo(即readdescriptortableslave)中。56.4、控制寄存器命令写数据搬移器传输数据。57.5、写数据搬移器将数据从fpga的ddr(doubledatarate,双倍速率同步动态随机存储器)或者ram(randomaccessmemory,随机存取存储器)中取数据,组成mwr(存储写)tlp包,将数据搬移到host系统内存中。58.6、写数据搬移器生成donebit通知(即搬移完毕通知),发送至控制寄存器,以便通知控制寄存器完成数据传输。59.7、更新host系统内存中对应id的描述符状态位。60.8、控制寄存器向主机发送msi中断。61.请参考图7,图7为本技术实施例提供的一种主机内存读取流程图,其中包括如下步骤:1、主机cpu设置dma描述符控制寄存器,启动dma流程。62.2、控制寄存器命令读数据搬移器获取上位机内的描述符表内描述符。integratedcircuit,简称asic)、数字信号处理器(digitalsignalprocessor,简称dsp)、数字信号处理设备(digitalsignalprocessingdevice,简称dspd)、可编程逻辑器件(programmablelogicdevice,简称pld)、现场可编程门阵列(fieldprogrammablegatearray,简称fpga)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述实施例给出的内存直接访问方法。75.下面对本技术实施例提供的计算机可读存储介质进行介绍,下文描述的计算机可读存储介质与上文描述的内存直接访问方法可相互对应参照。76.本技术还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述的内存直接访问方法的步骤。77.该计算机可读存储介质可以包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。78.本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。79.本领域技术人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应该认为超出本技术的范围。80.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或
技术领域
:内所公知的任意其它形式的存储介质中。81.最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系属于仅仅用来将一个实体或者操作与另一个实体或者操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语包括、包含或者其他任何变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。82.本文中应用了具体个例对本技术的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本技术的方法及其核心思想;同时,对于本领域的一般技术人员,依据本技术的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本技术的限制。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献