首页 linux存储器管理分析

linux存储器管理分析

举报
开通vip

linux存储器管理分析linux存储器管理分析 摘要: 本文首先从介绍linux开始,以存储器管理下的内存管理为主要线索详细分析了linux下存储器管理系统的设计原理。内存管理是存储器管理的重点,因此本文重点分析的内存管理主要包括虚拟内存、磁盘缓存的相关结构体系及其存储方式,地址映射以及空间分布等等。最后介绍在此基础上介绍一些相关命令的语义及其用法等。 关键词: Linux操作系统、虚拟内存、磁盘缓存、页表管理、物理内存、内存映射、地址空间分配 引言: Linux存储管理的主要功能包括如下三方面: 虚拟存储器功能:为每个进程提供4GB...

linux存储器管理分析
linux存储器管理分析 摘要: 本文首先从介绍linux开始,以存储器管理下的内存管理为主要线索详细分析了linux下存储器管理系统的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 原理。内存管理是存储器管理的重点,因此本文重点分析的内存管理主要包括虚拟内存、磁盘缓存的相关结构体系及其存储方式,地址映射以及空间分布等等。最后介绍在此基础上介绍一些相关命令的语义及其用法等。 关键词: Linux操作系统、虚拟内存、磁盘缓存、页表管理、物理内存、内存映射、地址空间分配 引言: Linux存储管理的主要功能包括如下三方面: 虚拟存储器功能:为每个进程提供4GB的虚拟内存空间 存储保护:各个进程的虚拟存储空间彼此独立、相互隔离 存储共享:进程之间可以共享存储器内存(Main Memory或Primary Memory或Real Memory)也称主存是指CPU能直接存取指令和数据的存储器。 磁盘、 磁鼓和磁带等存储器, 一般称为外存或辅存(Secondary  Storage)。 内存是现代计算机系统进行操作的中心, CPU和I/O系统都要和内存打交道,Linux内核采用虚拟页式存储管理,采用三次映射机制实现从线性地址到物理地址的映射。其中PGD为页面目录,PMD为中间目录,PT为页面表。 32位的微机平台如Intel的X86采用段页式的两层映射机制,而64位的微处理器采用三级分页。对于传统的32位平台,Linux采用让PMD(中间目录)全0来消除中间目录域,这样就把Linux逻辑上的三层映射模型落实到X86结构物理上的二层映射,从而保证了Linux对多种硬件平台的支持。 Linux的虚拟内存管理需要各种机制的支持,首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请页要求:如果有空闲的内存可供分配,就请求分配内存,并把正在使用的物理页 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 在页缓存中,如果没有足够的内存分配,就调用交换机制,腾出一部分内存。另外在地址映射中要通过TLB(后援存储器)来寻找物理页,交换机制中要用到交换缓存,并且把物理页内容交换到交换文件中也要修改页表来映射文件地址。 Linux在管理进程虚存空间时定义了虚存段(vma)。虚存段是进程一段持续的虚存空间,在这段虚存里,所有 单元 初级会计实务单元训练题天津单元检测卷六年级下册数学单元教学设计框架单元教学设计的基本步骤主题单元教学设计 拥有相同的特征。这样分割是因为每个虚拟内存区域可能来源不同,因此,Linux把虚存分割管理。 Linux采用页式存储管理机制,每个页面的大小随处理机芯片而异。例如Intel 386处理机页面大小可为4KB和2MB两种,而Alpha处理机页面大小可为8KB、16KB、32KB和64KB。页面大小的选择对地址变换算法和页表结构会有一定的影响,如Alpha的虚地址和物理地址的有效长度随页面尺寸的变化而变化,这种变化必将在地址变换和页表项中有所反映。在Linux中,每一个进程都有一个比实际物理空间大得多的进程虚拟空间,为了建立虚拟空间和物理空间之间的映射,每个进程还保留一张页表,用于将本进程空间中的虚地址变换成物理地址。页表还对物理页的访问权限作出了 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 ,定义了哪些页可读写,哪些页是只读页,在进行虚实变换时,Linux将根据页表中规定的访问权限来判定进程对物理地址的访问是否合法,从而达到存储保护的目的。Linux的存储管理使用了三层页表来处理逻辑地址到物理地址的转换,分别是PGD(页表目录)、PMD(中间页表目录)和PT(页表), Linux将存储管理分为物理内存管理、内核内存管理、虚拟内存管理、内核虚拟内存管理和用户级内存管理等。 正文: 在本学期我学习了嵌入式linux程序设计这门课程,学习了当中许多相关的命令,也做了几次实验,期中收获最大的就是编译内核以及制作U盘启动盘等。了解了嵌入式系统的相关应用等,知道了Linux是为多用户多任务设计的实时操作系统, 所以存储资源要被多个进程有效共享,且由于程序规模的不断膨胀,要求的内存空间比从前大得多,所以 Linux内存管理的设计充分利用了计算机系统所提供的虚拟存储技术,真正实现了虚拟存储器管理。Linux的内存管理主要体现在对虚拟内存的管理上,为此我们可以把Linux虚拟内存管理功能概括为以下几点:大地址空间、进程保护、内存映射、公平的物理内存分配、共享虚拟内存等几方面。 1、Linux虚拟内存的实现结构 首先我们从整体结构上看一下Linux对虚拟内存的实现结构,如图1.1所示。 图1.1 Linux虚存的实现结构 从图中可看到实现虚拟内存的组成模块,其实现的原代码大部分放在/mm目录下。 1). 内存映射模块(mmap)—负责把磁盘文件的逻辑地址映射到虚拟地址,以及把虚拟地址映射到物理地址。 2).交换模块(swap)—负责控制内存内容的换入和换出,它通过交换机制,使得在物理内存的页面(RAM页)中保留有效的页 ,即从主存中淘汰最近没被访问的页,保存近来访问过的页。 3).核心内存管理模块(core)—负责核心内存管理功能,即对页的分配、回收、释放及请页处理等,这些功能将被别的内核子系统(如文件系统)使用。 4). 结构特定的模块—负责给各种硬件平台提供通用接口,这个模块通过执行命令来改变硬件MMU的虚拟地址映射,并在发生页错误时,提供了公用的方法来通知别的内核子系统。这个模块是实现虚拟内存的物理基础。 2、虚拟内存实现机制间的关系 Linux虚拟内存的实现需要各种机制的支持,因此,我们将对内存的初始化进行描述以后,围绕以下几种实现机制进行介绍,包括内存分配和回收机制、地址映射机制、缓存和刷新机制、请页机制、交换机制和内存共享机制等,这几种机制的关系如图1.2所示: 图1.2 虚存内存机制间关系 其中请页要求①;如果有空闲的内存可供分配,就请求分配内存②(于是用到了内存的分配和回收),并把正在使用的物理页记录在页缓存中③(使用了缓存机制)。如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存④⑤。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页⑧;交换机制中也要用到交换缓存⑥,并且把物理页内容交换到交换文件中后也要修改页表来映射文件地址⑦。 讲了那么多,肯定还是有人不清楚什么才是虚拟内存?其实Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。用做虚拟内存的这部分硬盘叫对换空间。 Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。如果知道要多少对换空间,应该用对换分区;如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。 Linux允许同时使用多个对换分区和/或对换文件。即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。许多操作系统内置虚拟内存,由于他们只需在运行时使用,即不会同时,那么除了当前运行的,其他所有对换空间都浪费着。如果他们共享同一个对换空间将更有效。这是可能的但需要一些Hacking工作。 Tips-HOWTO包含了一些如何完成这项任务的忠告。 3、 linux对虚拟内存的管理 虚拟内存不仅可以解决内存容量的问题,还可以提供以下附加的功能:大地址空间;进程保护;内存映射;灵活的物理内存分配;共享虚拟内存。 Linux对虚拟内存的管理以进程为基础。32位的线性地址映射的4G的虚拟空间中,从0XC0000000到0XFFFFFFFF的1G空间为所用进程所共享的内核空间,每个进程都有自己的3G用户空间。 Linux的虚拟内存管理需要各种机制的支持,首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时时如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请页要求:如果有空闲的内存可供分配,就请求分配内存,并把正在使用的物理页记录在页缓存中,如果没有足够的内存分配,就调用交换机制,腾出一部分内存。另外在地址映射中要通过TLB(后援存储器)来寻找物理页,交换机制中要用到交换缓存,并且把物理页内容交换到交换文件中也要修改页表来映射文件地址。 Linux在管理进程虚存空间时定义了虚存段(vma)。虚存段是进程一段持续的虚存空间,在这段虚存里,所有单元拥有相同的特征。这样分割是因为每个虚拟内存区域可能来源不同,因此,Linux把虚存分割管理。 Linux用数据结构vm_area_struct描述虚存段的属性,vm_area_struct主要包括以下几项: (1)vma在虚存中的起始地址和终止地址。 (2)vma段内容来源。 (3)一系列对vma的操作例程。这些处理操作有:页错误处理,页换入,页换出等。 当某个程序的映像开始执行时,可执行映像装入到进程的虚拟地址空间。此时Linux将产生一组vm_area_struct结构来描述虚存段。每个vm_area_struct结构描述可执行映像的一部分,例如可执行代码,初始化变量和未初始化数据等。同一进程的vma段的vm_area_struct结构通过vm_next指针连接组成链表。系统以虚拟内存地址的降序排列vm_area_struct结构。这样建立了文件的逻辑地址到虚拟线性地址的映射。 在讨论Linux是如何具体实现对虚拟内存的支持前,有必要看一下更简单的抽象模型。在处理器执行程序时需要将其从内存中读出再进行指令解码。在指令解码之前它必须向内存中某个位置取出或者存入某个值。然后执行此指令并指向程序中下一条指令。在此过程中处理器必须频繁访问内存,要么取指取数,要么存储数据。 虚拟内存系统中的所有地址都是虚拟地址而不是物理地址。通过操作系统所维护的一系列表格由处理器实现由虚拟地址到物理地址的转换。为了使转换更加简单,虚拟内存与物理内存都以页面来组织。不同系统中页面的大小可以相同,也可以不同,这样将带来管理的不便。Alpha AXP处理器上运行的Linux页面大小为8KB,而Intel X86系统上使用4KB页面。每个页面通过一个叫页面框号的数字来标示(PFN)。页面模式下的虚拟地址由两部分构成:页面框号和页面内偏移值。如果页面大小为4KB,则虚拟地址的 11:0位表示虚拟地址偏移值,12位以上表示虚拟页面框号。处理器处理虚拟地址时必须完成地址分离工作。在页表的帮助下,它将虚拟页面框号转换成物理页面框号,然后访问物理页面中相应偏移处。如图1.3就是虚拟内存的抽象模型: 图1.3 虚拟地址到物理地址映射的抽象模型 4、linux内存的分配与回收 1)内存分配: 1、当收到内存分配请求时,系统照buddy算法,根据请求的页面数在free_area[ ]数组对应的空闲页面组中搜索。 2、若请求的页面不是2的整数次幂,则按照稍大于请求数的2的整数次幂的值搜索对应的页面块组。例如请求2个页面时,则搜索2页面块组,请求3个页面时,就搜索4页面块组。 3、当搜索对应的页块组,而没有可利用的空闲页块时,再搜索更大一些的页块组,例如当查找4页块组没有可利用的空闲页块时,就再搜索8页块组。 4、在找到可利用的空闲页块后,就按照请求的页面块数分配所需的页面。 5、当某一空闲页面块被分配后,若仍有剩余的空闲页面,则根据剩余页面的大小把它们加入相应的空闲页块组中。如图1.4所示: 图1.4buddy算法演示 2)内存回收: 1、当释放内存页面时,系统将这些页面回收并作为空闲页面看待。 2、然后检查是否存在与这些页面相邻的其它空闲页块,若存在,则把它们合并为一个连续的空闲区。 3、再按照上述buddy算法划分不同的页面块,并加到相应的页面块组中。 5、linux地址空间分配: 1)linux线性地址空间的分配(举例说明),如图1.5 图1.5 上图中的程序代码就说明了linux中的空间地址分配 2)我们也可以利用/proc命令来查看各进程的用户地址空间,如图1.6所示: 图1.6 6、linux下的缓存与刷新机制: 为了更好的发挥系统性能,Linux采用了一系列和内存管理相关的高速缓存机制:               (1)缓冲区高速缓存(Buffer cache):包含了从设备中读取的数据块或写入设备的数据块。缓冲区高速缓存由设备标示号和块索引,因此可以快速找到数据块。如果数据可以在缓冲区中高速缓存中找到,则不需要从物理块设备上读取,从而加快了访问速度。 (2)页高速缓存(Page cache):这一高速缓存用来加速对磁盘上的映像和数据访问,它用来缓存某个文件的逻辑内容,并通过文件VFS索引节点和偏移量访问。当页从磁盘读到物理内存时,就缓存在页高速缓存。 (3)交换高速缓存(Swap cache):用于多个近程共享的页面被换出到交换区的情况。当页面交换到交换文件之后,如果有进程再次访问,它会被重新调入内存。 (4)联想存储器(Associative memory):完成对页表项的缓存。由于访问页表的速度会直接影响虚拟内存系统的效率,为了减少在内存频繁查找页表,基于大部分程序倾向于集中在小部分页访问的事实,Linux采用了高速的联想存储器。以实现快速的地址变换。 7、linux对物理内存的管理: 例如 Linux2.4内核就加入了对NUMA的支持,如果系统是NUMA结构的处理机系统,则物理内存被划分为三个层次来管理:存储节点(Node),管理区(Zone),页面(Page)。处理器的本地内存组成的区域叫做一个节点(Node),它通过pglist_data数据结构来描述。各个节点的物理内存根据不同的作用又分为ZONE_DMA、ZONE_NORMAL、ZONE_HIGH,ZONE_DMA面积小,且专供DMA使用,ZONE_NORMAL则供大多数的程序使用,对于ZONE_HIGH仅仅只有页面缓存以及用户进程能够使用该区域的空间。每个管理区对应一个free_area数组来组织空闲页面队列,该数组的每一项描述某一种页块的信息,第一个元素描述大小为1页的内存块的信息,第二个元素描述大小为2 页的内存块的信息,依此类推,所描述的页块大小以 2 的倍数增加。其中free_area 数组的定义如下: Typedef struct free_area_struct{ Struct list_head free_list; Unsigned int  *map; }free_area_t; 而list_head是一个双向指针结构,在这里用于将物理页块结构mem_map_t 连结成一个双向链表,而map则是记录这种页块组分配情况的位图,例如,位图的第N位为1,表明第N个页块是空闲的。页分配代码使用向量表free_area来分配和回收物理页。系统初始化时,free_area数组也被赋了初值。也就是说,系统中所有可用的空闲物理页块都已经被加到了free_area数组中。 Linux使用Buddy最先匹配算法来进行页面的分配和回收,并且必须按2的幂次方进行分配。如图1.5所示,比如要分配大小为2k的空闲块,如果系统中有足够的空闲块,页面分配代码首先在free_area中查找相应大小的空闲块,如果找到则分配。如果没有则查找下一尺寸(2倍于请求大小)的页面块,继续这一过程直到找到可以分配的页面,按要求分配之后,将剩余的空闲块仍然按照2的幂次方划分后链入适当的空闲块中。与分配算法相反,页面回收时总是试图将相邻的空闲页面组合成更大尺寸的空闲块。这里先给出“伙伴”要满足的三个条件:①两个块大小相同;②两个块物理地址连续;③两个块从同一大块中分离出来。在用户释放内存时,判断“伙伴”是否是空闲块。若否,则只要将释放的空闲块简单的插入相应的free_area中。若是,则需要在free_area中删除其伙伴关系,然后再判断合并后的空闲块的伙伴关系,依次重复,直到归并后的空闲块没有伙伴关系或合并到最大块时将其插入到free_area中。 8、虚拟内存下的页面管理: 1)请求换页: 当可执行映象到进程虚拟地址空间的映射完成后,它就可以开始运行了。由于只有很少部分的映象调入内存,所以很快就会发生对不在物理内存中的虚拟内存区域的访问。当进程访问无有效页表入口的虚拟地址时,处理器将向Linux 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 一个页面错误。 页面错误带有失效发生的虚拟地址及引发失效的访存方式。Linux必须找到表示此区域的vm_area_struct结构。对vm_area_struct数据结构的搜寻速度决定了处理页面错误的效率,而所有vm_area_struct结构是通过一种AVL(Adelson-Velskii and Landis) 树结构连在一起的。如果无法找到vm_area_struct与此失效虚拟地址的对应关系,则系统认为此进程访问了非法虚拟地址。这时Linux将向进程发送SIGSEGV信号,如果进程没有此信号的处理过程则终止运行。 如果找到此对应关系,Linux接下来检查引起该页面错误的访存类型。如果进程以非法方式访问内存,比如对不可写区域进行写操作,系统将产生内存错误的信号。 如果Linux认为页面出错是合法的,那么它需要对这种情况进行处理。 首先Linux必须区分位于交换文件中的页面和那些位于磁盘上的可执行映象。Alpha AXP的页表中有可能存在有效位没有设置但是在PFN域中有非0值的页表入口。在这种情况下,PFN域指示的是此页面在交换文件中的位置。如何处理交换文件中的页面将在下章讨论。 不是所有的vm_area_struct数据结构都有一组虚拟内存操作函数,它们有的甚至没有nopage函数。这是因为 Linux通过分配新的物理页面并为其创建有效的页表入口来修正这次访问。如果这个内存区域存在nopage操作函数,Linux将调用它。 一般Linux nopage函数被用来处理内存映射可执行映象,同时它使用页面cache将请求的页面调入物理内存中去。 当请求的页面调入物理内存时,处理器页表也必须更新。更新这些入口必须进行相关硬件操作,特别是处理器使用TLB时。这样当页面失效被处理完毕后,进程将从发生失效虚拟内存访问的位置重新开始运行。 2)linux页面cache Linux使用页面cache的目的是加快对磁盘上文件的访问。内存映射文件以每次一页的方式读出并将这些页面存储在页面cache中。图3.6表明页面cache由page_hash_table,指向mem_map_t数据结构的指针数组组成。 Linux中的每个文件通过一个VFS inode(在文件系统一章中讲叙)数据结构来标识并且每个VFS inode都是唯一的,它可以并仅可以描叙一个文件。页表的索引从文件的VFS inode和文件的偏移中派生出来。 从一个内存映射文件中读出页面,例如产生换页请求时要将页面读回内存中,系统尝试从页面cache来读出。如果页面在cache中,则返回页面失效处理过程一个指向mem_map_t数据结构;否则此页面将从包含映象的文件系统中读入内存并为之分配物理页面。 在映象的读入与执行过程中,页面cache不断增长。当不再需要某个页面时,即不再被任何进程使用时,它将被从页面cache中删除。具体用法如图1.7所示 图1.7 linux页面cache 3)换出与丢弃页面: 当系统中物理内存减少时,Linux内存管理子系统必须释放物理页面。这个任务由核心交换后台进程(kswapd )来完成。 核心交换后台进程是一种特殊的核心线程。它是没有虚拟内存的进程,在物理地址空间上以核心态运行。核心交换后台进程的名字容易使人误解,其实它完成的工作比仅仅将页面交换到系统的交换文件中要多得多。其目标是保证系统中有足够的空闲页面来维持内存管理系统运行效率。 此进程由核心的init进程在系统启动时运行,被核心交换定时器周期性的调用。 当定时器到时后,交换后台进程将检查系统中的空闲页面数是否太少。它使用两个变量:free_pages_high 和free_page_low来判断是否该释放一些页面。只要系统中的空闲页面数大于free_pages_high,核心交换后台进程不做任何工作;它将睡眠到下一次定时器到时。在检查中,核心交换后台进程将当前被写到交换文件中的页面数也计算在内,它使用nr_async_pages来记录这个数值;当有页面被排入准备写到交换文件队列中时,它将递增一次,同时当写入操作完成后递减一次。如果系统中的空闲页面数在free_pages_high甚至 free_pages_low以下时,核心交换后台进程将通过三个途径来减少系统中使用的物理页面的个数: l 减少缓冲与页面cache的大小, l 将系统V类型的内存页面交换出去, l 换出或者丢弃页面。 如果系统中空闲页面数低于free_pages_low,核心交换后台进程将在下次运行之前释放6个页面。否则它只释放3个。以上三种方法将依次使用直到系统释放出足够的空闲页面。当核心交换后台进程试图释放物理页面时它将记录使用的最后一种方法。下一次它会首先运行上次最后成功的算法。 当释放出足够页面后,核心交换后台进程将再次睡眠到下次定时器到时。如果导致核心交换后台进程释放页面的原因是系统中的空闲页面数小于free_pages_low,则它只睡眠平时的一半时间。一旦空闲页面数大于 free_pages_low则核心交换进程的睡眠时间又会延长。 9、小结: 嵌入式Linux是近年来应用的比较广泛的一个实时操作系统,应用于各个行业,而且由于全世界计算机爱好者的支持与厚爱,并且是开放源代码的系统,它也成为世界上发展最快的操作系统。例如在Linux2.6版本的内核中,对存储管理子系统进行了一系列的改进,提高了系统的可扩展性,包含了对大型服务器如NUMA服务器和Intel服务器的良好支持等。此外,Linux2.6还提供了对无MMU的支持。可见Linux正在不断的加强对高端服务器领域以及嵌入式领域的支持。 Linux在其发展过程中不断的在完善和优化内存管理单元的功能和性能。针对具体领域,我们可以根据自己的需要定制Linux内核,而内存管理单元作为Linux操作系统的核心部分,在整个系统的运行过程中发挥着举足轻重的作用。 Linux是当前最具有发展潜力的计算机操作系统,Internet的旺盛需求正推动着Linux的热潮一浪高过一浪。Linux的自由与开源的特性,加上它强大的网络功能,使Linux在21世纪有着无限广阔的发展前景,它必将在未来的世界中发挥更大的作用。 参考文献: 【1】Syed Mansoor Sarwar,Robert Koretsky,Syed Aqeel Sarwar(美)著,李善平等译Linux:THE TEXTBOOK  北京:清华大学出版社,2005; 【2】 李成大 操作系统-Linux篇 北京:人民邮电出版社,2003; 【3】 马忠梅 李善平 康慨 叶楠 ARM&LINUX嵌入式系统教程 北京:北京航空航天大学出版社,2004 【4】 【5】 【6】
本文档为【linux存储器管理分析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_841159
暂无简介~
格式:doc
大小:42KB
软件:Word
页数:0
分类:互联网
上传时间:2019-08-27
浏览量:33