加速压缩方法以及加速压缩装置与流程

文档序号:12865742阅读:353来源:国知局
加速压缩方法以及加速压缩装置与流程

本发明涉及一种微处理器技术,特别是一种加速压缩方法以及使用此方法的装置。



背景技术:

字符串匹配方法通常可归类为:基于内容可寻址内存(cam-,contentaddressablememory-based);及基于哈希(hash-based)二种。以上所述的字符串匹配都需要优化的最长字符串匹配方法,而优化传统上以软件实现。然而,软件的执行效能往往劣于专属硬件的执行效能。传统上,为了将字符串压缩成不同格式,例如,zlib、gzip、lzs、lz4或lzo等,需要提供不同的加速压缩硬件,造成微处理器的芯片面积扩大。因此,需要一种使用专属硬件的加速压缩方法以及使用此方法的装置,用以克服上述缺陷。



技术实现要素:

本发明实施例提出一种加速压缩方法,由压缩加速器的配置逻辑执行,包含以下步骤:从处理器核心取得输入参数,并且依据输入参数从压缩参数表取得配置设定。依据输入参数配置第一缓存器与第二缓存器之间的数据传送路径,其中第一缓存器储存原始数据。传送配置设定给数据传送路径上的装置,用以压缩原始数据以产生压缩数据及储存压缩数据至第二缓存器。

本发明的实施例提出一种加速压缩装置,至少包含第一及第二缓存器,以及配置逻辑。第一缓存器储存原始数据。配置逻辑从处理器核心取得输入参数;依据输入参数从压缩参数表取得配置设定;依据输入参数配置第一缓存器与第二缓存器之间的数据传送路径;以及传送配置设定给数据传送路径上的装置,用以压缩原始数据以产生压缩数据,并储存压缩数据至第二缓存器。

本发明的前述加速压缩方法及其装置,多个不同算法类型的压缩可复用硬件模块来压缩第一缓存器中的原始数据,而不需针对不同算法类型提供不同的压缩加速器,使得微处理器的面积可以节约。

附图说明

图1是示出依据本发明实施例的微处理器的系统架构图。

图2是示出依据本发明实施例的压缩加速系统的方块图。

图3是示出依据本发明实施例的压缩文件的格式示意图。

图4是示出依据本发明实施例的压缩加速器的硬件方块图。

图5是示出依据本发明实施例的加速压缩方法的流程图。

具体实施方式

以下说明为完成发明的较佳实现方式,其目的在于描述本发明的基本精神,但并不用以限定本发明。实际的发明内容必须参考之后的权利要求范围。

必须了解的是,在本说明书中使用的“包含”、“包括”等词,用以表示存在特定的技术特征、数值、方法步骤、作业处理、组件以及/或组件,但并不排除可加上更多的技术特征、数值、方法步骤、作业处理、组件、组件,或以上的任意组合。

在权利要求中使用如“第一”、“第二”、“第三”等词用来修饰权利要求中的组件,并非用来表示之间具有优先权顺序,先行关系,或者是一个组件先于另一个组件,或者是执行方法步骤时的时间先后顺序,仅用来区别具有相同名字的组件。

图1是示出依据本发明实施例的微处理器的系统架构图。微处理器10可包含多个处理器核心170_1至170_j及多个加速器(accelerator)150_1至150_i,i、j为整数,随着不同设计需求而有不同。加速器150_1至150_i举例而言可以是加速功能单元(afu,acceleratorfunctionalunits)。处理器核心170_1至170_j中包含的任意一个组件都涉及计算机指令的执行,这些组件包括算术逻辑单元(alu,arithmeticlogicunit)、浮点运算单元(fpu,floatingpointunit)、一级高速缓存(l1cache)及二级高速缓存(l2cache)。每一处理器核心采用指令周期,有时亦称提取-译码-执行周期,作为基本操作流程。此流程用以让处理器核心从内存取得程序指令,判定此指令指示进行何种操作,并且执行这些操作。加速器150_1至150_i可执行不同功能,并通过加速器接口(acceleratorinterface)130连接至末级高速缓存(last-levelcache)110,用以与处理器核心170_1至170_j通过虚拟地址(virtualaddress)进行数据交换。加速器150_1至150_i中之任一者可协助处理器核心170_1至170_j以更有效率地方式执行特定功能,上述特定功能包括例如压缩,加解密或正则匹配等运算量较大的功能,从而减轻处理器核心170_1至170_j的工作负担。加速器150_1至150_i中的一个可为压缩加速器(compressionaccelerator),用以完成字符串压缩功能哈希。

图2是示出依据本发明实施例的压缩加速系统的方块图。压缩加速系统20包含数据缓存器290,用以储存原始的输入串流(inputstream)211及输出串流(outputstream)213。举例来说,压缩加速系统20还包含处理器核心170_1及加速器150_1,并且加速器150_1为压缩加速器,用以将原始的输入串流211压缩为输出串流213。在压缩时,压缩加速系统20支持多种以硬件实现的压缩计算器及编码器,并且根据输入参数选择需要的计算器及编码器,用以压缩原始的输入串流211来产生符合特定算法类型的输出串流213。加速器150_1包含压缩装置250及编码装置270。输入串流211先传送至压缩装置250。压缩装置250包含哈希计算器253a及最长字符串匹配器255a,哈希计算器253a可包含gip、zlib、lzs、lz4及lzo等支持的所有哈希运算。哈希计算器253a可通过内存控制器253b存取内存中在哈希运算时所需的数据,例如,变量、比较字符串、哈希链表等。最长字符串匹配器255a可通过内存控制器255b存取内存中在最长字符串匹配时所需的数据,例如,变量、比较字符串等。编码装置270可包含哈夫曼编码器(huffmanencoder)273a、lzs编码器275a、lz4编码器277a及lzo编码器279a。哈夫曼编码器(huffmanencoder)273a、lzs编码器275a、lz4编码器277a及lzo编码器279a可分别通过内存控制器273b、275b、277b及279b存取内存中在编码成指定输出格式时所需的数据,例如,变量、映射表等。

配置逻辑240a耦接于压缩装置250、编码装置270及处理器核心170_1之间。处理器核心170_1在加载并执行驱动程序280时驱动配置逻辑240a,用以将输入串流211传送到哈希计算器253a中的指定计算器以完成指定的哈希运算。接着,最长字符串匹配器255a接收哈希运算结果,以及使用最长字符串查找方法进行字符串匹配。配置逻辑240b耦接于哈夫曼编码器273a、lzs编码器275a、lz4编码器277a、lzo编码器279a及处理器核心170_1之间。当算法类型为zlib或gzip时,执行的驱动程序280驱动配置逻辑240b以传送哈希运算结果及字符串匹配结果至哈夫曼编码器273a,用以将输入串流211编码成zlib或gzip格式的输出串流213。当算法类型为lzs、lz4或lzo时,执行的驱动程序280驱动配置逻辑240b以传送哈希运算结果及字符串匹配结果至lzs编码器275a、lz4编码器277a及lzo编码器279a中的相应一者,用以将输入串流211编码成lzs、lz4及lzo格式中的相应一者的输出串流213。

图3是示出依据本发明实施例的压缩文件的格式示意图。压缩文件30可包含文件首(fileheader)310、压缩主体(compressedbody)330及文件尾(filetail)350。处理器核心170_1在执行相关程序代码时产生文件首310及文件尾350,并且通过本发明所公开的压缩加速器150_1产生压缩主体330。此外,处理器核心170_1可产生包含文件首310、压缩主体330及文件尾350的文件,并通过驱动指定接口储存于非易失储存装置,例如,硬盘、闪存盘、固态硬盘等,或者通过通讯模块传送至其他的远程电子装置。

图4是示出依据本发明实施例的压缩加速器的硬件方块图。由于不同格式的压缩算法存在可以复用的部分,因此压缩加速器40中可设置配置逻辑240,藉由控制多路信号复用器及多路信号分离器来配置数据传送路径,用以将字符串传送至关联于特定格式的计算器或编码器,使得原始字符串可被指定的计算器或编码器处理。配置逻辑240可在可编程逻辑装置(pld,programmablelogicdevice)、可编程逻辑控制器(plc,programmablelogiccontroller)、现场可编程逻辑门阵列(fpga,fieldprogrammablegatearray)或专用集成电路(asic,application-specificintegratedcircuit)中实现固定功能(fixedfunctions)来完成本发明实施例中描述的控制。配置逻辑240储存压缩参数表241,用以纪录关联于特定算法类型(algorithmtype)及压缩水平(compressionlevel)的配置设定(configurationsettings)。压缩参数表241可使用高速缓存(cache)、静态随机存储器(sram,staticrandomaccessmemory)、只读存储器(rom,readonlymemory)或可擦可编程只读存储器(eprom,erasableprogrammablereadonlymemory)储存。示例的压缩参数表241如表1所示:

压缩参数表241可包含20笔纪录,每笔纪录包含默认长度的数据,这里纪录的数量为20笔以及算法类型仅为举例,本发明不限于此。每笔纪录储存关联于算法类型的配置设定(configurationsettings),或关联于算法类型及压缩水平的配置设定,例如,字典长度、哈希链表长度、输出格式、最小匹配长度、最大匹配长度、校验类型及哈希算法等信息。“gzip/zlib”为预设常数,代表算法类型为gzip或zlib。“lz4”为预设常数,代表算法类型为lz4。“lzo”为预设常数,代表算法类型为lzo。“lzs”代表算法类型为lzs。“ws0”、“ws1”、“ws2”及“ws3”为预设常数,代表不同的字典长度,例如,16k、32k、48k、64k等。“ts0”、“ts1”、“ts2”及“ts3”为预设常数,代表不同的哈希链表长度,例如,16k、32k、64k、128k等。“o0”及“o1”为预设常数,代表特定输出格式,例如为deflate或者frameformat或者lzo1x-1等格式。“min0”、“min1”、“min2”及“min3”为预设整数常数,代表不同的最小匹配长度,例如,2、3、4等。“max0”、“max1”、“max2”及“max3”为预设整数常数,代表不同的最大匹配长度,例如,128、256等。“h0”、“h1”、“h2”及“h3”为预设常数,代表特定哈希算法,例如为deflate哈希、不同等级的lz4哈希或者lzo1x-1哈希等哈希算法。处理器核心170_1可传送输入参数410给压缩加速器150_1,其中输入参数410包含算法类型、压缩水平及校验类型,用以指示压缩加速器150_1将输入串流211压缩成特定格式的输出串流213(亦即是,如图3所示的压缩主体330)。值得注意的是,处理器核心170_1在压缩结束产生如图3所示的压缩文件30时,输入参数410会被添加到文件首310供日后解压缩该压缩文件30使用。配置逻辑240可依据输入参数410控制多路信号复用器(multiplexers)420a及430a以及多路信号分离器(demultiplexers)420b及430b,用以配置数据路径,使得预取缓存器450a中的原始数据可输入至指定的哈希计算器及指定的压缩编码器。指定的哈希计算器可为gzip/zlib哈希计算器460a、lz4哈希计算器460b、lzo哈希计算器460c及lzs哈希计算器460d中的一个。指定的压缩编码器可为霍夫曼编码器480a、lz4编码器480b、lzo编码器480c及lzs编码器480d中的一个。此外,配置逻辑240可依据输入参数410中的算法类型或算法类型及压缩水平计算内存地址,从此内存地址开始读取指定长度的数据,并且解析出数据中的配置设定。当输入参数410中的算法类型为gzip或zlib时,配合压缩参数表241,内存地址的计算可使用公式(1):

addr=tstart+(lvl-1)*len(1),

当输入参数410中的算法类型为lz4时,内存地址的计算可使用公式(2):

addr=tstart+(c1+lvl-1)*len(2),

当输入参数410中的算法类型为lzo时,内存地址的计算可使用公式(3):

addr=tstart+(c1+c2)*len(3),

当输入参数410中的算法类型为lzs时,内存地址的计算可使用公式(4):

addr=tstart+(c1+c2+1)*len(4),

其中,addr代表计算后的内存地址,tstart代表压缩参数表241的起始地址,len代表每笔纪录的长度,lvl代表输入参数410中的压缩水平,c1代表gzip或zlib算法类型的最大压缩水平,且c2代表lz4算法类型的最大压缩水平。本领域技术人员可改变压缩参数表的储存内容及因应不同的压缩参数表设计改变内存地址的计算公式,本发明并不因此局限。接着,配置逻辑240传送配置设定给指定的哈希计算器460a~460d、最长字符串计算器470及指定的压缩编码器480a~480d,用以让指定的哈希计算器、最长字符串计算器470及指定的压缩编码器依据配置设定进行运算,使得预取缓存器450a中的原始数据可被编码成输入参数410指定的算法类型。压缩后的数据可储存于压缩数据缓存器450b,并让处理器核心170_1读取。配置逻辑240另可依据输入参数410中的校验类型,控制多路信号复用器440a及440b以配置数据路径,使得指定的校验编码器(checksumencoder)可产生相应于预取缓存器450a中的原始数据的校验码。指定的校验编码器可为循环冗余校验编码器490a、alder32编码器490b及快速哈希编码器490c中的一个。

以下说明当输入参数410中的算法类型为gzip或zlib时,配置逻辑240的操作范例。配置逻辑240可控制多路信号复用器420a以连接预取缓存器450a至gzip/zlib哈希计算器460a,使得gzip/zlib哈希计算器460a可从预取缓存器450a读取及计算原始数据,以及控制多路信号分离器420b以连接gzip/zlib哈希计算器460a至哈希比较器465,使得哈希比较器465可取得gzip/zlib哈希计算器460a产生的哈希值(hashvalue)。此外,配置逻辑240可控制多路信号复用器430a以连接最长字符串计算器470至霍夫曼编码器480a,使得霍夫曼编码器480a可取得最长字符串计算器470输出的原始字符串或者是匹配偏移量及匹配长度,并据以将预取缓存器450a中的原始数据编码成gzip或zlib格式的压缩数据。本领域技术人员可参考1996年5月出版的deflate压缩数据格式规范版本1.3(deflatecompresseddataformatspecificationversion1.3)(简称为rfc1951)及1996年5月出版的gzip文件格式规范版本4.3(gzipfileformatspecificationversion4.3)(简称为rfc1952)实施霍夫曼编码器480a,用以产生gzip格式的压缩数据。此外,本领域技术人员可参考1996年5月出版的deflate压缩数据格式规范版本1.3(简称为rfc1951)及1996年5月出版的zlib压缩数据格式规范版本3.3(zlibcompresseddataformatspecificationversion3.3)(简称为rfc1950)实施霍夫曼编码器480a,用以编码zlib格式的压缩数据。配置逻辑240可传送从压缩参数表241读取的配置设定给gzip/zlib哈希计算器460a、哈希比较器465、最长字符串计算器470及霍夫曼编码器480a,例如,压缩水平、字典长度“ws0”、哈希链表长度“ts0”、输出格式“o0”、最小匹配长度“min0”、最大匹配长度“max0”、哈希算法“h0”等。配置逻辑240可依据输入参数410中的校验类型控制多路信号复用器440a以连接预取缓存器450a至循环冗余校验编码器490a或alder32编码器490b,使得连接的校验编码器可依据预取缓存器450a中的原始数据产生校验值(checksumvalue),以及控制多路信号分离器440b以连接校验编码器490a或490b至校验缓存器450c,压缩时产生的此校验值通过处理器核心170_1回传给驱动程序280,由驱动程序280将该校验值附在如第3图所示的文件尾350,日后在解压缩时对压缩文件30的压缩主体330解压后做同样的校验计算得到另一校验值,判断其是否与压缩时产生的该校验值(例如附在文件尾350中该校验值)相等从而检测文件是否正确被解压缩。例如,输入参数410中指示的算法类型为gzip或zlib且压缩水平为4时,gzip/zlib哈希计算器460a从预取缓存器450a读取3个字符的原始数据并使用哈希算法“h0”进行哈希计算,并且哈希比较器465使用从gzip/zlib哈希计算器460a取得的哈希值遍历(traverse)并更新哈希链表。接着,最长字符串计算器470使用匹配算法求得滑动窗框(即字典)与预取缓存器450a中原始数据字符串之间的字符串的最长匹配。如果匹配成功,最长字符串计算器470输出匹配偏移量offset及匹配长度length给霍夫曼编码器480a,并且通过移位器473将数据预取器475中的滑动窗框向后滑动length个字节。如果匹配不成功,最长字符串计算器470输出原始数据给霍夫曼编码器480a,并且通过移位器473将数据预取器475中的滑动窗框向后滑动1个字节。

以下说明当输入参数410中的算法类型为lz4时,配置逻辑240的操作范例。配置逻辑240可控制多路信号复用器420a以连接预取缓存器450a至lz4哈希计算器460b,使得lz4哈希计算器460b可从预取缓存器450a读取及计算原始数据,以及控制多路信号分离器420b以连接lz4哈希计算器460b至哈希比较器465,使得哈希比较器465可取得lz4哈希计算器460b产生的哈希值。此外,配置逻辑240可控制多路信号复用器430a以连接最长字符串计算器470至lz4编码器480b,使得lz4编码器480b可取得最长字符串计算器470输出的原始字符串或者是匹配偏移量及匹配长度,并据以将预取缓存器450a中的原始数据编码成lz4格式的压缩数据。本领域技术人员可参考习知lz4/lz4hc格式及编码方法实施lz4编码器480b,用以产生lz4格式的压缩数据。配置逻辑240可连接预取缓存器450a至快速哈希编码器490c,使得连接的校验编码器可依据预取缓存器450a中的原始数据产生校验值,以及控制多路信号分离器440b以连接快速哈希编码器490c至校验缓存器450c。配置逻辑240可传送从压缩参数表241读取的配置设定给lz4哈希计算器460b、哈希比较器465、最长字符串计算器470及lz4编码器480b,例如,压缩水平、字典长度“ws1”、哈希链表长度“ts1”、输出格式“o1”、最小匹配长度“min1”、最大匹配长度“max1”、哈希算法“h1”或“h2”等。

以下说明当输入参数410中的算法类型为lzo时,配置逻辑240的操作范例。配置逻辑240可控制多路信号复用器420a以连接预取缓存器450a至lzo哈希计算器460c,使得lzo哈希计算器460c可从预取缓存器450a读取及计算原始数据,以及控制多路信号分离器420b以连接lzo哈希计算器460c至哈希比较器465,使得哈希比较器465可取得lzo哈希计算器460c产生的哈希值。此外,配置逻辑240可控制多路信号复用器430a以连接最长字符串计算器470至lzo编码器480c,使得lzo编码器480c可取得最长字符串计算器470输出的原始字符串或者是匹配偏移量及匹配长度,并据以将预取缓存器450a中的原始数据编码成lzo格式的压缩数据。本领域技术人员可参考习知lzo1x-1格式及编码方法实施lzo编码器480c,用以产生lzo格式的压缩数据。配置逻辑240可传送从压缩参数表241读取的配置设定给lzo哈希计算器460c、哈希比较器465、最长字符串计算器470及lzo编码器480c,例如,压缩水平、字典长度“ws1”、哈希链表长度“ts1”、输出格式“o1”、最小匹配长度“min1”、最大匹配长度“max1”、哈希算法“h2”等。配置逻辑240可依据输入参数410中的校验类型控制多路信号复用器440a以连接预取缓存器450a至循环冗余校验编码器490a或alder32编码器490b,使得连接的校验编码器可依据预取缓存器450a中的原始数据产生校验值,以及控制多路信号分离器440b以连接校验编码器490a或490b至校验缓存器450c。例如,输入参数410中的算法类型为lzo时,lzo哈希计算器460c从预取缓存器450a读取4个字符的原始数据并使用哈希算法“h3”进行哈希计算,并且哈希比较器465使用从lzo哈希计算器460c取得的哈希值遍历并更新哈希链表。接着,最长字符串计算器470使用匹配算法求得滑动窗框(即字典)与预取缓存器450a中原始数据字符串之间的字符串的最长匹配。如果匹配成功,最长字符串计算器470输出匹配偏移量offset及匹配长度length给lzo编码器480c,并且通过移位器473将数据预取器475中的滑动窗框向后滑动length个字节。如果匹配不成功,最长字符串计算器470输出原始数据给lzo编码器480c,并且通过移位器473将数据预取器475中的滑动窗框向后滑动1个字节。

以下说明当输入参数410中的算法类型为lzs时,配置逻辑240的操作范例。配置逻辑240可控制多路信号复用器420a以连接预取缓存器450a至lzs哈希计算器460d,使得lzs哈希计算器460d可从预取缓存器450a读取及计算原始数据,以及控制多路信号分离器420b以连接lzs哈希计算器460d至哈希比较器465,使得哈希比较器465可取得lzs哈希计算器460d产生的哈希值。此外,配置逻辑240可控制多路信号复用器430a以连接最长字符串计算器470至lzs编码器480d,使得lzs编码器480d可取得最长字符串计算器470输出的原始字符串或者是匹配偏移量及匹配长度,并据以将预取缓存器450a中的原始数据编码成lzs格式的压缩数据。配置逻辑240可传送从压缩参数表241读取的配置设定给lzs哈希计算器460d、哈希比较器465、最长字符串计算器470及lzs编码器480d,例如,字典长度“ws3”、哈希链表长度“ts3”、输出格式“o3”、最小匹配长度“min3”、最大匹配长度“max3”、哈希算法“h4”等。

通过以上实施例所示的压缩加速器架构,多个不同算法类型的压缩至少都可复用数据预取器475、预取缓存器450a、哈希比较器465、最长字符串计算器470、移位器473及压缩数据缓存器450b等硬件来压缩数据预取器475中的原始数据,而不需针对不同算法类型提供不同的压缩加速器,使得微处理器的面积可以节约。

图5是示出依据本发明实施例的加速压缩方法的流程图,由配置逻辑240执行。此方法开始于从处理器核心170_1取得输入参数410(步骤s510),依据输入参数410从压缩参数表241取得配置设定(步骤s530),依据输入参数410配置两个缓存器之间(例如,预取缓存器450a及压缩数据缓存器450b间,或预取缓存器450a及校验缓存器450c间)的数据传送路径(步骤s550),以及传送配置设定给数据传送路径上的装置(步骤s570),使得数据传送路径上的装置可协同合作以处理预取缓存器450a的原始数据并产生输入参数410指定的算法类型或校验类型的结果数据,并储存结果数据至压缩数据缓存器450b及校验缓存器450c中的相应的一个。

关于步骤s550的两个缓存器之间的数据传送路径配置,输入参数410可包含算法类型,以及两个缓存器包含预取缓存器450a及压缩数据缓存器450b。整个传送路径可分为三段子路径:哈希计算、最长字符串匹配及编码。哈希计算子路径上包含多路信号复用器420a、哈希计算器460a至460d、多路信号分离器420b及哈希比较器465,最长字符串匹配子路径上包含最长字符串计算器470,以及压缩编码子路径上包含多路信号复用器430a、压缩编码器480a至480d及多路信号分离器430b。配置逻辑240可依据算法类型配置哈希计算子路径,藉由控制多路信号复用器420a以连接预取缓存器450a至哈希计算器460a至460d中的一个,以及藉由控制多路信号分离器420b以连接上述选择的哈希计算器至哈希比较器465。配置逻辑240可依据算法类型配置编码子路径藉由控制多路信号复用器430a以连接最长字符串计算器470至压缩编码器480a至480d中的一个,以及藉由控制多路信号分离器430b连接上述选择的压缩编码器至压缩数据缓存器450b。哈希计算器460a至460d使用不同的算法将预取缓存器450a中的字符串(原始数据)映射成使用较少比特数的哈希值(hashvalues)。

关于步骤s550的两个缓存器之间的数据传送路径配置,输入参数410可包含校验类型,以及两个缓存器包含预取缓存器450a及校验缓存器450c。整个传送路径上包含多路信号复用器440a、校验编码器490a至490c及多路信号分离器440b。配置逻辑240可依据校验类型配置数据传送路径,藉由控制多路信号复用器450a以连接预取缓存器450a至校验编码器490a至490c中的一个,以及藉由控制多路信号分离器450b以连接上述选择的校验编码器至校验缓存器450c。校验编码器可使用不同算法依据预取缓存器450a中的原始数据产生校验值。

虽然图1、2及4中包含了以上描述的组件,但不排除在不违反发明的精神下,使用更多其他的附加组件,以达成更佳的技术效果。此外,虽然图5的方法流程图采用特定的顺序来执行,但是在不违反发明精神的情况下,本领域技术人员可以在达到相同效果的前提下,修改这些步骤间的顺序,所以,本发明并不局限于仅使用如上所述的顺序。

虽然本发明使用以上实施例进行说明,但需要注意的是,这些描述并非用以限制本发明。相反地,此发明涵盖了本领域技术人员显而易见的修改与相似设置。所以,申请权利要求范围须以最宽广的方式解释来包含所有显而易见的修改与相似设置。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1