您现在的位置是:首页 > 故事语录 > 励志故事励志故事
ubi是什么(UBI产品)
admin2022-12-01 11:16:07励志故事96人已围观
简介ubi是什么(UBI产品),本文通过数据整理汇集了ubi是什么(UBI产品)相关信息,下面一起看看。人们经常对UBI到底是什么感到困惑,这就是我们创建这个部分的原因。请记住:1.UBI不是Flash翻译层,它与FTL无关。2.在
ubi是什么(UBI产品),本文通过数据整理汇集了ubi是什么(UBI产品)相关信息,下面一起看看。
人们经常对UBI到底是什么感到困惑,这就是我们创建这个部分的原因。请记住:
1.UBI不是Flash翻译层,它与FTL无关。
2.在裸闪上能用,在MMC、EMMC、SD、mini-SD、micro-SD、USB闪存设备上不能用;UBI和raw flash设备一起工作,大部分出现在嵌入式设备上,比如手机等等。
概观
UBI全名'无序块图像'。它是一个在原始闪存设备上工作的卷管理系统。它管理单个物理闪存设备上的多个逻辑卷,并可以将I/O负载平均分配给闪存芯片。
从某种意义上来说,UBI可以和逻辑卷管理器相提并论。LVM将逻辑扇区映射到物理扇区,UBI将逻辑擦除块映射到物理擦除块。但是除了映射之外,UBI还实现了损耗平衡和透明的I/O错误管理。
UBI卷是一组连续的逻辑擦除块(leb)。每个逻辑擦除块都可以映射到任何物理擦除块。这种映射由UBI管理,全局损耗平衡机制(记录每个物理擦除块的擦除计数器,并透明地将更多损耗的数据移动到更少损耗的数据)对上层是隐藏的。
UBI卷是在创建时确定的,也可以在以后更改(卷是可动态调整大小的)。UBI有一个用户空间工具,可用于管理UBI卷。
UBI卷有两种,动态和静态。静态卷是只读的,其内容受CRC-32校验和保护。动态卷是读写的,上层负责保证数据的完整性。
UBI处理坏块,上层不需要关心坏块管理。UBI有一个保留的物理擦除块池。当物理擦除块变成坏块时,UBI透明地用好的物理块替换坏块。UBI将新的物理擦除块的数据移动到好的物理擦除块。UBI卷不知道发生了什么。
NAND闪存在读写操作期间可能会发生位翻转。ECC校验和可以纠正位翻转,但是当累积到一定量的数据时,可能会发生数据丢失。UBI会将位翻转数据移动到另一个物理擦除块。这个过程叫做擦洗。擦洗过程是背景,对上层是透明的。
以下是UBI主要功能的简短列表:
1.UBI提供动态生成、删除或调整大小的卷;
2.UBI实现了所有flash设备的损耗均衡(比如你写的UBI卷的一个逻辑块可能会被写入flash芯片的任何物理eraseblocks
3.UBI透明地处理所有物理eraseblocks
4.UBI最大限度地降低了通过比特翻转丢失数据的可能性。
下面是MTD分区和UBI卷之间的比较。他们有一些相似之处:
1.都是由eraseblocks组成的——UBI卷是逻辑eraseblocks,而MTD分区是物理删除块。
2.所有都支持以下三种基本操作——读、写、擦除
但是UBI卷与MTD分区相比具有以下优势:
1.UBI volumes没有eraseblock磨损均衡限制,用户不需要考虑这个,上层软件实现更简单。
2.UBI volumes没有坏eraseblocks,这也使得上层软件不需要做坏块管理,所以上层软件更简单。
3.UBI卷是动态的,可以动态地创建、删除和调整大小,而MTD分区是静态的。
4.UBI处理比特翻转,这也使得上层软件更简单。
Ubi提供卷更新操作,使检测中断的软件更新和恢复变得容易。
6.UBI提供原子逻辑块修改操作,保证在修改逻辑eraseblock内容的过程中,不干净的重启不会造成数据丢失;这对上层软件来说非常有用。
7.UBI有一个解映射操作,解映射是从逻辑eraseblock到物理eraseblock的映射。调度物理eraseblock进行擦除并返回;这非常快,并且使得上层软件避免实现它们自己的机制。
有一个驱动叫glubi,用来模拟MTD设备上的ubi卷。看起来很奇怪,因为UBI在MTD设备上工作,gluebi在UBI上模拟另一个MTD设备。
用户空间工具有以下UBI工具
UBI info-提供系统中UBI设备和卷的信息。ubi连接-将MTD设备连接到ubi到ubi,并创建相关的ubi设备;ubidetach -从UBI devicesubimkvol中分离MTD设备-在UBI设备上创建UBI卷;ubirmvol -从UBI设备中删除UBI卷;ubiupdatevol -更新UBI卷;此工具使用了UBI卷更新功能,如果更新中断,该功能会使卷处于损坏状态;ubicrc32 -计算与UBI使用相同初始种子的文件的CRC-32校验和;UBI化-生成UBI图像;格式化空闪存,擦除闪存并保留擦除计数器,将UBI映像闪存到MTD设备;MTD INFO-报告有关在Systemubi标头苏比中找到的MTD设备的信息。在每个非坏物理擦除的起始位置,存储了两个64字节的小标头:
擦除计数头(或EC头)包含物理擦除块的擦除计数和一些其他重要信息;卷标识符头(或vidheader)存储卷id和l逻辑eraseblock(LEB)号,可以确定这个PEB属于哪个卷以及逻辑位置;VID还包含一些其他信息。这就是为什么eraseblock比物理erase block小的原因——头占用了部分闪存空间。
所有UBI报头都受CRC-32保护。请参考drivers/mtd/ubi/ubi-media.h文件来检查头文件的内容。
当UBI连接到MTD设备时,首先扫描它,读取所有标头,检查CRC-32校验和,并将擦除计数器和逻辑到物理擦除块映射信息存储到RAM中。
当UBI删除一个PEB时,它写入包含增加的擦除计数值的EC报头。这意味着PEBs总是有EC头,除了从删除结束到写入EC头的这段时间。如果此时发生不干净的重新启动,EC标头将会丢失。在这种情况下,UBI写入一个新的EC头,擦除计数器是MTD设备扫描的平均擦除计数器。
当UBI将PEB与LEB相关联时,VID报头被写入PEB。让我们考虑一下,当下面的操作发生时,头部会发生什么情况。
LEB联合国地图行动:LEB和PEB之间的联系被取消,PEB被抹去。当PEB被擦除时,EC报头被写入,但是VID报头不被写入LEB映射操作或未映射的LEB操作:UBI首先找到PEB,然后将其作为VID报头写入(EC报头必须已经存在)。请注意,对于已映射到LEB的写操作,数据将直接写入PEB,无需修改UBI标头。UBI维护两个每PEB报头,因为它需要在不同的时间向闪存写入不同的信息:
删除PEB后,EC标头会立即写入PEB。当UBI与PEB和LEB相关联时,VID报头被写入PEB。当EC报头被写入PEB时,UBI不知道与该PEB相关联的卷ID和LEB号。这就是为什么UBI需要两次写操作来写两个单独的头。
UBI volume tablevolume table是一个闪存上的数据结构,它保存了该UBI设备上每个卷的信息。体积表是体积表记录的数组,每个记录包含以下信息:
体积大小;卷名;卷类型;卷对齐;更新制造者;自动调整大小标志;该记录的CRC-32校验和。每条记录描述一个UBI卷,卷表数组中记录的索引对应于这条记录的卷ID。比如UBI volume0就是用卷表的record0来描述的。卷表中的记录数受LEB大小的限制,但不能超过128。这意味着卷的最大数量不能大于128。
每次创建、删除、调整大小、重命名或更新UBI卷时,都会修改相应的卷表记录。UBI维护两个卷表,以在断电后保持可用性。
在实现细节中,卷表驻留在特定的目标UBI卷中,该卷称为布局卷。卷包含两个LEBS——每个对应一个卷表的副本。布局卷是内部UBI卷,用户无法看到或访问。当读取或写入布局卷时,UBI使用与普通用户卷相同的机制。
UBI在更新卷表的内容时使用以下算法。
准备内存中的卷表内容,un-map布局卷的LEB0,向LEB0写入新的卷表,UN-map布局卷的LEB1写入新的voume表,向LEB1写入新的voume表,刷新UBI工作队列,确保删除未映射的leb对应的peb。UBI确保在连接MTD设备时,卷表的两个副本是相同的。不干净的重新启动可能会导致它们不同。这是UBI选择将LEB0的内容复制到LEB1中(因为LEB0是新的)。如果一个卷表损坏,UBI将从另一个卷表中恢复。
最小flash输入/输出单元ubi使用flash的抽象模型。简而言之,从UBI的角度来看,flash(MTD设备)包含eraseblocks,有好有坏。没有好的eraseblock可以被读取、写入或删除。好的擦除块也可以被标记为坏的。
根据闪存类型,闪存读写具有最小的I/O单元大小。
NOR闪存通常具有1字节的最小I/O单元,因为NOR闪存通常允许读取和写入单个字节。一些NOR闪存可能具有16或32的最小I/O单元,例如具有ECC的NOR flashes。NAND闪存通常具有512,2048或4096字节的最小I/O单元,这对应于NAND页面大小。NAND闪存将每个NAND页的ECC存储到OOB区域,这意味着写入整个NAND页以计算ECC代码。MTD设备读取整个NAND页来检查ECC码的最小I/O单元是非常重要的,影响很多东西,比如:VID头的物理位置取决于min。输入输出设备。LEB的大小也取决于它;一般来说,I/O单元越大,LEB越小,UBI flash的空间开销越大,因为EC头和VID头都占用一个I/O单元。所有对leb的写入都应与min对齐。I/O单位,它是min的倍数。输入输出设备;Reads没有这种限制,但是请记住,MTD级别的所有读取都是min的倍数。输入输出设备;只是上层通过缓冲读取数据屏蔽了这个特性。NAND闪存子页如前所述,所有UBI I/O必须是最小的。I/O单元,这是NAND闪存的页面大小。然而,一些SLC NAND闪存允许更小的I/O单元,在MTD术语中称为子页面。并非所有NAND都有子页。
MMLC NANDss没有子页,而LC NAND通常有子页。例如,512字节的NAND页通常包含2256字节的子页,2048字节的NAND页包含4256字节的子页。SLC OneNAND芯片,2048字节NAND页面大小有4x512字节的子页面。如果NAND闪存支持子页,则ECC代码的计算可以在子页中进行,而不是按NAND进行。在这种情况下,可以分别读写子页面。
显然,尽管NAND芯片支持子页,但NAND控制器可能不允许。事实上,如果管理闪存的控制器计算出ECC是基于NAND的,那么子页级别的I/O操作是不可能的。
使用子页面可以减少flash的空间开销。例如,对于128KiB的eraseblock,页面大小为2048字节。如果没有子页面,EC占用第一个2048,VID herder占用第二个2048,因此LEB大小变为124KiB。反之支持子页,UBI把EC和VID分别放在第一个和第二个512字节,那么LEB就变成了126KiB。
子页仅在UBI中用于存储EC VID头。UBI API不允许用户使用子页I/O单元。这是因为子页写入可能很慢。写一个子页,驱动可能会写整个NAND页,但是会把所有与这个操作无关的子页都写入0xff。也就是说,写入四个子页面可能比写入整个NAND页面慢四倍。所以UBI只对表头使用子页面,但是UBI API中并不存在这个概念。
UBI标题位置
EC头存储在PEB的偏移量0处,占用64字节;VID报头位于下一分钟。I/O单元或子页,占用64个字节。例如:
带NOR flash,最小1字节。I/O单元,VID头位于PEB 64;对于没有子页的NAND闪存,VID头位于第二个NAND页;对于带有子页面的NAND闪存,VID头位于第二子页面闪存空间overheadUBI使用一定量的闪存空间来保存管理信息,从而减少了闪存设备中可供UBI用户使用的空间。这些费用包括:
2 PEB用于存储容量表1 PEB保留用于损耗均衡目的1 PEB保留用于原子LEB改变操作,peb用于peb处理;这适用于NAND flash,但不适用于NORFlash的预留PEBs百分比是可配置的,默认值为1%
保存擦除计数器使用UBI时,将擦除计数器存储在闪存介质上非常重要。也就是说,每个物理擦除块都有一个擦除计数器头,用来存储这个物理擦除块被删除的次数。当然,保持这个erase counter不丢失也同样重要,也就是说在删除flash和编写ubi镜像工具的时候要考虑erase counter。Mtd-utils包含ubuformat工具,可以正确执行这些操作。
UBI闪光器应该如何工作以下是UBI闪光器程序在删除闪光灯或闪烁UBI图像时应该做的事情:
首先,扫描整个闪存以收集擦除计数器。也就是说,它读取每个PEB的EC报头,检查每个报头的CRC32校验和,并将擦除计数器保存在ram中。不需要读取VID头。忽略坏PEBS。计算绘图擦除计数器。当peb的EC报头损坏或丢失时,使用平均擦除计数器。这种peb可能是不干净的重启导致的,但数量不会太大。如果目标是删除闪存,则删除每个PEB,并将正确的EC报头写入PEB。EC报头应该包含增加的擦除计数器。应该忽略坏的peb。对于NAND闪存,当在擦除或写入期间发生I/O错误时,PEB被标记为坏的。如果目的是刻录UBI图像,那么刻录工具应该对每个PEB执行以下操作。将UBI图像中PEB的内容读入一个缓冲区,该缓冲区必须是min的倍数。输入输出设备。将缓冲器中所有未填充的部分写入0xff。删除PEB,更改缓冲区中的EC头,并将该缓冲区写入物理eraseblock。在实际中,UBI映像通常小于UBI卷,因此flasher应该正确地刻录和写入peb,并正确地处理删除的peb。
请注意,在写入UBI映像时,UBI映像写入哪个eraseblocks并不重要。例如,图像的第一个擦除块可以被写入第一个PEB,或者第二个,或者后一个。
注意,如果你实现了一个生产线UBI图像刻录工具。那么flasher不需要改变EC头,因为这是新的flash,所以每个PEB的擦除计数器应该是0。这意味着生产线闪光器更简单。
如果您的UBI映像包含UBIFS文件系统,并且您的闪存是NAND,则您可能必须在输入peb数据的末尾丢弃0xff字节。这非常重要,虽然不是所有NAND闪存都需要。有时,不这样做可能会导致非常不愉快的问题,以后可能很难调试。所以我们建议一直这样做。
原因是UBIFS将只包含oxff字节的NAND页视为空闲。例如,假设PEB的第一NAND页有一些数据,第二NAND页是空的,第三NAND页有一些数据,第四NAND页和其他NAND页都是空的。在这种情况下,UBIFS认为第四个页面的NANDpages是空闲的,并将向这些页面写入数据。但是,如果flasher程序已经将0xff写入这些页面,那么结果就是,它们被写入了两次!然而,一些NAND闪存要求其NAND页仅被写入一次,即使这些数据包含0xff字节。
flasher要做的是丢弃所有以PEB结尾的空NAND页。不需要丢弃所有的空NAND页,只需要最后一页。这意味着flasher不需要扫描整个缓冲区来查找0xff。只需要从缓冲区的末尾开始查找第一个非0xff字节,速度非常快。
另一种方法是使用mkfs。生成UBIFS文件系统时增加可用空间修正选项。这将使您的闪光器不必担心PEBs结尾的0xff。这在你用生产线烧录程序写UBI镜像的时候非常有用。
将擦除块标记为坏块
本节针对NAND闪存和其他允许坏块的闪存。UBI标记物理擦除块在两种强条件下是坏块:
1.擦除块写入操作失败。在这种情况下,UBI将该PEB的数据移动到其他PEB(数据恢复),然后调用该PEB的诊断。
2.删除操作中出现EIO错误。在这种情况下,PEB被直接标记为坏块。
诊断在后台处理,目的是检测这个物理eraseblock是否真的坏了。写入失败的原因可能有很多,包括驱动程序的bug或者上层文件系统的bug(比如文件系统多次写入同一个NAND页)。整个诊断过程包括以下步骤:
删除eraseblock;读取eraseblock,确保它只包含0xff字节;写入测试模式字节;读取eraseblock并检查模式字符串;重复其它几种模式(0xA5、0x5A、0x00)。如果eraseblock通过了酷刑测试,它将不会被标记为坏块。注意,在诊断测试期间,位翻转的发生是将擦除块标记视为坏块的充分理由。请参考酷刑_prb函数。
可扩展性问题不幸的是,UBI可扩展性与闪存大小成线性关系。UBI初始化时间与闪存中peb的数量成线性关系。这意味着闪存越大,UBI初始化时间越长。这一初始化时间还取决于闪存的I/O速度,并略微取决于CPU速度,因为。UBI在连接时扫描MTD设备-它从每个单独的PEB读取擦除EC和VID头;ERS很小,所以意味着NOR flash需要读128字节/PEB,1 ~ 1~2NAND页/PEB;需要读取NAND闪存。当然,这远远小于JFFS2 mount MTD设备所需的读写数据量。所有UBI attaches MTD设备在MTD设备上挂载文件系统的速度都比JFFS2快得多。UBI为每个EC和VID头计算CRC-32校验和,这将消耗CPU,尽管这种闪存I/O负载非常小。以下是一些测试结果:
诺基亚N800上的最后一个256MiB OneNAND flash需要1秒钟才能连接;flash不支持子页面,所以UBI在扫描过程中每次PEB都要读取2KiB NAND pagesOLPX XO-1设备的1GiB NAND闪存,需要2 seconfs的时间来附着;支持子页面的是闪存SLC NAND,但是控制器不支持子页面写入,所以UBI必须读取每个PEB的前两个2KiB NAND页面。实现细节一般来说,UBI需要三张表:
卷表:包含每个卷的信息,如卷大小、类型等。擦除块关联(EBA)表:包含逻辑-逻辑-物理擦除块映射信息;比如读一个LEB,UBI先查对应的PEB数,然后读PEB;擦除计数器EC表:包含每个物理删除块的擦除计数器;UBI磨损平衡子系统使用此表查找PEB的擦除计数器。该卷保存在闪存中。只有在创建、删除UBI卷并调整其大小时,它才会发生变化。这种操作比较少见,对速度没有要求。UBI可以提供一种缓慢而简单的方法来管理材积表。
每次映射LEB或删除PEB时,EBA和欧共体表都会发生变化,因此有必要快速有效地管理这两个表。
UBI可以在闪存上维护EBA和EC表。这不可避免地引入了日志记录、日志重放、日志提交等等。换句话说,这将引入很多复杂性。但是这可以使EBA和EC算法具有可扩展性。
UBI的一个要求是简化闪存上的格式,因为UBI作者必须在引导加载程序中读取UBI卷,但是在引导加载程序的代码中有非常严格的限制。基本上,很难将复杂的日志扫描和重放代码添加到引导加载程序的代码中。
因此,UBI不会在闪存介质上维护EBA和EC表。相反,它是在每次连接附加MTD设备时构建的。这意味着UBI必须扫描整个闪存,并从每个PEB读取EC和VID标头,以构建RAM中的EC和EBA表。
这种设计的缺点是扩展性差,NAND flashes空间负载大(大概1.5~3%的flash空间,2KiB NAND页,128KiB eraseblock),优点是简单可靠。
当然,您可以创建UBI2,并在单独的闪存区域中维护这些表。UBI2不会和UBI兼容,因为他们有完全不同的on-flash格式,但是用户界面是完全一样的,这将保证UBI上层软件的兼容性。
卷自动调整大小众所周知,NAND芯片中某些标题的物理eraseblocks被制造商mark视为坏块。坏块随机分布,数据不一样,虽然厂商通常保证前几个物理eraseblocks不坏,坏块总数不会超过某个书目。比如一个新的256MiB oneNAND芯片,保证不超过40个128KiB PEBs(当然这个数字在使用过程中会增加)。这大约是闪存大小的2%。
当您需要创建UBI映像来刷机生产线上的最终用户设备时,您应该定义所有卷的确切大小。但是,总闪存大小取决于坏块的初始总数,因此很难做到这一点。
解决这个问题的一个显而易见的方法是假设最坏的情况,即所有芯片都有最多的坏peb。但实际上大多数芯片只有少数几个坏peb,比最大值小很多。一般来说这是没有问题的,会增加可靠性,因为UBI总是使用设备上的所有peb。另一方面,UBI应该保留一定数量的物理eraseblocks用于坏块处理,默认情况下是1%。所以上面提到的OneNAND芯片的%1 PEB会留给UBI,0 ~ 2%的PEB无法使用。
但是还有另一种选择——一个卷可以有自动调整大小的标记,这意味着当UBI第一次运行时,它的大小可以被放大。调整卷大小后,在移除自动调整大小标志后,UBI无法重新调整该卷的大小。自动调整大小标志存储在卷表中。只能将一个卷标记为自动调整大小。
Ubi操作lebun-maplebun-map操作由ubi_leb_unmap()内核API实现。从2.6.29开始,un-map操作通过UBI_IOCEBUNMAP ioctl命令暴露给用户空间程序。这个ioctl应该由UBI卷字符设备调用
Lebu-map操作:
首先,取消LEB和相应PEB的映射,然后安排擦除此PEB并将其返回;Un-map不会等待擦除结束;PEB有UBI后台线程负责擦除。当读取一个未映射的LEB时,UBI返回所有0xff字节,因此取消映射操作可以被认为是一个非常快速的擦除操作。但是有一点要注意。
假设您取消了LEB numL与PEB numP的映射。因为P不是同步删除,而是只调度删除操作,可能会在不干净重启时给一个“惊喜”;如果在物理删除P之前发生了重新启动。当UBI再次附着到MTD设备时,会发现L仍然映射到UBI。事实上,UBI会扫描整个MTD设备,找出哪个P对应于L,然后将这个映射添加到EBA表中。
但是一旦你向numL写入数据,或者使用LEB映射操作,numL映射一个新的PEB,旧的数据成为历史,因为即使此时发生不干净的重启,UBI仍然会选择numL的最新映射。
实施细节描述了UBI如何在不干净的重启后区分旧的LEB和新的PEB。假设我们取消了leb L到PEBP1的映射,UBI安排了P1的擦除。然后我们将数据写入L,这意味着UBI找到另一个PEBP2,将L映射到P2,然后将数据写入P2。如果在物理删除P1之前发生不干净的重启,我们会得到两个peb(P1,P2 ),对应于同一个LeB L
为了处理这种情况,UBI维护了一个全局64位序列号变量。每次映射LEB时,该可变序列号将增加并存储在PEB的VID报头中,因此每个VID报头具有唯一的序列号。序列号越大,VID就越年轻。当UBI连接到MTD设备时,将全局序列号初始化为VID报头中的最大值加1。
在上面的例子中,很明显UBI会选择较高的序列号(P2),然后丢弃较低的序列号(P1)
请注意,如果在通过磨损平衡将一个PEB数据移动到另一个PEB的过程中,或者在原子LEB更改操作过程中,出现不干净的重新启动。在这种情况下,我们不能简单地选择一个新的PEB,而是必须确定新的数据是否已经写入新的PEB。
lemapleb映射操作将逻辑eraseblock从以前的未映射映射到物理eraseblock。比如你要映射LEB A,UBI先找到对应的PEB,然后把VID头写到PEB,再修正内存中的EB A表。VID标头将指向LEB A,在此操作完成后,对LEB A的所有操作将最终转到映射的PEB。
LEB映射操作是通过ubi_leb_map() UBI内核API函数或UBI_IOCEBMAP ioctl进行的。
lemap操作接受dtype类型参数,该参数建议LEB将保存的数据类型。dtype有以下几种类型:
UBI_SHORTTERM-LEB存储的是短期数据,也就是这个数据很快就会被擦除;UBI将LEB映射到低擦除计数器的PEBUBI _ short term——LEB存储长期数据,而UBI将该LEB映射到高擦除计数器的PEBUBI _ UNKNOWN——在大多数情况下,当您不确定是否记住dtype只是长期或短期的提示时使用。不确定的请用UBI_UNKNOWN。况且UBI作者从来没有测试过UBI_SHORTERM和UBI_LONGTERM,所以不能保证它们会有什么效果。
这个网站是个人知识管理的网络存储空间。所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请一键举报。
更多ubi是什么(UBI产品)相关信息请关注本站,本文仅仅做为展示!
很赞哦! ()
相关文章
随机图文
留言与评论 (共有 条评论) |
点击排行
本栏推荐
标签云
猜你喜欢
- 吃什么食物不长胖呢(吃什么食物不会长胖-)
- 31省份新增20例 本土病例6例(31省区市新增本土病例71例)
- 南方宿舍衣服晾不干怎么办视频(南方宿舍衣服晾不干怎么办呀)
- 虚情假意句子说说心情,感情里虚情假意的说说
- 描写夜晚景色的优美句子(短一点),描写夜晚静谧的优美句子
- 什么是角质层呢(角质层指的是哪里)
- 给男朋友讲的甜甜的睡前小故事,男朋友睡前故事 超甜的短篇
- 建设银行网上缴费,建行手机银行能在网上交费吗为什么(建设银行网上缴费,建行手机银行能在网上交费吗转账吗)
- based 和based on(based和based on的区别)
- 支付宝积分怎么兑换提现免费额度最高(支付宝积分怎么兑换提现额度是什么意思)