核心态和用户态

探索操作系统的核心:用户态与核心态的深度解析 在现代操作系统中,用户态和核心态是实现系统安全和效率的核心机制。用户态负责运行应用程序,受限于访问权限;而核心态则拥有最高权限,管理系统资源和硬件设备。本文将深入探讨这两个状态的定义、作用及其切换机制,帮助您更好地理解操作系统的基本原理。快来一起揭开操作系统内部的神秘面纱吧! 阅读详情

386及以上的CPU实现了4个特权级模式(WINDOWS只用到了其中两个),其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,象DOS这种实模式操作系统则没有这些概念,其中的所有代码都可被看作运行在核心态。既然运行在核心态有如此之多的优势,那么病毒当然没有理由不想得到Ring0。处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。具体的转移细节由于涉及复杂的保护检查和堆栈切换,不再赘述,请参阅相关资料。现代的操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令来完成模式切换,在INTEL X86上这条指令是INT,如在WIN9X下是INT30(保护模式回调),在LINUX下是INT80,在WINNT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求并将结果传给用户程序。 一,中断处理过程硬件中断:来自时钟,外设可编程中断:programmed interrupt,执行引起软件中断的指令。例外中断:如页面错。都由系统负责处理。当发生一个中断时,如果CPU正在比该中断级低的处理机运行级上运行,它就在解码下条指令之前,接受该中断,并提高处理机运行级。内核处理中断的操作顺序如下: 1,对于正在进行的进程,保存其当前寄存器上下文,并创建压入一个新的上下文层。 2,确定中断源,识别中断类型。如是时钟或磁盘的。 3,查找中断向量。当系统接受一个中断时,它从机器中得到一个数,系统把这个作为查表的偏移量。这个表通常成为中断向量(interrupt vector)。中断向量的内容包括各种中断源的中断处理程序的地址,以及中断处理程序取得参数的方式。 4,内核调用中断处理程序。 5,中断处理程序执行那个返回,恢复(弹出)前一上下文层。二,软中断软中断通知进程发生了异步事件。系统有个进程表,每个进程在进程表中有有个进程表项,每个进程表项有个软中断信号字段,纪录发向一个进程的所有未处理的软中断信号。当一个进程即将从核心态返回到用户态时,或它要进入或离开一个适当的低调度优先级时,内核要检查它是否收到了一个软中断信号。内核仅当一个进程从核心态返回到用户态时才处理软中断信号。三,系统调用我们在C程序中调用系统调用好像是个一般的函数调用,当实际上调用系统调用会引起用户态到核心态的状态变化,这是怎么做到的呢?原来,C编译程序采用一个预定义的函数库(C之程序库),其中的函数具有系统调用的名字,从而解决了在用户程序中请求系统调用的问题。这些库函数一般都执行一条指令,该指令将进程的运行方式变为核心态,然后,使内核开始为系统调用执行代码。我们称这个指令为操作系统陷入(operating system trap)。系统调用的接口是一个中断处理程序的特例。在处理操作系统陷入时, 1,内核根据系统调用号查系统调用入口表,找到相应的内核子程序的地址。 2,内核还要确定该系统调用所要求的参数个数。 3,从用户地址空间拷贝参数到U区(Unix V)。 4,保存当前上下文,执行系统调用代码。核心态:当CPU正在运行内核代码时(内核代码是共享的)。用户态:当CPU正在运行用户代码时。用户模式:不可以访问内核空间(>=0x80000000) 内核模式:可以访问任何有效虚拟地址,包括内核空间。一个线程可以访问其他任何线程地址空间。 WINCE下内核模式和用户模式有什么区别? 为了使读者能够详细了解WINCE的地址映射原理还有两种模式,在这里我分几个部分说明: WINCE内核nk.exe的任务是管理操作系统核心功能。按照OEMAddressTable的映射要求,所有物理地址都映射到0x80000000以上,所以对于内核程序nk.exe和内核模式下的线程来说,只要访问0x80000000以上的有效虚拟地址经MMU就能够访问物理地址,无需再映射是内核模式的一个特点。内核模式的第二个特点是没有地址访问限制,内核模式线程可以访问任何有效虚拟地址,所谓有效虚拟地址是指有实际事物对应。 用户模式线程只能访问0x80000000以下的虚拟地址空间,WINCE6.0之前版本的内核为每个进程划分32MB的地址空间,在不调用特殊函数的情况下不能相互访问,这样的设计使得WINCE系统更安全、更稳定,限制访问地址是用户模式的第一个特点。第二个特点就是需要多一层映射,如果线程要访问物理内存的话需要先映射到0x80000000以上,再经MMU访问物理内存地址。 WINCE的线程具有转移性(参考 API GetCallerProcess的说明,有一个很好的例子),当应用程序的线程调用API或者调用驱动程序接口函数时,该线程会转移到 gwes.exe、device.exe、filesys.exe等进程中执行,转移是由WINCE内核操作的,它会修改线程的上下文,记录线程的当前进程、调用者进程、拥有者进程三个值。 如果在定制内核的时候选择了“Full Kernel Mode”,那么在这个内核上运行的所有线程都处于内核模式,即使调用SetKMode(FALSE)后线程仍然具有内核模式的特点,能够访问任何有效的虚拟地址。假设现有一个64MB RAM的 WINCE产品,RAM映射从0x80000000到0x84000000,如果线程处于内核模式,它就直接可以访问这个范围的虚拟地址: 在OnButton1()中编写 DWORD oldMode = SetKMode(FALSE); volatile int *piTemp = (volatile int*)(0x20000000+0x84000000-0x00019000); ///或者(0x84000000-0x00019000) *piTemp = 12345; 在OnButton2()中编写 DWORD oldMode = SetKMode(FALSE); volatile int *piTemp = (volatile int*)(0x20000000+0x84000000-0x00019000); ///或者(0x84000000-0x00019000) int iTemp = *piTemp; 先只执行OnButton1()然后关闭程序,再重启程序然后执行OnButton2(),iTemp仍然等于12345。结果说明了两点:内核模式线程可以直接访问0x80000000以上的有效虚拟地址;我们写到RAM中的数据没有丢失,说明虚拟地址有效。 如果在定制内核的时候没有选择“Full Kernel Mode”,那么在这个内核上运行的所有线程都处于用户模式。可以调用SetKMode(TRUE)使调用线程暂时处于内核模式,还是原来的假设环境,我再举个例子: 在OnButton1()中编写 DWORD oldMode = SetKMode(TRUE); volatile int *piTemp = (volatile int*)(0x20000000+0x84000000-0x00019000); ///或者(0x84000000-0x00019000) *piTemp = 12345; 在用户模式下,如果不调用SetKMode(TRUE),那么执行*piTemp = 12345一定会弹出对话框,提示地址访问非法,如果调用SetKMode(TRUE)就不会提示地址访问非法,而且在OnButton2()中仍然能得到12345这个值。 通过这两个例子我相信读者能够完全了解两种模式的区别了。 WINCE提供了两个函数SetKMode和SetProcPermissions,其中SetKMode能够把调用线程切换到内核模式,还可以切换回用户模式。SetProcPermissions + GetCurrentPermissions添加当前进程访问权限给调用线程, SetProcPermissions (0xFFFFFFFF)能让调用线程访问所有进程空间,但是调用线程仍然处于用户模式。SetKMode和 SetProcPermissions函数使得用户模式的特点不那么明晰。 如上所说一个应用程序的线程可能转移到其它两个进程地址空间中读写数据,而每一个线程在被创建的时候只有访问创建它的进程地址空间的权限,所以驱动程序开发者必须在驱动程序读写数据前调用SetKMode或者 SetProcPermissions增加调用此函数的线程访问其它进程空间的权限。如果一个应用程序的线程只转移到一个进程地址空间,一般为设备管理器进程device.exe,这种情况下不必增加线程访问其它进程空间的权限,但如果驱动程序本身创建了一个线程,那还是要调用SetKMode或者 SetProcPermissions增加新的线程访问其它进程的权限的,因为驱动程序创建线程时,当前进程为设备管理器,所以新线程只具有访问设备管理器进程空间的权限,而不具备访问应用程序进程空间的权限。 可能一个编写过简单的流驱动的初学者会很疑惑,因为开发一个简单的流驱动程序根本不需要调用这些函数,也没有调用过MapPtrToProcess,那是因为如果标准流驱动接口函数的参数为指针(ReadFile、 WriteFile、DeviceIoControl参数都有指针),WINCE内核会自动映射指针包含的地址,但仅此而已,其余任何情况都要求开发者自行处理,比如流接口函数的参数是一个指向结构体的指针PA,而结构体中包括指针PB,PB指针就必须在流接口函数中映射,映射后才能访问,否则就会造成地址访问非法。所以结构体中每个指针都要映射。 为了让读者能了解其中的原因,我举个例子: 假设设备管理器被加载到Slot4,应用程序A被加载到Slot 8,A只有一个主线程T,T开始执行,按照WINCE的规定,正获得CPU的进程必须映射到Slot0,那么在执行代码的时候 A的所有虚拟地址都被减去一个偏移值,也就是8×0x02000000,A调用DeviceIoControl,传递一个指向一个结构体的指针B,而这个结构体中包含一个指针C,指针C包含的地址假设为0x00030000,当执行DeviceIoControl时WINCE把设备管理器的进程地址空间映射到Slot0,因为放在注册表[HKLM/Drivers/BuiltIn]下的驱动程序是由设备管理器加载的,自然驱动程序的代码段被加载到设备管理器进程空间,但是线程仍然是T,此时T的当前所在进程为设备管理器(CurrentProcess),A变成了T的调用者进程(CallerProcess),T自动具有了访问调用者进程空间的权限。这时访问Slot0中的虚拟地址其实质就是访问设备管理器的进程地址空间,要把地址加上一个偏移值,也就是4×0x02000000,所以DeviceIoControl访问指针C包含的地址时本应该加上8×0x02000000,却加上4×0x02000000,结果地址并不是设备管理器的合法区域,系统就会提示地址访问非法。而如果做了一个映射,指针C包含的地址就会被加一个正确的偏移值,使地址处于A的地址空间Slot 8中,T此时具有访问A进程空间的权限,访问到正确的虚拟地址当然会得到正确的数据了。

SpyGlass Lint脚本实战:如何用TCL自动化RTL代码检查(附完整配置模板) 本文详细介绍了如何利用TCL脚本实现SpyGlass Lint工具的自动化RTL代码检查。通过构建模块化、工程化的脚本框架,文章提供了从环境搭建、核心配置、规则定制到豁免管理的完整实战指南,并附有可复用的配置模板,旨在帮助IC设计工程师构建高效、一致的代码质量检查流水线。 阅读详情

相关推荐

DCA决策曲线的解读和代码实现

0.决策曲线 决策曲线分析法(Decision Curve Analysis,DCA)是个与ROC曲线相提并论的相对比较新的模型评价方法。 关于它的原理,长篇大论的医学统计学知识解读实在不是我的强项,放上两个链接偷偷懒: https://www.plob.org/article/12455.html https://www.iikx.com/news/statistics/1622.html 如果想看文章,这篇里的fig7就是:https://www.ncbi.nlm.nih.gov/pmc/artic

weixin_42960896的博客 1万+

【操作系统】一篇文章带你快速搞懂用户态和内核态

用最通俗的方法讲解用户态和内核态,一篇文章带你彻底搞懂两者之间的区别。

小七的博客 8855

如何设计QR反激变换器

摘要:本文分析了基于GaN技术的PD适配器市场现状,重点探讨了准谐振反激变换器(QR Flyback)的工作原理及设计方法。文章首先介绍了反激变换器的三种工作模式(CCM、DCM、CRM/QR)及其特点,指出QR模式通过谷底开通技术能显著降低开关损耗。随后以65W适配器为例,详细阐述了变压器参数设计流程,包括匝比确定、原边电感计算和绕组匝数设计等关键步骤。文章强调QR反激变换器凭借高效率、小体积和低成本优势,已成为20W-65W PD适配器的主流拓扑方案,配合GaN技术进一步提升了功率密度和便携性。

m0_62868254的博客 1496

用户态和核心态(内核态)的概念、区别和转换

用户态和核心态是操作系统的两种运行级别,当系统运行在3级特权级上时,就可以称之为运行在用户态,因为这事最低权限级,是普通用户运行的权限级,大部分用户直接面对的的程序都是运行在用户态。在手机上表现就是:只能管理自己的App,如果想要操作硬件,需要调用系统的库函数,且部分功能操作不了,操作硬件,比如网卡。

qq_30941739的博客 2552

微信小店推客分销系统源码获取与自研开发全攻略(2025年最新版)

源码选择建议快速试错:选用开源项目(如启航系统),3天可上线基础功能长期布局:购买商业源码授权,重点定制分佣规则与UI交互完全自研:适合年GMV过亿的大型企业,需前置投入风控与合规设计行动清单注册微信开放平台账号,完成视频号机构认证下载开源项目代码,部署本地测试环境联系三家源码供应商,获取合规性审计报告设计三级分佣比例表,通过法律顾问合规审查通过以上路径,可高效构建合规、稳定、高转化的微信小店推客分销系统,抢占2025年视频号电商红利。

2401_85184777的博客 1281

西门子 标准程序解读---> 机器手抓取和涂胶控制程序

摘要 该程序实现机械手在OP70/OP90工位的自动化控制,核心功能包括: 流程控制:分段(Seg1-Seg11)管理抓件、涂胶、放件等动作,结合DB1050/DB1250数据块监控工位状态及变位机位置反馈。 安全机制:配置干涉区(FC124)、实时检测安全光/急停信号,防止碰撞;服务程序(FB191)支持维修位触发与安全隔离。 参数配置:通过DB块关联机器人速度、节拍(FB27)、车型编码(如空过=2)及手自动模式(DB70.DBX21.2)。 应用场景:适用于汽车焊接/装配线

工控智联驿站 1238

用户态与核心态的区别

用户态与核心态的区别

博可睿的博客 5058

Happycapy深度解析:AI智能体的“iPhone时刻“来了?

从理论到实践深度解析了融合OpenClaw和ClaudeCode优点的超强智能体工具Happycapy

program哲学 457

用户态与内核态

深入探讨了用户态与内核态的概念,以及它们在操作系统中的重要作用。文章首先介绍了 CPU 指令集权限分级,解释了为什么操作系统需要区分内核态和用户态。随后,文章详细解析了虚拟地址空间的划分、用户空间与内核空间的区别,以及进程和线程在用户态和内核态下的运行机制。最后,文章探讨了用户态到内核态的切换方式,并分析了 JVM 线程的实现机制。

叉烧钵钵鸡的博客 3594

FPGA 学习笔记:解决FPGA程序固化重新上电程序不运行的问题

FPGA 学习笔记:解决FPGA程序固化重新上电程序不运行的问题

坚韧与专注 1万+

Cadence OrCAD Capture 软件自带元件原理图符号库目录与介绍图文视频教程

硬件工程师在开始原理图设计时,应该首先拥有自己的元件原理图符号库。基于Capture进行原理图设计的一个很大的优点就是,软件自带的元件库比较全。本文简单介绍Capture软件自带元件库。

fydar的博客 5577

操作系统—内核态和用户态

操作系统 内核态 用户态 概念 区别 意义 切换

拥抱技术 2107

Altium Designer(AD24/25)PCB编辑的几种方法介绍

本文介绍了Altium Designer(AD24/25)软件中PCB编辑的四种操作方法:1)通过菜单栏"Place→Component"激活;2)点击工具栏元器件图标;3)右键快捷菜单选择;4)快捷键P+C组合操作。建议初学者先通过菜单栏和快捷菜单熟悉操作,熟练后转为工具栏和快捷键以提高效率。文章配有操作示意图,帮助用户快速掌握PCB元器件放置技巧。

fydar的博客 937

操作系统之核心态和用户态

在操作系统中引入核心态和用户态这两种工作状态后,就需要考虑这两种状态之间如何切换。 操作系统内核工作在核心态,而用户程序工作在用户态。系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能。因此,需要在核心态建立一些“门”,以便实现从用户态进入核心态。在实际操作系统中,CPU运行上层程序时唯一能进入这些“门”的途径就是通过中断或异常。发生中断或异常时,运行用户态的CPU会立即进入核心态,这...

qq_32100465的博客 5768

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CPU的用户态(用户模式)和核心态(内核态)

CPU的用户态(用户模式)和核心态(内核态)是操作系统对处理器权限的两种划分模式,旨在保障系统安全性和资源管理效率。

weixin_36476763的博客 791

efm32 入门.pdf

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

day09| 操作系统重难点之 进程和线程之间的区别 、并行和并发的区别、解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?

day09|操作系统重难点之 进程和线程之间的区别 、并行和并发的区别、解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?

2402_84438596的博客 1122

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SPI隔离实战:MAX14431BAEE+与PIC18F85J50的工业通信方案

工业现场中,SPI总线跨板传输常因地电位差、共模噪声导致数据错误甚至损坏MCU。数字隔离器通过电容耦合实现信号与电源的电气隔离,是解决此类问题的核心器件。理解传播延迟、时序预算与PCB开槽等设计要点,可显著提升系统可靠性。本文以MAX14431BAEE+四通道数字隔离器与PIC18F85J50微控制器为例,探讨工业SPI隔离的选型逻辑、时序计算方法、硬件布局和固件调试实践,为跨板SPI通信提供可复现的工程参考。

weixin_33937499的博客 496

核心态和用户态 到底是os还是cpu的状态?

http://www.cskaoyan.com/thread-48792-1-1.html 这个问题,不太好分的太开吧。 首先要明确的一个简单的原则:软件的功能一定要建立在硬件支持的基础之上。可以说,软件实现的功能,是由硬件逻辑堆积封装而来的。 那么,一个操作系统,我们知道,它具有很多内核的代码、数据结构。控制着整个计算机系统的运转,例如I/O输出、内存访问等等。 现在的多进程操作

旷野的呼唤 1296

特权指令 访管指令 与 用户态和核心态 系统调用

特权指令 从指令系统角度,在指令系统中存在用于管理硬件和整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令则会被中断出错。所以用户程序中不得含有特权指令,需要执行特权指令需要使用防管指令,进入核心态。 访管指令 同样从指令集的角度,或者说从硬件角度(cpu状态)。防管指令,是用户程序自愿进管的指令,该指令本身属于...

dollarser的博客 9686

操作系统篇--八股文学习第十天| 进程和线程之间有什么区别;并行和并发有什么区别;解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?

答:,线程是进程的子任务,是进程内的执行单元。一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存。

m0_67804957的博客 476

以Linux为例,理解操作系统的核心态和用户态

一、用户态的应用程序访问内核态的资源(铺垫基础知识)    如Linux的体系架构所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。 内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。 用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用...

骐骥一跃,不能十步;驽马十驾,功在不舍。 979

八股训练营第 10 天 | 进程和线程之间有什么区别?并行和并发有什么区别?解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?

用户态和内核态是操作系统为了实现权限控制、保护系统资源而设计的两种 CPU 运行级别。用于控制进程 / 程序对计算机硬件资源的访问权限和操作范围。进程是资源分配和调度的基本单位。线程是程序执行的最小单位。线程是进程的子任务。一个进程可以有一个或多个线程,这些线程共享相同的内存空间。

Unstoppable22的博客 512

OS-用户态和核心态

文章目录运行机制和体系结构什么是指令?什么是用户态和核心态?用户态和核心态之间的切换?核心态和用户态的区别 ?操作系统内核大内核和微内核计算机硬件介绍计算机硬件简介CPU多线程和多核芯片内存寄存器高速缓存主存磁盘I/O 设备总线计算机启动过程 运行机制和体系结构 什么是指令? 指令就是CPU能识别执行的最基本的命令,分为: 1、特权指令,只能由操作系统使用、用户程序不能使用的指令,包括: ①改变机器状态的指令; ②修改特殊寄存器的指令; ③涉及外部设备的输入/输出指令。 2、非特权指令::用户程序可以使用

kk阿彬 2253

操作系统的运行机制和体系结构 (三) --- 非特权指令、特权指令,用户态、核心态,应用程序、内核程序...

文章目录操作系统的运行机制和体系结构代码和指令的区别非特权指令和特权指令用户态和核心态应用程序和内核程序大内核和微内核总结感谢 操作系统的运行机制和体系结构 代码和指令的区别 我们所说的代码一般指一段有意义的字符串,我们可以理解它的意思。比如,我们在C语言中写 x = x + 1;,我们可以清楚的理解这段代码的意思,但是计算机CPU却无法理解,因为它只能理解机器指令。我们来看看这段代码转换为机器指...

qq_19018277的博客 4795

管态和目态

是什么 1 . 管态又叫特权态,系统态或核心态。CPU在管态下可以执行指令系统的全集。通常,操作系统在管态下运行。 2. 目态又叫常态或用户态。机器处于目态时,程序只能执行非特权指令。 特点 1. 用户态 不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间 2. 管态 则该程序就可以访问计算机的任何资源,即它的资源访问权限不受限制。 目的 区分...

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 3万+

王道考研:特权指令、用户态与核心态、内核程序与应用程序;中断和异常;系统调用;宏内核与微内核;电脑开机全过程;虚拟机原理

特权指令、用户态与核心态、内核程序与应用程序;中断和异常;系统调用;宏内核与微内核;电脑开机全过程;虚拟机原理

Tandy12356_的博客 2757
上一篇: 怎样在ipad安装ipa文件
iphoneing
博客等级 码龄16年 12粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值