[操作系统] 虚拟内存

虚拟内存(深入了解计算机系统) 文章目录1.物理和虚拟寻址1.1 物理寻址1.2 虚拟寻址2.虚拟内存作为缓存的工具2.1 DRAM 缓存的组织结构2.2 页表2.3 页命中2.4 缺页2.5 分配页面3 虚拟内存作为内存管理的工具4 虚拟内存作为内存保护的工具5 地址翻译5.1 结合高速缓存和虚拟内存5.2 利用TLB加速地址翻译5.3 多级页表5.4 深入理解端到端的地址理解(示例)6. Linux 虚拟内存系统6.1 Linux 缺页异常处理7 内存映射7.1 共享对象7.2 fork函数7.3 execve函数7.4 mmap函数 阅读详情

虚拟内存



1. 什么是虚拟内存

每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

2. 为什么要使用虚拟内存

尽管上一篇文章中提到的基址寄存器和界限寄存器可以用于创建地址空间的抽象。但是并没有考虑到应用程序与内存的发展。在现有情况下,需要运行的程序很可能大到内存无法容纳。所以便诞生了虚拟内存。

3. 分页

大部分虚拟内存系统都使用了分页的技术。在程序中,所产生的地址称为虚拟地址,它们构成了一个虚拟地址空间。在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作使用具有同样地址的物理内存字;而在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(MMU),并通过它把虚拟地址映射为物理内存地址。

分页

如图中的例子,有一台可以产生16位地址的计算机(2^16B),地址范围从0~64KB,这些地址都为虚拟地址。另外这台计算机只有32KB的物理内存。假如一个程序大小为64KB,虚拟内存可以容纳64KB的程序,但是因为大于物理内存的实际容量,所以这个程序并不能完全调入内存运行(磁盘上会有一个该程序的64KB副本,在需要时要被调入到内存中)。

虚拟地址空间按照固定大小划分成叫做页面的若干单元。在物理内存中与之对应的大小相等(通常情况下)的单元称为页框。在这个例子中为4KB,所以我们可以得到16个虚拟页面和8个物理内存中的页框。我们要记住内存与磁盘的交换总是以整个页面为单位执行的。

标记0K~4K的页面的虚拟地址为0~4095,相应的标记0K~4K的页框则表示它的物理地址为0~4095。当程序试图访问地址0时,执行一条带有该地址的指令,然后将该**虚拟地址**0送到MMU。MMU看到虚拟地址在页面0(因为页面0的虚拟地址范围是0~4095),根据映射结果(即图中页面里的数字),这一页面对应的是物理内存中的页框2(物理地址范围8192~12287),因此MMU该指令的地址变为8192。内存对MMU的存在一无所知,只是得到了访问地址8192的命令,从而MMU有效的将虚拟地址0映射成了物理地址8192。

上述例子中我们用的是页面的起始地址,如果我们想要访问虚拟地址20,过程也是一样的。只不过需要一个偏移量而已。MMU发现该虚拟地址在页面1,距离起始地址0的偏移量为20。并且发现对应的页框是2。MMU找到页框2的其实地址8192,然后加上偏移量地址就变成了8212。

到此,我们解决了如何将虚拟地址映射到物理地址的问题,但并没有解决虚拟内存大于物理内存的问题。如果程序想要访问的虚拟地址是32780(在虚拟页面8中,页面8的起始地址为32768)该怎么办?我们可以看到该页面中的标志是”X”,并不是对应的页框号,这表明该页并没有被映射,在实际的硬件中,用一个“在/不在”位来记录是否被映射的状态。

MMU发现该页面没有被映射,于是使操作系统陷入到操作系统,这个陷阱称为缺页中断。操作系统在物理内存中找到一个很少使用的页框,并把它写回到磁盘上。随后把需要访问的页面读到刚才被回收的页框中,修改映射关系然后重新启动引起陷阱的指令。假如操作系统决定回收页框1,需要对MMU映射做两处修改。首先将虚拟页面1改为位映射(因为回收前该页面映射到页框1),然后将虚拟页面8的”X”改为1。完成后,MMU就将虚拟地址32780(32K+12)映射到物理地址4108(4K+12)。

4. MMU如何工作

MMU工作原理

该图显示了在16个4KB页面情况下MMU的内部操作。

该图中虚拟地址为0010000000000100(对应10进制的8196),该16位地址被分为:

  1. 高4位的页号:0010(对应10进制的2)
  2. 低12位的偏移量:000000000100(对应10进制的4)

使用4位页号因为足以表示0~15这16个页面,12位的偏移量可以表示一页内全部4096个地址。页号可以作为页表的索引并以此得出对应于虚拟页面的页框号。该例中,可以找到对应的虚拟页面为0010即10进制的2,发现”在/不在”位为1,即该页面存在映射且映射的值为110。将该值复制到输出寄存器的高三位,加上虚拟地址中低12位的偏移量即得到物理地址1100000000000100。

要注意的是,使用其他位数来表示页号也是可以的,不同大小对应不同页面大小。

5. 页表

页表的目的是把虚拟页面映射为页框。从数学角度来说,页表是一个函数,它的参数是虚拟页号,结果是物理页框号。通过这个函数可以把虚拟地址中的虚拟页面替换为页框,继而得到物理地址。

页表项的结构(不同机器并不相同):

  1. 页框号:最重要的域,因为页映射的目的就是找到该值。
  2. 在/不在位:该项表示映射是否存在。该位是0就表示对应的虚拟页面不在物理内存中,访问该页面会引起缺页中断。
  3. 保护位:指出一个页允许什么类型的访问。例如,0表示允许读/写,1表示只读。
  4. 修改位:如果一个页面在内存中被修改过,则必须写回磁盘。如果未被修改过,则可以不写回。因为是从磁盘中读入内存的,所以磁盘中存在它的有效副本。这一位经常被称为脏位。
  5. 访问位:用来帮助选择要被淘汰的页面。
  6. 禁止高速缓存位:对于那些映射到设备寄存器(针对I/O设备)而不是常规内存内的页面,非常重要。例如,一个I/O设备要对操作系统作出响应,如果从高速缓存中读取副本,可能是过时的副本。

6. 分页式系统中的问题

在分页式系统中,我们需要考虑两个问题

  1. 虚拟地址到物理地址的映射必须非常快。因为每次访问内存,都需要进行映射。所有的指令最终都必须来自内存,并且很多指令也会访问内存中的操作数。

  2. 如果虚拟地址空间很大,页表也会很大。计算机至少使用32位的虚拟地址,而现在大多数位64位。假设页长为4KB,32位的地址空间对应的大小是4,194,304KB,即需要100万页,那么页表需要100万条页表项。另外,每个进程都有自己的地址空间,即每个进程都有自己的页表。

所以我们需要采用下面提及的一些方法

7. 加速分页过程

加速分页过程可以解决映射速度较慢的问题。

1. 转换检测缓冲区

假设一条指令要把一个寄存器中的数据复制到另一个寄存器。在不分页的情况下,这条指令访问一次内存,即从内存中取指令。而有了分页后,因为要访问页表引起多次访问内存,这样必定会影响性能。

研究者发现,大多数程序总是对少量的页面进行多次访问。因此实际上只有很少的页表项会被反复读取。解决方法是使用一种硬件设备称为转换检测缓冲区(TLB),可以将虚拟地址直接映射到物理地址,而不必再访问页表,有时这种设备也被称为相联存储器。它通常在MMU中,包含少量的表项。每个表项记录一个页面的信息(包含虚拟页号、修改位、保护位、和对应的页框),每一项与页表中的域一一对应,但增加了虚拟页号(页表中可以没有)和有效位,记录表项是否在使用。

TLB

工作原理:将一个虚拟地址放入MMU进行转换,硬件首先通过将该虚拟页号与TLB中所有表项进行匹配,如果虚拟页面在其中,且要进行的访问不违反保护位。则将页框号直接从TLB取出,而不必访问页表。如果不符合保护位,则产生保护错误。当虚拟页号不在TLB中时(失效)。则进行正常的页表查询,然后从TLB中淘汰一个表项,并使用新的页表项代替。当一个表项从TLB被清除时,将修改位复制到内存中的页表项,除了访问位,其他值不变。当页表项从页表装入到TLB时,所有值都来自内存。

2. 软件TLB管理

当发生TLB实效时,不再是由MMU到页表中查找并取出需要的页表项,而是生成一个TLB失效并将问题交给操作系统解决。系统必须先找到该页面,然后从TLB中删除一个项,接着装载一个新的项,最后在执行先前出错的指令。

无论是使用硬件还是软件来处理TLB失效,常见方法都是找到页表并执行索引操作以定位要访问的页面。用软件代替硬件找到页表并执行索引操作以定位将要访问的页面。这样产生的问题是,页表可能不在TLB中,会导致处理过程中额外的TLB失效。采用的解决方法是可以再内存中的固定位置,维护一个大的TLB表项的软件高速缓存(该高速缓存的页面总是被保存在TLB中)来减少TLB失效。

两种不同的失效:

  1. 当一个页面访问在内存中而不再TLB中时,会产生软失效。此时要做的是更新TLB,不需要磁盘I/O。
  2. 当页面本身不在内存中,则产生硬失效,此时需要一次磁盘存取以装入该页面。

7. 针对大内存的页表

如何处理巨大的虚拟地址空间

1. 多级页表

多级页表

在上图的例子中,32位的虚拟地址被划分为10位的PT1域,10位的PT2域和12位的偏移量。因为偏移量(Offset)为12位,所以对应的页面长度为2^12B,即4KB,共有2^20个页面。

引入多级页表的原因是避免把全部页表一直保存在内存中。特别是那些从不需要的页表。例如,一个需要12MB内存的进程,最底端为4MB程序正文段,然后是4MB的数据段,顶端是4MB的堆栈段,在数据段上方和堆栈段下方是大量没有使用的空闲区。

在图示的例子中,针对一个4GB(32位地址对应的大小)大的虚拟地址空间,用一个具有1024个表项的顶级表。并用PT1域的值对应,这时虚拟空间会被分为1024个4MB的空间,即顶级表中每一个表项对应的是一个4MB的空间。

顶级表的表项0指向程序正文的页表,表项1指向数据页表,表项1023指向堆栈页表,其他表项没有使用。PT1的值作为顶级表的索引,PT2的值作为二级页表的索引。

假如,有一个32位虚拟地址0x00403004(对应10进制的4,206,596),位于数据部分12292字节处。通过该虚拟地址的2进制0000 0000 0100 0000 0011 0000 0000 0100可得,PT1=1,PT2=3,Offset=4。

先用PT1作为索引访问顶级页表中的表项1,则地址范围为4MB~8MB。然后使用PT2作为索引访问对应4MB~8MB的二级页表,应为表项3,虚拟地址范围应是12288~16383绝对地址此时为(4MB+12288~4MB+16383 = 4206592~4210687)把该值加上偏移量4,则为实际的物理地址4206596。

在该方法中,实际只需要4个页表,顶级页表,正文段(0~4MB),数据段(4~8MB),堆栈段(顶端4MB)的二级页表。顶级表中其他1021个表项的”在/不在位都设为0”,访问它们时强制产生缺页中断。操作系统应该采取行动,如杀死进程。

可以将二级页表扩充为三级、四级、甚至更多级。级别越多,灵活性越大,但会增加复杂性。而且,此方法对于64位的机器并不友好,所需要页表太大,可使用下面的方法。

2. 倒排页表

实际物理内存中每一个页框有一个表项,而不是每一个虚拟页面有一个表项。例如,对于64位虚拟地址4KB的页,1GB内存,一个倒排页表只需要262144个页表项 (1GB/4KB)。可以节省大量空间(当虚拟内存比物理内存大的时候)。

但是从虚拟地址到物理地址的转换很困难。当进程n访问虚拟页面p时,硬件不再能通过把p当做索引来查找物理页框。取而代之,必须搜索整个倒排表来查找一个表项(n, p)。此外,该搜索必须对每一个内存访问操作都要执行一次,而不仅仅是在发生缺页中断时执行。

可以使用TLB解决,记录频繁使用的页面,地址转换就可能变的和正常页表一样快。但是当TLB失效时,需要搜索整个倒排表。一个解决方法是,可以为此建立一张散列表,使用虚拟地址来散列。当前所有在内存中具有相同散列值的虚拟页面被链接在一起。如果散列表中的槽数和物理页面数一样多,那么散列表的冲突链的平均长度会是1个表项。一旦页框号被找到,新的(虚拟页号,物理页框号)对就会被装载到TLB中。

参考书目:现代操作系统第三版

操作系统课设--虚拟内存 山东大学操作系统课设lab7实验七 虚拟内存(lab7)实验目的实验环境实验思路调试记录 实验七 虚拟内存(lab7) 实验目的 在未实现虚拟内存管理之前,Nachos在运行一个用户进程的时候,需要将程序运行所需所有内存空间一次性分配。虚拟内存实现将突破物理内存限制。本实验核心任务为根据理论学习中涉及的兑换技术,设计并实现用户空间的虚拟内存管理。 实验环境 虚拟机下Ubuntu Linux 16.... 阅读详情

相关推荐

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1203

虚拟内存详解

CASPP之虚拟内存

qq_45335146的博客 1万+

分享一下如何使用labelimg制作自己的YOLO数据集

首先准备一下自己的下准备一个空文件夹用于保存标签文件,如下图所示。

skywalkerxhx的博客 831

虚拟内存

一 局部性原理 (1) 时间局部性: 如果程序中的某条指令被执行,不久以后该指令可能再次被执行。 (2) 空间局限性: 一旦程序访问了某个存储单元,不久以后,其附近的存储单元也将被访问。 二 虚拟内存特征 每个进程都有自己的虚拟地址空间。 虚拟内存技术的核心就是利用了局部性原理,把所要运行的进程中的数据不全部加载到内存中执行,而是加载一部分。 三 虚拟内存技术的实现 https:...

SECURE2的博客 323

基于live555实现一个rtsp客户端程序

本文介绍了基于live555流媒体库实现的RTSP客户端程序,能够通过RTSP地址获取H.264/H.265裸码流或TS流数据并存入本地文件。详细阐述了使用CLion搭建工程的代码架构和CMake配置,重点分析了TS流解析模块的实现,包括TS包结构解析、PES包提取和ES裸流获取的完整流程。文章提供了TS/PES/ES三种数据包的协议说明,并给出了从TS流中提取视频帧的具体方法,最后附有工程代码下载链接。该方案实现了RTSP流媒体接收、解析和存储的完整功能链。

kk821521286的博客 789

逆向CarPlay协议时,除了USB主从切换,你还需要注意这3个关键点

本文深入探讨逆向CarPlay协议时的3个关键点,包括MFi协议背景、多通道协同工作机制和协议分析工具的高级过滤技巧。特别解析了USB主从切换后的复杂交互过程,帮助安全研究员和逆向工程师更好地理解CarPlay协议的核心机制与潜在安全研究切入点。

weixin_29164497的博客 381

操作系统—虚拟内存详解

虚拟内存、物理内存、内存分段、内存分页、虚拟内存优点等

拥抱技术 1278

Python实现将pdf,docx,xls,doc,wps,zip,xlsx,ofd链接下载并将文件保存到本地

本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps等链接。需要你使用python自动将页面上含有的这些信息链接下载并保存到指定文件夹。遇到这种情况需要怎么做呢?别担心,跟着笔者直接往下看正文的详细解决方法。(附完整代码)在有些网页的正文中,有时会有如下图中的doc链接。比如爬虫在采集正文数据的时候,像标题,正文内容,作者,发布时间等等

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 4145

初识虚拟内存

虚拟内存(Virtual Memory)是一种计算机内存管理技术,它使得应用程序认为它们拥有连续的可用内存(一个大的地址空间),即使实际上可能被分散在物理内存和磁盘存储中。虚拟内存通过地址映射机制将程序使用的虚拟地址转换为物理地址,从而使得计算机系统可以更高效地利用内存资源。分段(Segmentation)优点逻辑单元管理:每个段可以表示一个逻辑单元(如代码段、数据段、堆栈段),有助于程序结构化灵活的大小:段的大小是可变的,可以根据实际需要进行分配,减少内存浪费。

小楠的博客 1916

基于STM32、HAL库的MICRF112YMM-TR 无线收发器驱动程序设计

内部集成了 VCO、PLL、PA、LNA、混频器、滤波器等射频功能单元,极大减少了外部元件数量,降低了设计和布线难度。: 具有多种工作模式(睡眠、待机、接收、发射),待机电流极低,非常适合电池供电的物联网(IoT)设备。是 Microchip 公司生产的一款高性能、低功耗的单片 UHF ASK/FSK 收发器芯片。: 支持 ASK (幅移键控) 和 FSK (频移键控) 调制,适应不同应用需求。// 可以添加其他配置参数,如中心频率、数据速率等。智能家居(安防、遥控、传感)远程钥匙进入系统 (RKE)

corlin6688的博客 415

【教程4>第5章>第28节】基于帧同步+相位同步+位同步的QPSK调制解调通信系统整体性能分析

综上所述:1.SNR<10db时,整体性能下降,当SNR=0db时,系统无法正常工作。2.gardner环性能达到2.5e-5时偏可以正常工作,增加之后无法正常工作。3.当相位偏差大于pi/4的时候,对最后的性能会有一定影响。

FPGA/MATLAB学习教程/源码/项目合作开发 556

操作系统—虚拟内存

操作系统为每个进程分配独立的一套「地址」,人人都有,大家自己玩自己的地址就行,互不干涉。操作系统会提供一种机制,将和不同内存的物理地址映射起来。如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。

2302_80434765的博客 937

QT如何使用CTK插件搭建应用程序框架?

CTK框架,QT框架,插件系统

cs821984831的博客 735

为什么操作系统需要虚拟内存

操作系统中的 CPU 和主内存(Main memory)都是稀缺资源,所有运行在当前操作系统的进程会共享系统中的 CPU 和内存资源,操作系统会使用 CPU 调度器分配 CPU 时间并引入虚拟内存系统以管理物理内存,本文会分析操作系统为什么需要虚拟内存。 在回答虚拟内存存在的必要性之前,我们需要理解操作系统中的虚拟内存是什么,它在操作系统中起到什么样的作用。正如软件工程中的其他抽象,虚拟内存是操作系统物理内存和进程之间的中间层,它为进程隐藏了物理内存这一概念,为进程提供了更加简洁和易用的接口以及更加复杂的

gcs的博客 2883

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

操作系统中的虚拟内存详解

https://blog.youkuaiyun.com/dan15188387481/article/details/49536317 操作系统中的内存管理技术是十分复杂的。现在的操作系统基本都使用逻辑地址和物理地址这两个概念。简单来说,逻辑地址就可以理解为虚拟地址,这个地址是让用户,也就是我们使用者看的,这个地址是虚拟的,并不真实存在,但是经过硬件和软件的配合,将逻辑地址映射到硬件中实实在在的物理地址上,...

wang13342322203的博客 3570

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

操作系统虚拟内存

虚拟内存是操作系统对进行内存空间地址进行管理的一套精心设计的逻辑层面的内存空间概念在32位系统下,操作系统规定给每个启动的进程拥有4G大小虚拟内存,但是这4G的虚拟内存不能直接使用的,其实就是系统给进程画的饼,当进程真正要存储数据需要使用内存时,系统会把一部分虚拟内存与物理内存进行映射,必须进行映射后的虚拟内存才能正常使用如果非要使用没有映射过的虚拟内存,操作系统一定会在运行时产生段错误。

zzt_is_me的博客 727

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

操作系统——虚拟内存

本文的主要内容是操作系统中虚拟内存的基础知识,包括虚拟内存的基本概念、请求分页管理方式、页面置换算法以及页面分配策略,对比理解记忆请求分页管理方式与一般分页管理方式的不同,重点掌握五种页面置换算法的思想以及页面分配策略中的内容。

西岸贤 5018

操作系统面试——虚拟内存

操作系统面试——虚拟内存

qq_36243414的博客 2947

六:操作系统虚拟内存之虚拟内存概念

虚拟内存是操作系统提供的一种抽象(Abstraction)。它给每个进程提供了一个独立、连续且巨大的地址空间,称为虚拟地址空间。这个空间的大小通常远大于实际的物理内存。程序中使用的地址。程序看到的内存范围是从 0 到某个非常大的值(例如,在 64 位系统上可达 2^64)。实际硬件内存(RAM)的地址。将程序的虚拟地址空间映射(Mapping)到物理内存空间。这种映射是由操作系统和硬件(主要是内存管理单元,MMU - Memory Management Unit)共同完成的。

柳絮飘扬 1185

操作系统:虚拟内存

虚拟内存是计算机系统内存管理的一种技术,它允许程序在运行时使用比物理内存(RAM)更多的地址空间。虚拟内存通过将物理内存与磁盘空间结合使用,创建了一个大得多的虚拟地址空间,从而提高了内存使用的灵活性和效率。

坚定目标,超越自我 792

操作系统-虚拟内存篇

内存交换的本质如下,a和b两个段之间有100m空间碎片无法被利用,将b传入磁盘再重传内存中,重传的时候直接紧跟a后面实现,对于这个内存交换空间也成为Swap空间,是从磁盘划分出来用于磁盘和内存的空间交换。不过内存碎片分为外部内存碎片和内部内存碎片,对于分段来说,是按程序大小分配的段空间,一般不存在内部内存碎片,只会存在外部内存碎片,也就是段段之间的空间无法再分配导致浪费的情况。分页的映射实际上是和分段差不多的,不过做了优化,由于页很小,因此页数是很多的,如果做一一映射会导致大量内存用来存储页表。

小泽的博客 1074

操作系统--虚拟内存

操作系统--虚拟内存

每日提升一点点 187

浅谈虚拟内存(操作系统、Redis)

虚拟内存(Virtual Memory)是操作系统的一种内存管理技术,它允许程序运行时使用比物理内存更大的地址空间。通过虚拟内存,操作系统能够提供一种“虚拟”内存的抽象层,使得每个进程可以使用一个连续的地址空间,而不必关心实际物理内存的布局。扩展内存:程序可以运行在比物理内存大的虚拟地址空间中。内存隔离:不同进程之间的地址空间互不干扰,提升系统安全性和稳定性。内存管理:通过分页机制,优化物理内存的使用效率,减少碎片。

frozenpenguin的博客 1020
上一篇: [操作系统] 地址空间和交换技术
下一篇: [操作系统] 页面置换算法(一)
LLLZHLIU
博客等级 码龄10年 19粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值