LWN:BPF 里新的共享内存方案!

A look at what‘s possible with BPF arenas BPF arena是一种内存区域,允许在BPF中编写任意数据结构,验证器在此可以更宽松地检查指针。在2025年的Linux峰会上,Emil Tsalapatis报告了其在编写sched_ext调度器时使用arena的经验。尽管整体上对arena感到满意,但他指出最大的问题是内核指针无法存储在arena中,这限制了其使用。目前,开发者需要将数据结构分为两部分存储:一部分在arena中,另一部分在BPF map中,以持有内核对象的引用。这种分割虽然可行,但降低了arena的便利性。Tsalapatis希望BPF 阅读详情

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

A proposal for shared memory in BPF programs

By Daroc Alden
February 21, 2024
Gemini translation
https://lwn.net/Articles/961941/

2021 年 2 月 6 日,Alexei Starovoitov 提交了一系列的补丁(patch series)给 Linux 内核,以添加 bpf_arena ,这是一种新的共享内存类型,用于 BPF 程序与用户空间之间的通信。Starovoitov 期望这种 arena 对于用户空间和 BPF 程序之间的双向通信以及作为 BPF 程序的额外堆空间将会非常有用。这有助于直接实现复杂数据结构而不依赖于内核提供的 BPF 程序。Starovoitov 以 Google的ghOSt项目为例,这个项目是他的工作的一个例子和灵感来源。

BPF 程序已经有几种与用户空间通信的方式,包括环形缓冲区、哈希映射和数组映射。然而,每种方法都存在一些问题。环形缓冲区(ring buffer)可以用于将性能测量或跟踪事件发送到用户空间进程,但不能从用户空间接收数据。哈希映射(hash map)可以用于此目的,但从用户空间访问它们需要进行bpf()系统调用。数组映射(array map)可以使用mmap()将它们映射到用户空间进程的地址空间中,但 Starovoitov 指出它们的“缺点是数组的整个内存在开始时就被预留下来”。数组映射(以及新的 arena)存储在不可分页的内核内存中,所以未使用的页面会产生明显的资源利用效率上的浪费。

他的补丁系列允许 BPF 程序创建最多 4GB 大小的 arena。与数组映射不同,这些 arena 不会预先分配页面。BPF 程序可以使用 bpf_arena_alloc_pages() 向 arena 添加页面,并且当用户空间程序在 arena 内触发页面错误(page fault)时,页面将被自动添加进来。

无缝指针(seamless pointers)

该补丁系列以一种不寻常的方式处理 arena 内的指针,确保 arena 内部的结构可以指向 arena 的其他区域,并且这对用户空间程序和 BPF 程序都可以无缝地工作,而不需要意识到存在隐式的转换。尽管这两种程序完全有不同的指针表示,但它们都不需要意识到存在隐式转换。BPF 程序将 arena 内的指针表示为 32 位指针,处于单独的地址空间中(验证器 BPF verifier 会确保其不用作普通指针,反之也一样),但用户空间程序将指针视为其体系结构的普通指针。用户空间表示实际存储在 arena 内存中。内核映射 arena 空间时,保证用户空间指针的低 32 位始终与 BPF 指针匹配,以加快两种表示之间的转换。

例如,这个系列包括一个程序作为测试套件的一部分,在 BPF 中实现了一个哈希表,使用链表来把属于同一类的项目串起来。可以在内核中完成哈希表的生成,然后从用户空间访问,反之亦然,两者都能够跟随数据结构中的指针。

该补丁系列引入了两个函数 bpf_cast_kern() 和 bpf_cast_user() ,用于在内核表示的指针和用户空间表示的指针之间进行转换。有一个相关的补丁来为LLVM的BPF 后端自动插入正确的转换动作,以确保用户空间版本是存储在 arena 内存中的版本。该补丁系列引入了一个新的标志( BPF_F_NO_USER_CONV ),以允许 BPF 程序关闭此行为。未执行指针转换的 arena 仍然可以映射到用户空间,但用户空间程序将无法跟随其中包含的指针。

审查意见

Barret Rhoden指出了这种转换实现的一个细节问题。补丁系列的初始版本在 arena 中留下了一个空洞(取决于 arena 在用户空间的映射位置),以便 BPF 不会生成以 0x00000000 结尾的指针。这样的对象在转换为 32 位指针时,在 BPF 程序中具有全零表示,这可能与空指针混淆并引发问题。Rhoden 指出,如果 BPF 程序尝试访问缺失的页面,将会引发页面错误并终止程序,他指出如果有人意外使用了这个零页面,我们将遇到更严重的问题。Starovoitov 同意了这一观点,并表示他将在系列的第二版中删除缺失的页面,因为该逻辑“在带来更多伤害而不是好处”。移除 arena 中的空洞后,BPF 程序需要避免将对象放在 0 地址处然后尝试获取指向它的指针,这可以通过在 arena 开头添加一些填充来轻松实现。

确保内核和用户空间就 arena 指针的低 32 位达成一致是有必要的,因为这可以使 BPF 即时(JIT)编译器生成的代码更简单,因此更快。如果用户空间可以将 arena 映射到任意地址,就像这个补丁系列的初始版本中的情况一样,这将使得内核中 arena 的表示相对复杂一些,并且可能需要额外的逻辑来清晰地处理 arena 地址的环绕。Rhoden 和 Starovoitov 继续讨论这个细节,并最终得出结论:没有理由支持将 arenas 真正映射到任意地址。Rhoden评论说:“将 4GB 映射对齐到 4GB 边界的限制非常合理。”

Lorenzo Stoakes对补丁系列中的分配页方式提出了异议,因为它使用vmap_pages_range()来为 arena 分配页面,而这是内核虚拟内存分配器的一个内部函数。 Stoakes 说:“我在 Vmap()中看到很多检查,而 vmap_pages_range()中并没有。”他问“我们是否可以将其公开给你以及其他核心内核用户?”

Johannes Weiner 回应说“vmap API 通常是公开的”,并且“新的 BPF 代码需要 vmap_pages_range()的功能,以便将分别管理的页面数组逐步映射到其 vmap 区域”。他接着指出,在其他外部使用该函数的代码消失后,该函数从原来的公开改成了私有。Christoph Hellwig在对话的另一部分表示不满:“我们需要保持 vmalloc 内部细节只在内部,并且不要在我们将其大致形成之后破坏这些抽象。”

在审查 BPF 代码的内部更改时,Andrii Nakryiko对新的arenas如何计算其大小提出了关切。现有的 BPF 映射记录键的大小、值的大小和可以容纳在映射中的总条目数。这对于哈希映射和数组映射效果很好,但对于新的 arenas 来说不太合适。Starovoitov 决定将 arenas 表示为具有 8 字节键和值大小的形式,“以便将来能够扩展它并允许 map_lookup/update/delete 执行一些有用的操作”。Nakryiko 断言他们“应该可能使 bpf_map_mmap_sz()意识到特定的 map 类型,并根据此进行不同的计算”,并指出 arenas 不太可能使用正常的 BPF 接口来进行 map 条目的查找。

Donald Hunter 质疑为什么在代码中将 arenas 表示为一种新的 map 类型,问是否“这是唯一可以重用内核/用户空间连接的方式?”Starovoitov 回答说,现有的 BPF 程序可用的许多映射都不支持某些映射操作。尤其是布隆过滤器(bloom filter)和环形缓冲区(两种现有的映射类型,在某些方面与新的 arenas 相似)不支持查找、更新或删除操作。他继续说,arenas“可能是我们将添加的最后一种映射,因为几乎任何算法都可以在 arena 中实现”。

Starovoitov 迅速吸收了这些反馈意见,并发布了补丁系列的第二版。然而,他没有解决 Hellwig 对暴露虚拟内存分配代码底层细节的担忧。Hellwig重申他的立场,称:“vmap 区域不能随意被调用者滥用”。Starovoitov回应说,如果暴露 vmap_pages_range() 函数是无法接受的,Hellwig 应该提出一个替代方案。Linus Torvalds 插话说,提出可接受的解决方案不是维护人员的责任;“需要提出新需求的人才需要寻找一个可接受的解决方案”。

对于这个版本的补丁系列的讨论仍在进行中,但除了 Hellwig 关于暴露虚拟内存分配代码的底层细节的担忧之外,其他大部分问题都相对较小,或已经得到解决。在 BPF 程序和用户空间代码之间能够无缝共享内存是一个有吸引力的前景,因此很可能这项工作最终会完成实现,即便需要找到一种新的方式来按需为 BPF arena 分配页面。

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

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

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

78394689d4237682ca5d122f17e13474.jpeg

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

相关推荐

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 272

LWN:在今后十年让BPF保持活力!

关注了就能看到更多这么棒的文章哦~Modernizing BPF for the next 10 yearsBy Daroc AldenJune 7, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/977013/BPF 最初采用来作为对数据包过滤的一个通用化处理方案,这发生在十多年前。在那之后,BPF 发生了巨...

Linux News搬运工 1848

YOLO26算法水面与液体识别+训练好的模型+393张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 52 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.8528** mAP50-95 | 0.3441 Precision | 0.7729 Recall | 0.8354 train/box_loss | 1.5367 train/cls_loss | 1.0228 val/box_loss | 1.6809 val/cls_loss | 1.1758 【训练过程分析】 我这次训练了52个周期,模型在训练初期确实收敛速度很快,前20个周期mAP50从0.74逐步提升至0.82,这说明模型开始适应数据集,学习到一些关键特征。但到第30个周期后,提升速度逐渐放缓,到了40个周期时,mAP50达到0.85,这个阶段的曲线走势有些像磨砂玻璃,平滑且不规则,后期更是趋于平缓,表明模型可能已经达到最优解,再继续训练可能会有少量提升但代价较大。整体而言,从loss曲线来看,训练集的box_loss和cls_loss在52个周期内分别从1.80和1.25降到1.54和1.02,下降曲线较为稳定,但到了后期,这两项指标下降幅度逐渐减缓,尤其cls_loss下降至1.10左右后趋于稳定,这可能是模型对训练数据已有了较强的泛化能力,但也提示我们分类的稳定性可能还欠些火候。 至于验证集的表现,box_lo... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

LWN:用BPF异步采集stack trace!

关注了就能看到更多这么棒的文章哦~Capturing stack traces asynchronously with BPFBy Daroc AldenJune 19, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/978736/Andrii Nakryiko 在 2024 年的Linux 存储、文件系统、内...

Linux News搬运工 2352

C#西门子上位机与PLC通讯++S7协议

支持S7-200,S7-300,S7-1200,S7-1500+使用技术C#+S7net

MATLAB模拟6自由度无人机检查,具备干扰补偿、裂纹检测和自主复检功能。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

LWN:BPF专用的内存分配器!

关注了就能看到更多这么棒的文章哦~A BPF-specific memory allocatorBy Jonathan CorbetJune 30, 2022DeepL assisted translationhttps://lwn.net/Articles/899274/内核现在并不缺内存分配器(memory allocator),所以人们可能不理解为什么又要加一个分配...

Linux News搬运工 388

AI大模型医学影像诊断智能识别应用方案.pptx

AI大模型医学影像诊断智能识别应用方案.pptx

LWN:用 msharefs 共享页表!

关注了就能看到更多这么棒的文章哦~Sharing page tables with msharefsBy Jonathan CorbetJuly 15, 2022DeepL assisted translationhttps://lwn.net/Articles/901059/页表项(PTE, page-table entry)本身相对较小,在大多数系统上只需要 8 个字...

Linux News搬运工 533

智能驾驶智慧交通行业智算中心(AIDC)建设规划方案.pptx

智能驾驶智慧交通行业智算中心(AIDC)建设规划方案.pptx

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档)

内容概要:本资源是一套面向电力电子与智能控制领域的综合性科研仿真资料合集,核心聚焦于LLC谐振变换器的恒压恒流双竞争闭环控制策略设计与Simulink建模仿真实现,涵盖半桥LLC、双向全桥LLC等拓扑结构的调频闭环仿真,并提供详尽的说明文档与PPT辅助材料。资源体系不仅深入呈现LLC变换器的动态响应与控制逻辑,还扩展至双有源桥(DAB)变换器的软开关协同优化、最小应力控制、EPS调制策略及新扩展移相角优化等前沿技术,同时集成三相PWM整流器在电网不平衡条件下的功率平衡控制、VOC+SVPWM双闭环控制等典型应用场景。此外,资源包涵盖状态估计(如EKF、UKF、PF)、微电网经济调度、卡尔曼滤波融合、神经网络控制、PID优化、储能系统管理等多个交叉方向,特别强调对顶级EI期刊研究成果的高精度复现,旨在帮助科研人员快速掌握先进控制算法的核心思想与仿真实现方法。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等相关专业的硕士博士研究生、高校科研人员,以及从事新能源变换器、智能电网、电动汽车、微电网系统研发的工程技术人员。; 使用场景及目标:① 深入理解LLC与DAB变换器的闭环控制机理,掌握恒压恒流切换、软开关实现与损耗优化方法;② 利用Simulink平台构建复杂电力电子系统模型,开展动态性能分析与控制器参数整定;③ 复现高水平期刊论文中的先进控制策略,提升科研创新能力与论文发表竞争力;④ 支持毕业设计、科研课题、项目申报及工程原型开发中的仿真验证环节。; 阅读建议:建议结合提供的完整资源目录循序渐进学习,优先研读标注“顶级EI复现”的案例以获取权威方法参考,配合MATLAB/Simulink动手搭建模型,重点关注控制框图设计、调制逻辑实现与仿真结果对比,深入理解算法背后的物理意义与数学推导过程。

LWN:6.9合并窗口的第一部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.9 merge windowBy Jonathan CorbetMarch 14, 2024ChatGPT translationhttps://lwn.net/Articles/965141/截至撰写本文时,已将超过 4900 个非合并的变更集合并到了主线内核以准备发布 6.9 版本。这项工作包括了内核代码各处的一...

Linux News搬运工 252

概率神经网络的分类预测-基于PNN的变压器故障诊断(Matlab代码实现)

内容概要:本文系统阐述了基于概率神经网络(PNN)的变压器故障诊断方法,结合Matlab代码实现分类预测。通过提取变压器运行过程中的关键特征参数,构建PNN模型以实现对正常状态与典型故障状态(如绕组短路、铁芯故障等)的高效分类识别。文章深入剖析了PNN的网络结构、概率密度估计原理、训练机制及分类决策过程,并通过仿真实验验证了该方法在故障诊断任务中具备较高的准确率与鲁棒性,展现了其在电力系统状态监测与智能运维中的良好应用前景。; 适合人群:具备一定机器学习理论基础和Matlab编程能力的电气工程、自动化、智能电网等相关领域的研究生、科研人员以及从事电力设备状态监测与故障诊断工作的工程技术人员。; 使用场景及目标:①实现变压器早期故障的智能化诊断与预警,提升电力系统运行安全性;②为基于神经网络的工业设备故障分类任务提供可复现的算法实现范例与技术验证平台; 阅读建议:建议读者结合文中提供的Matlab代码,动手复现实验流程,深入理解PNN在实际分类问题中的参数配置、训练策略、性能评估方法,并鼓励将该方法迁移至其他电力设备或机电系统的故障诊断场景中进行拓展研究与优化改进。

LWN:用户空间的 per-CPU memory!

本质上,这是缓存行对齐数组方法的变体,但分配器会将分配的数据紧凑地排列在每个 CPU 的区域内,从而减少这些区域之间的内存浪费。Desnoyers 首先表示,他的目标是帮助用户空间开发者更好地利用 restartable sequences (可重启序列),它通过在关键部分中断进程(如果进程在此时被迁移),从而促进对 per-CPU 数据的某些类型的访问。因此,该库首先在一个特殊的“初始化区域”中初始化一个 CPU 的内存,然后为每个 CPU 创建该区域的写时复制(copy-on-write)映射。

Linux News搬运工 1516

优快云首页 发布文章 优快云同步助手 多无人机面向城市空中交通的多无人机路径规划研究(Matlab代码实现) 37 100 摘要:会在推荐、列表等场景外露,帮助读者快速了解内容,支持

内容概要:本文围绕面向城市空中交通的多无人机路径规划问题展开研究,系统阐述了该领域的核心挑战与关键技术。文章首先定义了多无人机路径规划的问题,明确了包括飞行安全、避障、协同效率在内的多项约束条件与性能指标。随后,重点介绍了三大类路径规划方法:基于改进RRT算法和图论的全局路径规划方法,用于构建初始可行路径;基于动态风险场的模型预测控制和动态窗口法(DWA)的动态避障方法,以应对环境中的突发障碍;以及多无人机协同规划策略和分布式协同控制算法构成的局部协同调整方法,确保多机间的飞行安全与任务协同。研究通过搭建Matlab仿真实验平台,设计了多种复杂城市飞行场景,对所提方法进行了全面的仿真验证与结果对比分析,展示了各方法在不同场景下的有效性与优劣。; 适合人群:具备一定自动化、计算机或航空航天领域基础知识,从事无人机、智能交通、路径规划等相关方向研究的研发人员和研究生。; 使用场景及目标:①为城市空中交通管理系统(UATM)的设计与开发提供理论基础和技术参考;②应用于物流配送、城市巡检、应急救援等多无人机协同任务的路径规划算法设计与仿真验证;③作为相关领域科研工作的技术参考资料,推动多智能体协同决策与控制技术的发展。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,通过复现仿真结果加深对各类算法原理与实现细节的理解。在学习过程中,应重点关注全局规划与局部避障的结合机制,以及多机协同策略中的冲突消解逻辑。

无刷直流电机BLDC转速电流双闭环+无位置传感器控制仿真【仿真+详解说明报告+参考文献】

内容概要:本文详细介绍了一套针对无刷直流电机(BLDC)的Simulink仿真资源包,核心内容涵盖转速电流双闭环控制与无位置传感器控制技术,重点采用滑模观测器(SMO)实现对转子位置与速度的精确估算,避免了物理位置传感器带来的成本与可靠性问题。资源包提供了多个高质量仿真模型,包括基于模糊PID与传统PID控制策略的对比分析、无感控制结合滑模观测器与双闭环PI控制的综合系统等,全面展示不同控制算法在动态响应、抗干扰能力及稳态精度方面的性能差异。所有模型均基于Matlab/Simulink平台构建,配套详尽的技术说明文档与参考文献,深入解析控制结构设计、观测器原理、参数整定方法及系统稳定性分析,适用于电机驱动系统的研究、教学演示与工程验证。; 适合人群:面向电气工程、自动化、控制科学与工程及相关专业的本科生、研究生、科研人员和工程技术人员,尤其适合从事电机控制、电力电子与运动控制系统研究的专业人士,具备自动控制理论基础和Matlab/Simulink基本操作能力者更易上手。; 使用场景及目标:① 深入学习并掌握无刷直流电机双闭环调速系统的工作原理与无位置传感器控制的关键技术;② 对比研究模糊PID与传统PID在电机控制中的动态性能与鲁棒性差异;③ 开展滑模观测器在非线性系统状态估计中的建模与仿真研究;④ 支持课程设计、毕业设计、科研项目申报及学术论文复现等实际应用场景。; 阅读建议:建议用户结合提供的详解说明报告,逐步运行各仿真模型,重点关注控制器参数调节过程、滑模观测器的设计细节及其收敛性表现,深入分析系统启动、负载突变、转速切换等工况下的响应特性,鼓励在此基础上进行控制算法改进、引入新型观测器或拓展至其他电机类型进行创新性研究。

LWN:io_uring 可以不用文件描述符了!

关注了就能看到更多这么棒的文章哦~Descriptorless files for io_uringBy Jonathan CorbetJuly 19, 2021DeepL assiste...

Linux News搬运工 339

【顶级EI复现】基于KKT条件与分段解析优化的双有源桥DC-DC变换器软开关协同最小应力闭环控制方法(Simulink仿真实现)

内容概要:本文提出了一种基于KKT条件与分段解析优化的双有源桥DC-DC变换器软开关协同最小应力闭环控制方法,旨在实现高效能、低损耗的电力变换控制。通过构建包含软开关约束与电流应力目标的优化模型,结合KKT最优性条件进行数学推导,对变换器的工作模态进行分段解析处理,精确求解出满足零电压开通(ZVS)且电流有效值最小的最优工作点。在此基础上设计了闭环控制系统,有效提升了变换器在全功率范围内的运行效率与动态响应性能。文中详细阐述了控制策略的理论推导过程、优化求解算法实现及Simulink仿真实验验证,充分展示了该方法在协同优化软开关范围与器件应力方面的优越性。; 适合人群:从事电力电子与电力传动、新能源发电系统、电动汽车及微电网等相关领域的科研人员与工程技术人员,具备一定的电路理论、最优控制理论与仿真建模基础。; 使用场景及目标:①用于高效率双有源桥变换器的先进控制策略研究与设计;②为解决传统移相控制中软开关范围受限与功率器件电流应力高的问题提供优化思路;③适用于车载充电机、直流配电系统、可再生能源并网等对高功率密度与高效率有严苛要求的应用场景。; 阅读建议:建议结合Simulink仿真模型深入理解控制算法的具体实现流程,重点关注KKT条件在非线性约束优化中的应用逻辑以及分段解析策略的设计思想,同时可通过对比传统单移相控制(SPS)或双重移相控制(DPS)方法,直观体会本方法在效率提升与应力抑制方面的综合优势。

上一篇: LWN:Fedora 40 的 KDE Plasma X11 支持!
下一篇: LWN:FOSDEM上的开源AI讨论!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值