Linux中断、软中断、MMU内存映射-深入理解

嵌入式Linux内核JTAG调试实战:穿越MMU迷雾与动态模块调试 在嵌入式系统开发中,调试是定位和解决复杂问题的核心手段。当系统在引导阶段崩溃或串口无输出时,基于打印或网络的常规调试方法便告失效,此时需要依赖JTAG等底层硬件接口进行深度调试。其原理在于通过调试器与目标处理器直接交互,实现对内存、寄存器的实时访问与控制,从而观察最底层的执行流。这项技术的核心价值在于,它允许开发者在几乎不干扰系统原始状态的前提下,精准诊断从引导加载程序到内核运行期的各类疑难问题,是进行**启动失败分析**和**内核崩溃调试**的终极工具。典型的应用场景包括附着到运行中的U-Boot以调试内 阅读详情

中断:

Linux中,中断上半部不能嵌套,如果一直保存上下文,栈可能会溢出。中断上半部处理紧急事情,下半部处理非紧急事情。下半部通常通过软中断来实现。在上半部执行完后会执行下半部的软中断,如果囤积了A和B的下半部软中断,此时会把两个软中断都一起执行,即处理所有的软中断。因为系统心跳,滴答定时器中断的存在,每过10ms会触发一次硬件中断,即中断上半部,所以软中断一般都能得到及时的执行。内核中用tasklet软中断来处理中断下半部。但下半部若是执行时间过长也不太好,会阻碍系统程序运行,这时候可以把下半部用线程的方式处理,即可worker内核线程。可以再内核中创建一个work线程让他和其他任务一起调度,内部有一个work queue队列,中断上半部把要处理的work即执行函数.fun放入队列中,当worker获取cpu执行权限的时候,就会去执行中断下半部。但这样子只能在单个核上运行,并且前一个work没处理完后影响后一个work,可以通过threaded irq给每个中断的下半部函数创建一个内核线程,发生中断时,内核线程就会执行这个函数。(给每一个中断都创建一个内核线程,给中断irq注册中断服务的request_irq更改为用request_threaded_irq来注册中断的函数,上半部handler完成后,会唤醒内核线程,会去执行线程里运行的下半部函数thread_fn)

通过软件给某一个软件中断的flag=1了,表示这个软件中断产生了,那么这个软件中断的处理就是在处理完硬件中断(上半部)之后,顺便来处理。主要通过检查软件中断数组softirq_veq中有没有某一项的标志位为1,再来执行里面的函数。

工作队列是线程化的处理,而threaded irq是线程化的中断,就更进一步了

内核定时器(软件定时器)

源码位置include\linux\timer.h

定时器属于软件中断,通过定时器结构体timer_list存储定时器的相关信息和状态,初始化一个timer的时候要指定函数和data,在内核中用链表来管理多个定时器。 定时器的创建步骤:先设置一个定时器timer_setup,修改它的超时时间expires,add_timer把该定时器添加进内核里面,修改定时器超时时间可以用mod_timer。内核定时器的时间设置依托于系统滴答(tick)定时器,滴答定时器每隔10ms发生一次,全局变量jiffies就会累加1。内核定时器的值就是依托jiffies变量设定的。比如设置预期时间为jiffies+2,到时间后,内核就会去调用这个timer里面的函数。因为有多个按键,所以每个按键里面都应该有个timer_list结构体,即都有一个timer。对软件中断(软件定时器的使用示例)用于按键消抖,每次按键中断发生时都会刷新定时器的到达时间,只有定时时间到后,即软中断触发后,内核会去调用回调函数读取按键值。定时器使用完成后可用del_timer删除。在硬件中断发生后,系统会去检查软件中断,若有软件中断发生,则会去执行对应的函数。定时器(中断服务函数)也是在中断上下文中执行(中断的下半部),不能休眠,也要尽快返回。软中断不在进程上下文中,即没有进程上下文,无法进行调度操作,也就无法睡眠。

通过定时器timer_list结构体来管理,内部包含设置超时时间expires,回调函数function,传入回调函数的数据data等

按键中断中修改定时器时间

中断下半部:三种方式

硬件中断处理完成后,在返回被中断的程序之间,又会去处理软件中断。(硬件中断和软件中断是多对一的关系)软件中断通常有timer、tasklet等,会有一个softirq[]数组,其中某一个成员是tasklet,会从数组内取出action函数执行,软件中断tasklet对应的函数是tasklet_action,该函数会从某一个队列里取出里面的每一个tasklet结构体执行里面的函数func。 在中断上半部使用tasklet的时候,就是把一个预先设置好的tasklet结构体放入对应的队列(链表)中,处理软件中断时就会从这个链表里把你之前放进来的tasklet取出来,执行里面的函数。使用tasklet_schedule调度tasklet,将其放入链表(也只能执行一次,若要再次执行,则需要再次调度)。

tasklet_action从链表中取出每一项,判断下状态位,执行里面的函数。执行完后,会从链表里把它释放掉。

工作队列的内核线程,会去查看队列(链表)中有无work,有的话则把work一个个取出来执行。实际使用时,(1)需要构建一个work,初始化.func,(2)将work放入队列,并将内核线程唤醒(由schedule_work函数实现)。在2.0的内核中创建workqueue的同时会去每个cpu上创建一个内核线程,但是在哪个cpu上schedule_work会优先使用那个cpu的线程来处理那个work。在4.0的内核中,内核线程和工作队列时分开创建的,每个cpu下会先创建两个work_pool结构体用于管理内核线程,一个对应普通优先级的work,一个对应高优先级的work,之后对每个work_pool创建一个worker,每个worker对应一个内核线程。内核线程创建完成后开始创建工作队列work_queue,会与普通优先级的work_pool建立联系,在给work_queue添加工作的时候,会放入work_pool,放入对应的链表里,唤醒里面的某一个work线程。只有一个worker线程来处理这个work,优先会使用同一个cpu上的worker线程。

工作队列有个缺陷,就是当工作队列中有多个work时,前一个work没处理完会影响后面的work,要等待前一个工作work的完成。此时可以使用中断的线程化处理,下半部用一个内核线程处理,该内核线程专用于这个中断。一方面在多核cpu上时,可以同时运行多个内核线程在不同cpu核上。

MMU内存映射

应用程序不能直接读写驱动程序中的buffer,要在用户态buffer和内核态buffer间进行一次数据拷贝,但大数据传输时效率太低,可以通过mmap(memory map),把内核的buffer映射到用户态,让APP在用户态直接读写。

对于虚拟地址的概念:CPU发出的地址是虚拟地址,经过MMU(Memory Manage Unit)内存管理单元映射到物理地址上,对于不同进程的同一个虚拟地址,MMU会将它们映射到不同的物理地址上。

对于虚拟地址的映射过程:由CPU发出虚拟地址vaddr,MMU根据vaddr[31:20]高位找到一级页表项,段内偏移为[20:0]低位。即可从该表项中取出物理基地址加上偏移量,得到实际访问的物理地址。

由此可知道,我们若是想要给APP新建一块内存映射,给它开辟一块虚拟内存,让它指向某块内核buffer,需要完成以下步骤:(1)得到一块虚拟内存空间(虚拟地址):APP调用mmap时,内核就帮我们完成了(2)确定物理地址:需要由我们来提供(3)确定属性:是否使用cache、buffer(4)给虚拟地址和物理地址建立映射关系:内核中提供函数完成。所以其实mmap就是类似给MMU提供一个虚拟地址和物理地址的页表间的映射关系,下次访问时,由cpu提供虚拟地址,MMU就会通过页表将虚拟地址转换为对应的物理地址,从而实现对物理地址的访问。mmap实际上创建了一个虚拟地址和物理地址之间的映射关系,并通过操作系统内核为此建立了相应的页表。

Linux内核本质:不是操作系统,也不是CPU芯片 内核是运行在Ring 0特权级的系统软件核心,负责CPU调度、内存隔离、设备I/O仲裁和系统调用接口四大职能。它并非操作系统本身(如Ubuntu),也非物理硬件(如CPU芯片),而是一段约25MB的纯软件逻辑镜像(vmlinux)。其‘不可见性’源于用户/内核双地址空间设计——通过x86-64的48位虚拟地址划分与硬件级特权切换(syscall指令),实现进程在用户态与内核态间的无缝上下文迁移。这种架构支撑了高性能系统调用(300–500周期)、DMA零拷贝I/O及安全内存保护(SMAP/SMEP),广泛应 阅读详情

相关推荐

MPC8349EA嵌入式处理器架构解析与实战开发指南

在嵌入式系统设计中,处理器选型是决定项目成败的关键。处理器作为系统的核心,其架构、外设集成度和性能直接影响着网络通信、工业控制等应用的稳定性和效率。从技术原理上看,现代嵌入式处理器通常采用高性能核心、多级流水线和超标量设计,以提升指令执行效率。其价值在于通过高度集成的片上系统设计,将CPU、内存控制器、网络接口、总线扩展和安全引擎等功能模块整合,从而简化硬件设计、降低系统复杂度。这种集成化方案广泛应用于路由器、交换机、网络存储和工业控制设备等场景。本文聚焦于飞思卡尔PowerQUICC II Pro家族的经

dfuw13072的博客 479

Linux内核笔记之中断映射

硬中断和虚拟中断号在Linux 内核笔记之高层中断处理一文中,介绍了ARM gic中断控制器对于硬中断的处理过程。gic的中断处理程序是从ack一个硬件中断开始的, 在gic的中断处理过程...

Peter的专栏 1269

嵌入式系统启动全解析:从Bootloader源码到固件升级实战

在嵌入式系统开发中,系统启动流程是连接硬件与软件的关键基础。其核心在于Bootloader,它作为系统上电后执行的初始软件,负责初始化硬件、建立运行环境并加载最终应用程序或操作系统。从原理上看,Bootloader通常采用多级引导架构,例如一级ROM Code完成最基础的硬件初始化,二级Bootloader(如SPL)则负责初始化外部内存等复杂硬件,为后续完整引导程序(如U-Boot)的运行铺平道路。这一过程的技术价值在于确保了系统从冷启动到应用运行的可靠性与灵活性,是嵌入式设备稳定工作的基石。其应用场景广

weixin_34204722的博客 594

ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

DMA地址翻译的过程和虚拟地址翻译的过程是完全一致的,唯一不同的地方在于MMU地址翻译是将进程的虚拟地址(HVA)翻译成物理地址(HPA),而IOMMU地址翻译则是将虚拟机物理地址空间内的GPA翻译成HPA。IOMMU页表和MMU页表一样,都采用了多级页表的方式来进行翻译。

RToax 2万+

深入解析NXP LS1046A SEC安全引擎:性能计数器与CTPR寄存器实战指南

硬件安全引擎是现代嵌入式处理器实现高效安全处理的核心组件,它通过专用硬件电路对加密、解密、认证等计算密集型操作进行加速,从而将CPU从繁重的软件算法中解放出来。其基本原理是将安全协议处理任务卸载到集成了多种算法加速器的专用硬件模块上,通过描述符机制进行任务调度。这项技术的核心价值在于能极大提升系统吞吐量并降低CPU占用与处理延迟,是构建高性能、高可靠网络设备(如网关、防火墙、VPN设备)数据平面的关键技术。在实际的工程实践中,开发者需要深入理解安全引擎的内部状态监控与能力配置机制,这正是NXP QorIQ

weixin_33762130的博客 349

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

SMMUv3(2)

流的编号 做一次转换需要地址、size以及相关属性如读/写/安全域/非安全域/可共享性/可缓存性;如果超过1个client设备使用SMMU流量,那么他们还要有StreamID来区分;StreamID在系统里的构建传送是具体实现决定的,逻辑上讲,一个StreamID就关联到一个发起转换的设备。物理设备到StreamID的映射必须描述给系统软件,ARM推荐StreamID用密集命名空间,从0开始;每...

ytfy339784578的专栏 3924

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 469

记录一个软中断问题

前些天发现XEN虚拟机上的Nginx服务器存在一个问题:软中断过高,而且大部分都集中在同一个CPU,一旦系统繁忙,此CPU就会成为木桶的短板。 在问题服务器上运行「top」命令可以很明显看到「si」存在异样,大部分软中断都集中在 1 号CPU上,其它的CPU完全使不上劲儿: she...

chimanjiao0842的博客 678

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3268

EtherCAT总线运动控制学习笔记(RXXW_Dor)

说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基本一致,下面我们简单认识下上面是对象字典。

RXXW_Dor的博客 5433

深入理解linux内核 书

第一章 绪论。操作系统,文件系统,linux介绍。单内核与微内核(VxWorks,微内核通常包含几个同步原语,一个简单调度程序和进程间通信机制,运行在微内核之上的几个系统进程实现如内存分配,设备驱动程序,系统调用等操作系统级功能。)linux采用模块来弥补。 内核本身不是一个进程,而是进程的管理者。除用户进程之外,unix系统还包括几个所谓内核线程的特权进程,其特点是:1以内核态运行在内核地址空

haokaihaohe110的专栏 780

加权均值向量算法(INFO)详解:从数学原理到智能算法

本文系统介绍了加权均值向量算法(INFO)的理论基础、数学模型与实现应用。该算法基于加权均值数学概念,通过MeanRule规则平衡探索与开发能力,具有结构新颖、参数合理的特点。核心内容包括:1) 算法理论基础,阐述加权均值数学定义与小波函数权重计算;2) 算法原理,详细解析更新规则、向量组合和局部搜索三阶段数学模型;3) 实现方法,提供MATLAB代码关键参数解析;4) 改进方向,介绍INFO-KELM混合模型等变体;5) 应用案例,涵盖函数优化、工程设计与机器学习领域。

qq_42212808的博客 235

《Linux内核设计与实现》——总结笔记

Linux内核简介 从内核出发 进程管理 进程调度 系统调用 内核数据结构

Embedded_Sky77的博客 1285

YOLOV5 自动刷图脚本实战(十五)之如何找到正确的门

DXF是一个2D游戏,我们所看到的人物移动,其实是后面的背景在移动,我们所看到的画面,不过是一个完整背景中的一个镜头视角而已想要正确找到门的坐标,我们需要对不同的地图中的每个房间做一些配置信息。

qq_38892949的博客 2812

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

linux系统编程之基础必备(一):计算机体系结构一点基础知识

无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为内存映射I/O(Memory-mappedI/O)。但是x86比较特殊,x86对于设备有独立的端口地址空间,CPU核需要引出额外的地址线来连接片内设备(和访问内存所用的地址线不同),访问设备寄存器时用特殊的in/out指令(汇编),而不是和访问

Meditation 6491

应用商店评论分析实战:Python逆向工程破解Google Play加密接口与NLP建模

在移动互联网时代,应用商店中的用户评论成为了开发者优化应用、提升用户体验的重要依据。然而,Google Play等应用商店对评论数据进行了加密处理,直接爬取难度较大。本文将介绍如何使用Python逆向工程破解Google Play的加密接口,实现对应用商店评论的实时采集,并结合NLP(自然语言处理)技术进行情感分析和主题建模,为开发者提供有价值的数据支持。

u014481728的博客 1349

《Linux设备驱动程序》(第三版)的详细目录

本书的目标本书的组织结构本书的约定排版约定代码约定本书使用的内核版本获得帮助反馈1.1 什么是设备驱动程序1.1.1 驱动程序的角色1.1.2 字符设备、块设备和网络设备1.2 为什么要写驱动程序1.2.1 为新硬件写驱动程序1.2.2 访问内核服务1.2.3 与内核开发者交流1.3 设备驱动程序的模块形式1.3.1 什么是内核模块1.3.2 模块的优点1.4 为什么要关心内核版本1.4.1 内核版本号1.4.2 内核版本的差异。

qq_40844444的博客 1135

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

树莓派2移植RT-Thread实战:从零构建BSP与驱动开发

实时操作系统(RTOS)是嵌入式领域的核心技术,它通过确定性的任务调度和中断响应,为对时间敏感的嵌入式应用提供可靠保障。RT-Thread作为一款开源、可裁剪的RTOS,其设计哲学强调轻量、实时与模块化,在物联网、工业控制等场景中具有重要价值。掌握RTOS移植是嵌入式开发者进阶的关键,这要求深入理解ARM Cortex-A系列处理器的体系结构、启动流程与内存管理。本文将结合树莓派2这一经典硬件平台,详解如何从零开始构建BSP(板级支持包),包括启动代码编写、系统定时器配置、串口驱动实现等核心环节,并分享在移

weixin_30239339的博客 293

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MPC8568E处理器深度解析:架构、外设配置与嵌入式开发实战

在嵌入式系统与网络设备开发领域,片上系统(SoC)是实现高性能、高集成度解决方案的核心。其设计原理在于将处理器核心、内存控制器及多种专用硬件加速单元集成于单一芯片,通过内部高速互连架构实现数据并行处理,从而在确定性实时响应和高带宽数据交换方面展现独特技术价值。这类处理器广泛应用于工业网关、网络路由器及通信设备等场景。以MPC8568E为例,其基于Power Architecture e500核心与PowerQUICC III架构,集成了网络加速引擎、高速互连接口及硬件安全模块。开发者需深入理解其缓存机制、外

liudaoru - 悟 430

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入理解x86架构下的进程与执行环境:从虚拟内存到系统调用

在计算机系统中,进程是操作系统进行资源分配和调度的基本单位,它运行在特定的执行环境中。理解进程与执行环境的核心在于掌握虚拟内存管理机制,这涉及到x86架构的保护模式、分页机制以及内存管理单元(MMU)的工作原理。虚拟内存通过页表将进程的虚拟地址空间映射到物理内存,实现了进程间的隔离与保护,这是现代操作系统稳定性的基石。从技术价值来看,这种机制不仅确保了数据的安全性和一致性,还支持了高效的多任务处理。在实际应用场景中,无论是开发、调试还是系统运维,都会遇到进程占用资源导致的“拒绝访问”等问题,例如在Windo

weixin_34279246的博客 265

MPC8315E eTSEC以太网控制器驱动开发实战指南

以太网控制器是嵌入式网络设备实现数据通信的核心硬件模块,负责在物理层与数据链路层之间进行数据帧的封装、发送与接收。其工作原理基于DMA(直接内存访问)机制和缓冲区描述符环结构,硬件通过描述符环与驱动软件协同,实现高效、零拷贝的数据搬运,这对系统实时性和吞吐量至关重要。在资源受限的嵌入式场景中,以太网驱动的稳定性和性能直接影响设备的联网能力与可靠性。本文以恩智浦MPC8315E处理器的增强型三速以太网控制器(eTSEC)为例,深入剖析其MAC核心、DMA引擎及中断系统的配置流程,详解缓冲区描述符环的构建与内存

chuncui2576的博客 356

MPC8560 CPM通信引擎:架构解析与驱动开发实战指南

在嵌入式通信系统设计中,协处理器是提升整体性能、实现确定性实时响应的关键技术。其核心原理在于通过专用硬件模块分担主处理器的通信协议处理负载,实现任务并行化。这种设计带来了显著的技术价值:它通过硬件集成降低了系统复杂度与功耗,并通过微码优化确保了高吞吐量与低延迟。在路由器、交换机、基站控制器等高密度通信设备中,协处理器是实现多协议支持与高可靠性的基石。本文聚焦于MPC8560 PowerQUICC III处理器的通信处理器模块,深入剖析其作为独立RISC微控制器的架构设计,并详解如何通过双端口RAM与缓冲区描

banyinlve3147的博客 364

从原理到实战:Linux 系统性能诊断核心指标全解析及生产系统故障分析复盘

本文就对Linux操作系统诊断的相关知识进行系统梳理,CPU的原理(Interuption, IO Wait, User time, System time...), Memory的组成和工作原理(Free/Available, Slab, Page Cache/Buffer, Swap, mmap, Page Table),Disk(mmap), 同时,结合我们遇到的欣赏系统问题,进行极其详尽的分析复盘,以展现我们在系统问题分析诊断过程中的方法和思路。 读完本文,我们将获得系统层面诊断的扎实而全面的技能。

小昌昌的博客 432

操作系统核心机制:从进程内存到文件系统的工程实践指南

操作系统作为计算机系统的核心,通过进程管理、内存管理和文件系统三大抽象机制,为应用程序提供稳定高效的运行环境。进程管理实现了多任务并发执行,虚拟内存机制通过页表映射和缺页异常处理,为每个进程提供独立的地址空间和内存保护。文件系统则通过VFS抽象层和inode/dentry结构,统一管理存储设备。这些机制共同构成了系统调用的基础,使应用程序能够安全地访问硬件资源。在工程实践中,深入理解这些原理对于排查内存泄漏、解决文件系统挂载失败、优化程序性能以及处理跨平台兼容性问题至关重要。掌握strace、Valgrin

weixin_33847182的博客 388
上一篇: Linux中断-实操、概念
下一篇: 奔跑吧Linux内核(入门篇)- 心得笔记总结
ZHU~.
博客等级 码龄7年 194粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值