写入页面群组的数据到闪存模块的装置及方法与流程

文档序号:25543594发布日期:2021-06-18 20:40
本发明涉及存储装置,尤指一种写入页面群组的数据到闪存模块的装置及方法。
背景技术
::闪存通常分为nor闪存与nand闪存。nor闪存为随机存取装置,中央处理器(host)可于地址引脚上提供任何存取nor闪存的地址,并及时地从nor闪存的数据引脚上获得存储于该地址上的数据。相反地,nand闪存并非随机存取,而是串行存取。nand闪存无法像nor闪存一样,可以存取任何随机地址,中央处理器反而需要写入串行的字节(bytes)的值到nand闪存中,用于定义请求命令(command)的类型(如,读取、写入、抹除等),以及用在此命令上的地址。地址可指向一个页面(闪存中写入操作的最小数据块)或一个区块(闪存中抹除操作的最小数据块)。闪存控制器通常使用纠错码(errorcorrectingcode,ecc)来修复用户数据于通过信道或存储时发生的错误。在数据写入时,闪存控制器编码用户数据来产生纠错码的冗余信息。这些冗余信息让闪存控制器在数据读取时,可以修正发生在用户数据中任意位置的有限数目的错误比特,而不需要重读。为了防止读取页面的用户数据含有超过纠错码所能够修正回来的错误比特而发生的重大错误,闪存控制器可让默认数目的页面形成一个页面群组(pagegroup),并且依据页面群组的用户数据产生页面群组的奇偶校验码。然而,由于页面群组的奇偶校验码的计算是一种跨页面的数据计算操作,需要耗费大量的时间和运算资源。因此,本发明提出一种写入页面群组的数据到闪存模块的装置及方法,用于减少产生页面群组的奇偶校验码时所需的时间和运算资源。技术实现要素:有鉴于此,如何减轻或消除上述相关领域的缺陷,实为有待解决的问题。本发明涉及一种写入页面群组的数据到闪存模块的方法,由闪存控制器执行,包含:主机接口控制器从主机端取得页面群组的用户数据,其中,页面群组包含多个页面;主机接口控制器通过总线架构存储页面的用户数据到随机存取存储器,同时通过接口输出页面的用户数据至引擎,使得引擎依据页面的用户数据计算页面群组的奇偶校验码;直接存储存取控制器从引擎获取页面群组的奇偶校验码,并且通过总线架构存储页面群组的奇偶校验码到随机存取存储器;以及闪存接口控制器通过总线架构从随机存取存储器获取页面的用户数据和页面群组的奇偶校验码,并且写入页面的用户数据和页面群组的奇偶校验码至闪存模块。本发明还涉及一种写入页面群组的数据到闪存模块的装置,包含:总线架构;引擎;和主机接口控制器。主机接口控制器包含第一接口,耦接总线架构;第二接口,耦接主机端;第三接口,耦接引擎;以及控制器。控制器驱动第二接口从主机端取得页面群组的用户数据,页面群组包含多个页面;驱动第一接口以通过总线架构存储页面的用户数据到随机存取存储器,同时驱动第三接口输出页面的用户数据至引擎,使得引擎依据页面的用户数据计算页面群组的奇偶校验码。上述实施例的优点之一,通过如上所述的使用主机接口控制器直接输出页面的用户数据到引擎以进行奇偶校验码的计算,可节省引擎通过总线架构从随机存取存储器读取页面的用户数据的时间。本发明的其他优点将配合以下的说明和附图进行更详细的解说。附图说明此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。图1显示页面、奇偶校验码页面及其纠错码的逻辑数据组织示意图。图2为一些实施方式的电子装置的系统架构图。图3为基于图2的系统架构下的页面群组的用户数据及其奇偶校验码的产生及写入的示意图。图4为基于图3所示的执行步骤的操作顺序图。图5为依据本发明实施例的电子装置的系统架构图。图6为依据本发明实施例的闪存控制器中组件的接口连接示意图。图7为依据本发明实施例的从主机接口控制器传输多个页面的用户数据到独立磁盘冗余数组纠错码引擎的时序图。图8为依据本发明实施例的从独立磁盘冗余数组纠错码引擎传输页面群组的奇偶校验码到直接存储控制器的时序图。图9为基于图5的系统架构下的页面群组的用户数据及其奇偶校验码的产生及写入的示意图。其中,附图中符号的简单说明如下:10、50:电子装置;110:主机端;130:闪存控制器;131:主机接口控制器;132:总线架构;134:处理单元;135:直接存储存取控制器;136:随机存取存储器;137:独立磁盘冗余数组纠错码引擎;139:闪存接口控制器;150:闪存模块;530:闪存控制器;531:主机接口控制器;535:直接存储器存取控制器;537:独立磁盘冗余数组纠错码引擎;610、650、673、677:接口。具体实施方式以下将配合相关附图来说明本发明的实施例。在这些附图中,相同的标号表示相同或类似的组件或方法流程。必须了解的是,使用于本说明书中的“包含”、“包括”等词,是用于表示存在特定的技术特征、数值、方法步骤、作业处理、组件和/或组件,但并不排除可加上更多的技术特征、数值、方法步骤、作业处理、组件、组件,或以上的任意组合。本发明中使用如“第一”、“第二”、“第三”等词是用来修饰权利要求中的组件,并非用来表示之间具有优先权顺序,先行关系,或者是一个组件先于另一个组件,或者是执行方法步骤时的时间先后顺序,仅用来区别具有相同名字的组件。必须了解的是,当组件描述为“连接”或“耦接”至另一组件时,可以是直接连结、或耦接至其他组件,可能出现中间组件。相反地,当组件描述为“直接连接”或“直接耦接”至另一组件时,其中不存在任何中间组件。用于描述组件之间关系的其他词语也可以类似方式解读,例如“介于”相对于“直接介于”,或者“邻接”相对于“直接邻接”等等。为了达到数据的容错性,闪存控制器可依据每页的用户数据产生纠错码(errorcorrectingcode,ecc),并将用户数据连同纠错码一起写入闪存模块,使得将来能够修正从闪存模块读出的含有错误比特的用户数据。纠错码可以是低密度奇偶较验码(low-densityparitycheckcode,ldpc)、bch码(bose–chaudhuri–hocquenghemcode)或其他种类的编码。以每1k字节的用户数据为例,bch码可提供最多72个错误比特的修正能力,而ldpc可提供最多128个错误比特的修正能力。然而,读取页面的用户数据可能含有超过纠错码所能够修正回来的错误比特。因此,闪存控制器可让默认数目的页面形成一个页面群组(pagegroup),并且依据页面群组的用户数据产生奇偶校验码页面(paritypage)。参考图1所示示例的数据组织,七个页面p#0至p#6形成一个页面群组,每个页面包含4096比特的用户数据,并据以产生相应的ecc。例如,第0页面p#0的纠错码为ecc#0,第1页面p#1的纠错码为ecc#1,依此类推。在这里需注意的是,图1所示的示例是一种逻辑观点,并不代表一个页面群组的用户数据及其纠错码、奇偶校验码页面及其纠错码实际存储于同一个物理块中。为了优化系统效能,一个页面群组的用户数据页面及其纠错码、奇偶校验码页面及其纠错码可能以并行的方式存储在不同信道中多个逻辑单元号(logicalnumberunit,lun)的物理块,本发明并不因此受限。奇偶校验码页面的数据可使用公式(1)产生:pj=dp0,j⊕dp1,j⊕dp2,j⊕dp3,j⊕dp4,j⊕dp5,j⊕dp6,j,其中,j为从0到4095的任意整数,p0代表第0页面,p1代表第1页面,p2代表第2页面,依此类推;pj代表奇偶校验码页面中第j个比特的值;dp0,j代表第0页面中第j个比特的值,dp1,j代表第1页面中第j个比特的值,dp2,j代表第2页面中第j个比特的值,依此类推。当运用一个页面的相应纠错码还无法修正其中的错误比特时,闪存控制器可舍弃此页面,并依据页面群组中的其他页面和奇偶校验码页面的内容使用互斥或运算来产生修复后的此页面的用户数据。假设第1页面中的错误比特无法使用相应纠错码修正时,可使用公式(2)进行错误页面的回复:dp1,j=dp0,j⊕dp2,j⊕dp3,j⊕dp4,j⊕dp5,j⊕dp6,j⊕pj。页面群组的奇偶校验码根据其作用又可称为独立磁盘冗余数组纠错码(redundantarrayofindependentdisks,raidecc)。为了完成以上所述的二维防护,图2显示一些实施方式的系统架构。电子装置10包含主机端(hostside)110、闪存控制器130及闪存模块150,并且闪存控制器130及闪存模块150可合称为装置端(deviceside)。电子装置10可实施于个人计算机、笔记本计算机(laptoppc)、平板计算机、移动电话、数字相机、数字摄影机等电子产品之中。主机端110与闪存控制器130的主机接口控制器(hostinterfacecontroller)131可以通用串行总线(universalserialbus,usb)、先进技术附件(advancedtechnologyattachment,ata)、串行先进技术附件(serialadvancedtechnologyattachment,sata)、快速外设组件互联(peripheralcomponentinterconnectexpress,pci-e)、通用闪存记忆存储(universalflashstorage,ufs)、快速非易失存储器(non-volatilememoryexpress,nvme)、嵌入式多媒体卡(embeddedmulti-mediacard,emmc)等通信协议彼此通信。闪存控制器130的闪存接口控制器(flashinterfacecontroller)139与闪存模块150可以双倍数据率(doubledatarate,ddr)通信协议彼此通信,例如,开放nand闪存(opennandflashinterface,onfi)、双倍数据率开关(ddrtoggle)或其他通信协议。闪存控制器130包含处理单元134,可使用多种方式实施,如使用通用硬件(例如,单处理器、具并行处理能力的多处理器、图形处理器或其他具运算能力的处理器),并且在执行软件以及/或固件指令时,提供之后描述的功能。处理单元134通过主机接口控制器131接收主机命令,例如读取命令(readcommand)、写入命令(writecommand)、抹除命令(erasecommand)等,调度并执行这些命令。闪存控制器130另包含随机存取存储器(randomaccessmemory,ram)136,可实施为动态随机存取存储器(dynamicrandomaccessmemory,dram)、静态随机存取存储器(staticrandomaccessmemory,sram)或上述两者的结合,用于配置空间作为数据缓冲区,存储从主机端110读取并即将写入闪存模块150的用户数据(也可称为主机数据)、奇偶校验码等,存储从闪存模块150读取并即将输出给主机端110的用户数据,以及存储从闪存模块150读取的用于进行数据修复的ecc、奇偶校验码等。随机存取存储器136另可存储执行过程中需要的数据,例如,变量、数据表、主机-闪存对照表(host-to-flash,h2ftable)、闪存-主机对照表(flash-to-host,f2htable)等。闪存接口控制器139包含nand闪存控制器(nandflashcontroller,nfc),提供存取闪存模块150时需要的功能,例如命令串行器(commandsequencer)、ecc编码器、ecc译码器等。ecc编码器用于依据一个用户数据页面或者raidecc页面的内容产生相应的ecc。闪存控制器130中可配置总线架构(busarchitecture)132,用于让组件之间彼此耦接以传递数据、地址、控制信号等,这些组件包含主机接口控制器131、处理单元134、ram136、直接存储存取(directmemoryaccess,dma)控制器135、闪存接口控制器139等。于一些实施例中,主机接口控制器131、处理单元134、ram136、dma控制器135与闪存接口控制器139可通过单一总线彼此耦接。于另一些实施例中,闪存控制器130中可配置高速总线,用于让处理单元134、dma控制器135与ram136彼此耦接,并且配置低速总线,用于让处理单元134、dma控制器135、主机接口控制器131与闪存接口控制器139彼此耦接。总线包含并行的物理线,连接闪存控制器130中两个以上的组件。总线是一种共享的传输介质,在任意的时间上,只能有两个装置可以使用这些线来彼此通信,用于传递数据。数据及控制信号能够在组件间分别沿数据和控制线进行双向传播,但另一方面,地址信号只能沿地址线进行单向传播。例如,当处理单元134想要读取ram136的特定地址上的数据时,处理单元134在地址线传送此地址给ram136。接着,此地址的数据会在数据线上回复给处理单元134。为了完成数据读取操作,控制信号会使用控制线进行传递。闪存控制器130可包含raidecc引擎137,包含互斥或门和寄存器,用于完成如上所述公式(1)、公式(2)或类似的运算。dma控制器135可包含指令队列(instructionqueue)。处理单元134可通过总线架构132发出数据存取指令给dma控制器135,dma控制器135则将这些指令依据到达时间存储于指令队列。每个数据存取指令可包含来源组件、来源地址、目的地组件、目的地地址等信息。dma控制器135依据数据存取指令,通过总线架构132在组件间迁移指定的数据,例如,读取ram136中特定地址及长度的数据并输入raidecc引擎137,将raidecc引擎137产生的奇偶校验码存储到ram136中的特定地址等。闪存模块150提供大量的存储空间,通常是数百个千兆字节(gigabytes,gb),甚至是多个兆兆字节(terabytes,tb),用于存储大量的用户数据,例如高分辨率图片、影片等。闪存模块150中包含控制电路以及存储器数组,存储器数组中的存储单元可包含单层式单元(singlelevelcells,slcs)、多层式单元(multiplelevelcells,mlcs)、三层式单元(triplelevelcells,tlcs)、四层式单元(quad-levelcells,qlcs)或上述的任意组合。处理单元134通过闪存接口控制器139写入用户数据到闪存模块150中的指定地址(目的地地址),以及从闪存模块150中的指定地址(来源地址)读取用户数据。闪存接口控制器139使用多个电子信号来协调闪存控制器130与闪存模块150间的数据与命令传递,包含数据线(dataline)、时钟信号(clocksignal)与控制信号(controlsignal)。数据线可用于传递命令、地址、读出及写入的数据;控制信号线可用于传递芯片启动(chipenable,ce)、地址提取启动(addresslatchenable,ale)、命令提取启动(commandlatchenable,cle)、写入启动(writeenable,we)等控制信号。然而,如上所示实施方式的架构会让dma控制器135必须等待主机接口控制器131将一页的用户数据存储到ram136的指定地址后才能够从ram136的指定地址读取这页的用户数据并输入到raidecc引擎137。详细来说,参考图3所示的步骤。步骤(1):主机接口控制器131从主机端110取得一个页面的用户数据,并存储此页面的用户数据到ram136中的指定地址。步骤(2):dma控制器135从ram136中的指定地址读取一个页面的用户数据,并且输入raidecc引擎137。步骤(1)和(2)会不断地在闪存控制器130中循环执行,直到一个页面群组的用户数据都输入到raidecc引擎137来进行运算。步骤(3):dma控制器135从raidecc引擎137取得此页面群组的奇偶校验码,并存储到ram136的指定地址。步骤(4):闪存接口控制器139从ram136中的指定地址读取这些页面的用户数据和页面群组的奇偶校验码,并且写入闪存模块150。步骤(1)和步骤(2)的执行需要互相等待,拉长了数据写入的时间。参考图4,举例来说,主机接口控制器131写入第1页面的用户数据至ram136的操作p#1(w)需要等待dma控制器135从ram136读取第0页面的用户数据的读取操作p#0(r),dma控制器135从ram136读取第1页面的用户数据的读取操作p#1(r)需要等待主机接口控制器131写入第1页面的用户数据至ram136的操作p#1(w),依此类推。另外,由于主机接口控制器131和dma控制器135需要竞争总线架构132的控制权,步骤(1)和步骤(2)间可能会因为其他组件(例如,处理单元134、闪存接口控制器139等)占据总线架构132的资源而更进一步拉长其前置时间(如图4中所示的时间区间ts)。为了解决如上所述实施方式的问题,本发明实施例提出一种新的闪存控制器,修改主机接口控制器131、dma控制器135和raidecc引擎137间的接口设置,用于避免通过dma控制器135占据总线架构132的资源来从ram136读取页面群组的用户数据并输入到raidecc引擎137。参考图5所示的电子装置50,主机接口控制器531和raidecc引擎537增加互相连接的接口,用于让主机接口控制器531从主机端110取得一个页面的用户数据后,通过总线架构132存储此页面的用户数据到ram136中的指定地址,并同时通过新设置的接口传送此页面的用户数据到raidecc引擎537。主机接口控制器531在传送一个页面群组的用户数据给raidecc引擎537后,发出控制信号给dma控制器535,让dma控制器535从raidecc引擎537取得此页面群组的奇偶校验码,并通过总线架构132存储到ram136的指定地址。参考图6的接口连接示意图。raidecc引擎537设置接口673,连接主机接口控制器531中的接口610,用于直接从主机接口控制器531获取页面群组中每一页的用户数据以进行页面群组的奇偶校验码的编码,而不通过任何dma控制器从ram136获取。在开始数据传输前,主机接口控制器531可进入初始化阶段,通过接口610通知raidecc引擎537每个页面群组包含多少个页面、操作模式等信息。搭配参考图7的时序图,详细来说,针对一个页面群组的页面总数设定,raidecc引擎537可让设定引擎就绪信号(setraidreadysignal,set_raid_rdy)生效(assert)一段时间t71,通知主机接口控制器531可以在这段期间设定页面总数。在期间t71中,主机接口控制器531可将页面总数放在群组容量数据线(groupsizedatalines,grp_size[2:0])并在设定引擎脉冲信号(setpulsesignal,set_raid_pls)上产生一个方波,用于让raidecc引擎537在方波的上升沿于群组容量数据在线提取页面群组的页面总数,并存储于其中的寄存器。针对操作模式设定,raidecc引擎537可让设定模式就绪信号(setmodereadysignal,set_mode_rdy)生效一段时间t73,通知主机接口控制器531可以在这段期间设定操作模式。在期间t73中,主机接口控制器531可将操作模式(例如,编码模式mode=0)放在操作模式数据线(operationmodedatalines,op_mode[1:0])并在设定模式脉冲信号(setmodepulsesignal,set_mode_pls)上产生一个方波,用于让raidecc引擎537在方波的上升沿于操作模式数据在线提取指示的操作模式,并存储于其中的寄存器。完成初始化阶段后,raidecc引擎537可让编码就绪信号(encodereadysignal,enc_rdy)生效,直到接收完一个页面群组的用户数据(例如,期间t75),用于通知主机接口控制器531可以在生效期间传送用户数据。主机接口控制器531可让编码使能信号(encodeenablingsignal,enc_en)生效,直到传送完最后一个页面的用户数据(例如,期间t77)。在期间t77中,主机接口控制器531可搭配时钟信号(clocksignal,未显示在图7)将每个页面的用户数据放在编码数据线(encodedatalines,enc_dat[63:0]),让raidecc引擎537提取。raidecc引擎537可使用公式(1)计算提取的用户数据,产生页面群组的奇偶校验码。主机接口控制器531可包含传送计数器,初始为0,并且在传送完一个页面的用户数据后加1。当传送计数器的数值等于页面群组的页面总数后,主机接口控制器531可让结束确认信号(terminationvalidsignal,term_valid)生效一段时间,通知dma控制器535可以开始从raidecc引擎537获取页面群组的奇偶校验码,并通过总线架构132存储到ram136的指定地址。在初始化阶段,raidecc引擎537中的控制器(未显示于图5和图6)可驱动接口673来让设定引擎就绪信号生效一段时间,并且让设定模式就绪信号生效一段时间。主机接口控制器531中的控制器(未显示于图5和图6)可驱动接口610来侦测设定引擎就绪信号,将页面总数放在群组容量数据线,在设定引擎脉冲信号上产生一个方波,侦测设定模式就绪信号,将操作模式放在操作模式数据线,并且在设定引擎脉冲信号上产生一个方波。在数据传输阶段,raidecc引擎537中的控制器(未显示于图5和图6)可驱动接口673来让编码就绪信号生效一段时间。主机接口控制器531中的控制器(未显示于图5和图6)可驱动接口610来让编码使能信号生效一段时间,将每个页面的用户数据放在编码数据线,并且让结束确认信号生效一段时间。在这里需要注意的是,主机接口控制器531另可设置连接至主机端110的第一接口(未显示于图5和图6)和连接至总线架构132的第二接口(未显示于图5和图6)。主机接口控制器531中的控制器(未显示于图5和图6)可驱动第一接口以使用通信协议从主机端110获取每个页面的用户数据,并且驱动第二接口以使用进阶可扩充接口(advancedextensibleinterface,axi)通信协议来获取总线架构132的控制权,并通过总线架构132存储每个页面的用户数据到ram136中的指定地址。主机接口控制器531中的控制器、第一接口和第二接口的电路结构和功能是所属
技术领域
:技术人员的公知技术,为求简明不再赘述。参考图6的接口连接示意图。raidecc引擎537设置接口677,连接dma控制器535中的接口650,用于输出页面群组的奇偶校验码给dma控制器535。搭配参考图8的时序图,详细来说,当dma控制器535接收到结束确认信号后,dma控制器535可让结束输出有效信号(terminationoutvalid,term_out_valid)生效,直到接收完页面群组的奇偶校验码(例如,期间t81),用于通知raidecc引擎537可以在生效期间传送页面群组的奇偶校验码。raidecc引擎537可让结束输出启动信号(terminationoutenablingsignal,term_out_en)生效,直到传送完页面群组的奇偶校验码(例如,期间t83)。在期间t83中,raidecc引擎537可搭配时钟信号(clocksignal,未显示在图7)将页面群组的奇偶校验码放在结束输出奇偶校验码数据线(terminationoutparitydatalines,term_out_pty[63:0]),让dma控制器535提取。在奇偶校验码的传送阶段,dma控制器535中的控制器(未显示于图5和图6)可驱动接口650来侦测结束确认信号,以及让结束输出有效信号生效一段期间。raidecc引擎537中的控制器(未显示于图5和图6)可驱动接口677来让结束输出启动信号生效一段时间,以及将页面群组的奇偶校验码放在结束输出奇偶校验码数据线。在这里需要注意的是,dma控制器535另可设置连接至总线架构132的接口(未显示于图5和图6)。dma控制器535中的控制器(未显示于图5和图6)可驱动此接口使用进阶可扩充接口通信协议来获取总线架构132的控制权,并通过总线架构132存储页面群组的奇偶校验码到ram136中的指定地址。dma控制器535中的控制器和接口的电路结构和功能是所属
技术领域
:技术人员的公知技术,为求简明不再赘述。根据本发明实施例的架构,详细来说,参考图9所示的步骤。步骤(5):主机接口控制器531从主机端110取得一个页面的用户数据,并通过总线架构132存储此页面的用户数据到ram136中的指定地址,同时通过接口610输出此页面的用户数据到raidecc引擎537进行编码。步骤(5)会不断地在闪存控制器530中循环执行,直到一个页面群组的用户数据都输入到raidecc引擎537来进行运算。步骤(6):主机接口控制器531通过接口610发送结束确认信号给dma控制器535,通知dma控制器535可以开始从raidecc引擎537获取页面群组的奇偶校验码。步骤(7):dma控制器535通过接口650从raidecc引擎537取得此页面群组的奇偶校验码,并通过总线架构132存储到ram136的指定地址。步骤(8):闪存接口控制器139从ram136中的指定地址读取这些页面的用户数据和页面群组的奇偶校验码,并且写入闪存模块150。闪存接口控制器139还可依据每个页面的用户数据产生纠错码,依据页面群组的奇偶校验码产生纠错码,并且将每个页面的纠错码和奇偶校验码的纠错码写入闪存模块150。相较于图4所示相应于先前实施方式的时序图,应用本发明实施例的新架构,可节省先前设计的dma控制器135从ram136的多个页面的读取操作p#0(r)至p#6(r),此外,也可避免其他组件和dma控制器135因争夺总线架构132的控制权产生的碰撞,并避免其他组件因等待这些读取操作p#0(r)至p#6(r)的完成所需要的前置时间。虽然图5至图6和图9中包含了以上描述的组件,但不排除在不违反发明的精神下,使用更多其他的附加组件,以达成更佳的技术效果。此外,虽然图9的步骤采用指定的顺序来执行,但是在不违反发明精神的情况下,所属
技术领域
:的技术人员可以在达到相同效果的前提下,修改这些步骤之间的顺序,所以,本发明并不局限于仅使用如上所述的顺序。此外,所属
技术领域
:的技术人员也可以将若干步骤整合为一个步骤,或者是除了这些步骤外,循序或并行地执行更多步骤,本发明也不应因此而局限。以上所述仅为本发明较佳实施例,然其并非用以限定本发明的范围,任何熟悉本项技术的人员,在不脱离本发明的精神和范围内,可在此基础上做进一步的改进和变化,因此本发明的保护范围当以本申请的权利要求书所界定的范围为准。当前第1页12当前第1页12
再多了解一些
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1