LWN:SLUB分配器的下一步计划!

Linux内核源码目录结构解析:从宏观布局到高效阅读指南 操作系统内核是计算机系统的核心,负责管理硬件资源并为应用程序提供基础服务。其设计遵循模块化与层次化原则,通过清晰的接口定义实现各子系统间的解耦与协作,从而提升系统的可维护性与可扩展性。这一设计理念在工程实践中的直接体现,便是其源码的目录组织结构。理解内核源码目录,如同掌握一张精密的地图,能帮助开发者在进行驱动开发、性能调优或问题排查时,快速定位目标代码,厘清模块间的依赖与调用关系。本文将以Linux内核为例,深入剖析其源码树的宏观布局与设计哲学,并重点解读 arch(架构相关代码)、drivers(设备驱动 阅读详情

关注了就能看到更多这么棒的文章哦~

What's next for the SLUB allocator

By Jonathan Corbet
May 20, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/974138/

Linux 内核中存在两个级别的基本内存分配器:页分配器 (page allocator),以页为单位分配内存;以及 slab 分配器 (slab allocator),分配任意大小的块,通常(但不一定)小于一个页。slab 分配器是内核中常用函数 kmalloc() 的底层实现。在 2024 年 Linux 存储、文件系统、内存管理和 BPF 峰会 上,slab 维护者 Vlastimil Babka 对 slab 级别最近的变动进行了介绍,并讨论了即将到来的变动。

曾经,内核包含三个 slab 分配器实现。在 6.4 版本中,这个数字降至两个,当时 SLOB 分配器(针对低内存系统)被移除。Babka 在 2023 年峰会 上表示,当时已经决定移除 SLAB(两个通用分配器之一),只保留 SLUB 在内核中。这个移除动作也在 6.8 版本中完成。内核开发者现在拥有更大的自由度来改进 SLUB,而不必担心破坏其他分配器。他认为没有人对这个移除动作感到不满,直到他看到了最近来自嵌入式开源峰会的 报告,其中包含了一些抱怨。即使在那个场合里,主要抱怨似乎是关于移除发生得太快了的——尽管他认为这已经拖延了太久。无论如何,似乎没有人强烈要求将 SLAB 重新加入内核。

b513c8a748db1266beccd8607e872f74.png

去年,一些人表达了 SLUB 比 SLAB 对于某些工作负载更慢的担忧。但现在,没有人致力于解决任何剩余的问题。David Rientjes 说 Google 仍在努力过渡到 SLUB;在这个过程中,他们发现使用 SLUB 解决了一些在使用 SLAB 时观察到的抖动问题,因此 Google 的开发人员对这次变更感到满意。

Babka 说他一直在努力减少控制组中内核内存分配的统计(accounting)所产生的开销;这种成本体现在微基准测试(microbenchmarks)中,并且“Linus 对此很不满”。有一些改进已准备好在 6.10 版本中实现,但还有更多工作要做。slab 开发的另一个领域是 堆喷射防御(heap-spraying defense);这些补丁对他来说有点问题。他可以将它们视为内存管理变更进行审查,但他缺乏对安全方面进行判断所需的专业知识。

目前正在进行有关对象缓存和预填充的工作。这项功能将维护一个 per-CPU 的对象数组,用户可以选择是否打开这个功能;他们将能够在分配之前对对象进行预填充(或者预分配),以便它们在需要时随时可用。例如这对于在临界区中分配的对象非常有用。最初的目标用户是 maple tree 数据结构,它目前在进入临界区之前批量分配最坏情况下的对象数量,然后在之后返回未使用的对象。对象缓存将消除这种来回操作,同时确保在需要时可以分配对象。

Michal Hocko 指出,推动这项功能的真正问题是 GFP_ATOMIC 分配与 __GFP_NOFAIL 标志组合起来的情况;如果内存紧张,内核很难满足这种组合。分配器目前在遇到这种组合时会发出警告;他表示,开发者应尽量避免使用这种组合。预填充的对象缓存是解决这个问题的一种方法。将来,可能会为这种情况添加某种预留机制。

maple tree 暴露的另一个问题与其使用 kfree_rcu() 释放对象的做法有关——这在内核代码中经常使用。问题在于,以这种方式释放的内存不会立即供其他用途使用;它必须首先等待 RCU 优雅期过去。这会导致 kfree_rcu() 使用的 per-CPU 数组溢出,导致刷新(flushing),并且可能导致很快就需要重新填充进来,从而再次启动这个循环。这个问题在 Android 上更加严重,RCU 回调只在某些 CPU 上运行,这对处理未运行回调的 CPU 上的 per-CPU 数组就完全没有作用了。

计划创建一个 kfree_rcu() 变体,将对象放入数组并将其放在一边,以便作为一个整体释放。一旦发生这种情况,整个数组就可以放回池中,并提供给所有 CPU 使用。这个数组将被称为“sheaf”;它将存储在每个节点的“barn”中。一个潜在的问题是,在释放对象时可能需要分配一个新的 sheaf;应尽可能避免在释放路径中进行分配。该小组讨论了替代方案,但没有得出任何结论。

与此同时,Babka 并不满足于只移除 SLOB 和 SLAB;接下来要移除的目标是 BPF 子系统使用的特殊分配器。这个分配器旨在任何调用上下文内都可以使用,包括不可屏蔽中断 (NMI) 场景中。BPF 维护者 Alexei Starovoitov 显然赞成进行这个移除,如果 SLUB 能够处理相同的用例的话。BPF 分配器目前为分配的对象添加了 llist_node 结构,使它们更大;切换到 SLUB 将消除这种开销。这也将使 SLUB 成为 NMI 安全的,并消除维护另一个分配器的必要性。

Babka 还希望集成 objpool 分配器,该分配器在 6.7 内核中添加,没有与内存管理开发者进行任何协商。最后,随着会议时间的结束,Babka 提到了最终集成 mempool 子系统(这是另一种预分配对象的方式)的可能性。SLUB 分配器可以为系统中的所有 mempool 预留对象,从而减少整体开销。不过,这看起来是 2025 年峰会讨论的话题。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

04c1768a1b4da99054d7b92d64dd2deb.jpeg

VLOOKUP_fixed.py 立即下载

相关推荐

D打卡签到,蓝牙中继,广播信号模拟器

模拟WIFI或蓝牙,有如下4种运行模式 1、WIFI模式:指定SSID、BSSID名称等,模拟WIFI,供设备连接。 2、蓝牙静态模式:指定MAC地址,广播固定的RAW数据。 3、蓝牙动态主机模式:扫描周围蓝牙设备,获取指定MAC地址的蓝牙及其RAW数据,实时发送至Cloud云端,可以设定时间段,只在设定的时间段内发送。 4、蓝牙动态从机模式:指定MAC地址,从Cloud云端获取动态主机模式实时上传的该MAC地址的RAW数据,并广播RAW数据。 准备工作: 1、板子:选择ESP32C3或ESP32C3 Supermini 2、nRF Connect手机app:用于扫描获取待模拟蓝牙设备的MAC和RAW数据。 Wifi分析仪或WiFi魔盒手机APP:用于扫描获取待模拟WIFI设备的SSID和BSSID。 3、可使用官方flash_download_tool_3.9.11工具来固件烧录。 使用说明: 上述完成后,设备首次上电,RESET一侧的指示灯会常亮,可以把它理解成电源指示灯; BOOT一侧的灯会亮,该灯常亮,表示设备开启了AP模式,此时设备会发射一个WIFI信号源,名称为ESPWIFI_AP,密码为12345678,手机或电脑连接该WIFI,浏览器输入192.168.4.1,进入设备的配置页面,进行相应的配置,其中动态主机模式和动态从机模式的SSID、Pwd 及要模拟的蓝牙MAC地址。配置完成并保存后,会重启,重启后设备会按照保存的配置运行。若下次要修改设备配置,可以长按BOOT按键,等待BOOT一侧的灯常亮,即进入AP模式,再按照上述流程配置即可。 仅用于蓝牙设备的开发与调试,请勿用于签到等违法违纪用途。

LWN:给kernel的swap添加一个抽象层!

关注了就能看到更多这么棒的文章哦~A new swap abstraction layer for the kernelBy Jonathan CorbetMay 23, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974587/交换(swapping)在本质上可能是一种内存管理技术,但其实现也涉及内核的文件系...

Linux News搬运工 698

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

LWN:把slab从struct page中移出来!

关注了就能看到更多这么棒的文章哦~Pulling slabs out of struct pageBy Jonathan CorbetOctober 8, 2021DeepL assist...

Linux News搬运工 447

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型等

Java低代码, 轻量级, 支持国产化 国密 AI大模型MCP服务 商业免费 Spring Boot, MyBatis, Flowable, TypeScript, Vue, Antdv, 包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流、Spring Cloud 微服务、AI大模型、代码生成器等

LWN:slab 分配器的sheaves以及任意上下文的分配功能!

总而言之,他说,来自 sheaves 层的初步结果是 promising(很有希望的),但它与 slab 调试的交互需要改进。(它是 slab 分配器的一部分)实现的工作会议,该版本期望可以从任何上下文中的 BPF 程序中调用。Hoang Nhat Pham 同意,他说他工作的系统具有大量的 CPU,但只有一个 NUMA 节点,从而导致大量的锁竞争,而 per-CPU 缓存可以改善这种情况。最后一个特性几乎是没有额外代价的,因为幸运的是,当请求到达时,分配器会有一个具有足够对象的 sheaf 存在。

Linux News搬运工 1708

基于动态窗口法DWA的机器人路径规划研究(Matlab代码实现)

内容概要:本文系统研究了基于动态窗口法(DWA)的机器人局部路径规划算法,深入剖析其在动态环境中实现自主避障与实时轨迹优化的核心机制。文章详细阐述了DWA算法的速度空间采样策略、轨迹预测模型、动力学约束处理及多目标代价函数的设计原理,并通过构建完整的Matlab仿真框架验证算法有效性。结合典型场景的仿真实验,展示了机器人在复杂障碍物环境下如何实时生成安全、平滑且符合运动学约束的最优路径,充分体现了DWA在移动机器人导航中的实用性与鲁棒性。; 适合人群:具备机器人运动规划基础知识和Matlab编程能力,从事智能移动机器人、自动驾驶或服务机器人研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解DWA算法的理论基础与实现细节;②掌握机器人局部路径规划的仿真实现方法;③为实际机器人系统的导航模块开发提供可复用的算法原型与代码参考;④作为进一步研究高级导航算法(如TEB、MPC)的技术基础。; 阅读建议:建议结合提供的Matlab代码逐模块分析与调试,重点关注速度采样、轨迹积分、障碍物距离计算及代价评估等关键环节,通过调整参数在不同地图环境中进行对比实验,以深刻把握算法性能与参数之间的关系,进而提升对实时路径规划系统设计的理解与应用能力。

Linux 移除slob、slab,只保留slub

SLOB:已在Linux 6.4中移除。SLAB:已在Linux 6.8中移除。

weixin_43551095的博客 200

【轴承故障诊断】用于轴承故障诊断的集中时频分析研究(Matlab代码实现)

内容概要:本文系统研究了用于轴承故障诊断的集中时频分析技术,重点解决了传统时频分析方法在处理非平稳信号时存在的能量分散与分辨率不足等问题。通过引入集中时频分析方法,能够有效聚焦信号能量,精确提取轴承故障特征频率,提升故障识别的准确性与时效性。文章详细阐述了该方法的理论基础,并结合仿真信号与实际实验数据验证其优越性能,同时提供了完整的Matlab代码实现流程,涵盖信号预处理、时频变换、参数优化及结果可视化等环节,便于读者复现与拓展应用。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事机械设备状态监测、故障诊断与预测性维护工作的工程技术人员。; 使用场景及目标:①应用于电机、风机、齿轮箱等旋转机械的早期轴承故障检测,实现故障预警;②提升工业设备运维系统的智能化水平,支撑预测性维护体系构建;③作为高校或研究机构在信号处理、机械故障诊断等课程中的教学案例与实践素材。; 阅读建议:建议读者结合文中提供的Matlab代码逐段运行与调试,深入理解集中时频分布的生成机制及其关键参数(如核函数选择、平滑窗口大小)对诊断效果的影响,并尝试将其应用于其他类型的机械故障信号分析中,开展对比研究以深化对该方法适用性的认识。

DSSAD自动驾驶行车记录系统体系结构和应用

通过对其感知、决策、控制等模块的详细研究,以及对商业化和消费市场发展趋势的分析,为该领域的研究和实践提供有价值的参考。通过克服技术、安全与隐私、法规与政策等方面的挑战,并紧跟人工智能、云端服务、用户体验等发展趋势,DSSAD系统将更好地适应自动驾驶行业的发展,提供更安全、智能、便捷的驾驶辅助服务。DSSAD体系结构通过数据收集模块、加密链接和数据存储模块和数据读取模块等关键模块的协同作用,构建了一个强大而灵活的自动驾驶数据记录系统,为未来智能出行提供了坚实的技术基础。

一只老虎的专栏 2207

LWN: 确保kmalloc()分配是对齐的

Implementing alignment guarantees for kmalloc()October 18, 2019This article was contributed by Marta Rybczyńskakmalloc()是kernel中经常用到的针对小块目标进行内存分配的函数。在2019 Linux Storage, Filesystem, and Memory Managem...

Linux News搬运工 855

告别U盘!在Ubuntu 22.04上从零搭建PXE网络装机服务器(支持UEFI/Legacy双启动)

本文详细介绍了在Ubuntu 22.04上搭建PXE网络装机服务器的完整流程,支持UEFI/Legacy双启动模式。通过配置DHCP、TFTP和HTTP服务,实现无需U盘的高效批量系统部署,解决传统安装方式的介质依赖、版本控制和时间成本问题,显著提升机房维护和设备部署效率。

weixin_42569329的博客 248

LWN: kmalloc( )确保对齐

点击上方蓝色字关注我们~Alignment guarantees for kmalloc()ByJonathan CorbetMay 8, 2019LSFMMkmall...

Linux News搬运工 1622

Electron - Electron failed to install correctly, please delete node_modules/electron and try install

Electron安装失败:Electron failed to install correctly, please delete node_modules/electron and try installing again,electron安装报错:Electron failed to install correctly...解决方案,Electron 未能正确安装,请删除 node_modules/electron,然后再次尝试安装,如何解决这个问题,手把手教你解决,在yarn dev时报错,electr

🏆 前端领域优质创作者 4367

OBC_开环扫频波特图拟合操作流程(结合 Simulink)

摘要: 本文详细介绍了基于Simulink的开环扫频波特图测试与拟合流程,适用于电源/控制系统(如LLC/PFC)的小信号分析。主要内容包括:1)前期准备(测试点选择、信号范围设定);2)Simulink建模方法(信号注入、数据记录);3)两种扫频方式(逐频正弦/Chirp扫频)的实现;4)MATLAB数据处理(FFT分析、传递函数拟合);5)线性分析工具使用技巧。重点强调了激励信号幅值控制、稳态数据采集及模型验证方法,并提供完整MATLAB脚本示例。该流程可有效获取系统频域特性,为控制器设计提供可靠依据。

Sumerking的博客 232

LWN:Slabs, sheaves, and barns!

关注了就能看到更多这么棒的文章哦~Slabs, sheaves, and barnsBy Jonathan CorbetFebruary 24, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1010667/内核的 slab (slab:一种内存分配机制)分配器负责分配小的(通常小于一个内存页)内存块。对于许多工作负载来说,对象分...

Linux News搬运工 1041

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw多Agent模式为企业提供高效的AI助手团队解决方案。通过创建4个独立的飞书机器人(主助理、内容创作、技术开发、AI资讯),每个连接专属Gateway和Agent模型(如Claude Opus/Sonnet、Gemini 2.5),实现专业分工。相比单Agent模式,多Gateway架构具有配置清晰、互不干扰、无需手动切换等优势。系统采用Profile隔离机制,各Agent拥有独立配置和端口。部署过程包括创建机器人应用、配置Agent、运行自动化脚本等步骤,支持私聊或群组@使用。日常提供状态

Maynor的博客 5098

LWN:5.17 中的struct slab!

关注了就能看到更多这么棒的文章哦~Struct slab comes to 5.17By Jonathan CorbetJanuary 14, 2022DeepL assisted tra...

Linux News搬运工 455

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1223

LWN:5.16 合并窗口,第二部分!

关注了就能看到更多这么棒的文章哦~5.16 Merge window, part 2By Jonathan CorbetNovember 15, 2021DeepL assisted tr...

Linux News搬运工 457

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。

AI-安全-功耗 1913

AI 辅助读 Linux 内核,事实检索和推理要分开

阅读 Linux 内核内存管理代码,通常要跨文件追踪调用、宏与条件编译。把这些事实全部交给模型从记忆里补齐,很容易混入其他内核版本的实现。越来越多的团队尝试引入大模型与 AI Agent 来辅助阅读与分析内核源码。然而如果直接把几千行内核代码输入给 LLM,往往容易遇到偏差:大模型可能在宏定义替换上产生理解偏差,将不同内核版本的机制混淆;或者因超出上下文窗口(Context Window)而忽略关键的内存释放路径。要让 AI 成为内核分析的辅助工具,关键在于厘清与。

jiang_style的博客 5066

精雕软件(JDpaint) 5.5 绿色版

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

向struct page里塞更多东西

翻译并篡改更新自LWN.NET 2013年8月的一篇文章。 通常,内核开发人员更倾向于设计可读性和可维护性高的数据结构。当人们理解一段代码使用的数据结构时,对代码本身的理解通常就不会遥远。因此,内核使用最频繁的数据结构之一也是其可理解性最差的之一,这个事实可能会令人惊讶。这个数据结构就是struct page,代表物理内存的页面。最近的一个补丁集,使struct page更加复杂,当然,这也为快...

ytfy339784578的专栏 410

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux内核学习1--开始

实践和反复实验也是提高驱动开发能力的关键。- **内核内存分配**:学习如何在内核中使用`kmalloc`、`kfree`、`vmalloc`等函数分配和释放内存,以及如何管理内核的内存资源。- **字符设备文件操作**:了解如何实现`open`、`read`、`write`、`ioctl`等系统调用函数,并将其挂钩到字符设备驱动中。- **调试工具**:学习使用`printk`、`dmesg`、`debugfs`等工具输出调试信息,以及如何使用`gdb`调试内核模块。

fanged的专栏 1136

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: LWN:6.10 合并窗口前半部分!
下一篇: LWN:Trinity 保持KDE 3!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值