gem5学习方法汇总,How to start gem5?

本文分享了gem5的学习思路和方法,包括从入门到深入的步骤:阅读官方文档、尝试示例实验、理解配置文件及模拟流程,再到具体源代码的学习等。适合初学者快速上手。

参考:https://www.mail-archive.com/gem5-users@gem5.org/msg06627.html

经过一段时间的摸索和学习,现将gem5的学习思路和方法分享给大家,希望对大家有用!也欢迎一起学习和讨论!

一、准备开始gem5

Here are several things I did to get started.
>

  1. Start with Introduction http://gem5.org/Introduction. Compile gem5 for
    the architecture you are interested, try it with pre-compiled helloworld
    binary.(首先看wiki官网的Documentation,务必动手完成里面的每一个例子)

  2. When you are able to finish the “helloword” simulation, it’s a good
    idea to spend time in documents http://gem5.org/Documentation and
    tutorials http://gem5.org/Tutorials. “Getting start” section and “Running
    gem5” section are must reads. However, it may be quite hard to understand
    everything, but you just need to make sure you know what these articles and
    tutorial slides are talking about at high level. I actually quite like the
    figure on memory system:
    http://www.gem5.org/docs/html/gem5MemorySystem.html

(其次,看完Documentation后再看Tutorials,务必仔细看完,并且做完里面的每个测试实验)
>

While you read the documents, you can try to run some experiments
yourself. For example, different scripts in configs/example, different
modes (FS/SE), different workloads, different simulation models (simple
atomic, simpletiming, InOrder, O3) etc..

  1. After finish first-round reading and blackbox testing, you can dig into
    code. I started from http://gem5.org/SimObjectshttp://gem5.org/SimObjects.
    I myself is not familiar with python too, but I don’t think it’s hard to
    read it as long as you have experience in other languages. If there is some
    keywords, syntax or grammar you don’t understand, go to google or search on
    http://www.python.org/. For C++ part, I think if you know C and OO
    concept, it should not be a big problem either – certain things I don’t
    like about C++ such as templates are used in several places, and may cost
    you sometime to understand.

(专注看相关源代码)
>

While reading source code, I usually keep instrumenting it with printf and
run it with helloword binary so I can keep tracking the control flow. Of
course, don’t simulate a complex system, simpleatomic is good enough. The
only problem I have is compiling gem5 takes too much time. It took me over
20 minutes to build everything on my Dell Precision workstation. So when
you insert printf, try to avoid places like header files. Also try to use
64-bit system as more memory can be used – it seems gem5 needs a lot of
memory to compile.

  1. After you have basic understanding in how a python config file is used
    to instantiate C++ object and how a simulation is started, you can spent
    time in the part you are interested – whether it’s cache or memory, or
    pipelined cpu. Gem5 has many nice designs that you may not find from other
    simulators, I myself is also learning. Also, mailing list is always
    helpful, and you can post your questions if you get stuck.

(当完成上述内容后,可以专注于自己感兴趣的部分)

备注:(可看看这哥们的博客,个人觉得不错)http://blog.csdn.net/wyj7260/article/category/1301132
二、相关测试实验

1、多核缓存及协议配置

参考(43页):http://pages.cs.wisc.edu/~markhill/cs757/Spring2012/includes/isca_pres_2011.pdf
这里写图片描述

gem5学习基础完整版,介绍了gem5环境的安装,以及一些基本概念。 gem5仿真器是用于计算机系统体系结构研究的模块化平台,涵盖系统级体系结构以及处理器微体系结构。1、多个可互换的CPU型号。 gem5提供了四种基于解释的CPU模型:简单的单CPI CPU; 有序CPU的详细模型和无序CPU的详细模型。 这些CPU模型使用通用的高级ISA描述。 此外,gem5具有基于KVM的CPU,该CPU使用虚拟化来加速仿真。 2、完全集成的GPU模型,可以执行真实计算机ISA,并支持与主机CPU共享的虚拟内存。 3、NoMali GPU模型。 gem5带有集成的NoMali GPU模型,该模型与Linux和Android GPU驱动程序堆栈兼容,因此无需进行软件渲染。 NoMali GPU不产生任何输出,但可以确保以CPU为中心的实验产生代表性的结果。 4、事件驱动的内存系统。 gem5具有详细的,事件驱动的内存系统,包括高速缓存,交叉开关,探听过滤器以及快速而准确的DRAM控制器模型,用于捕获当前和新兴内存的影响,例如内存。 LPDDR3 / 4/5,DDR3 / 4,GDDR5,HBM1 / 2/3,HMC,WideIO1 / 2。 可以灵活地布置组件,例如,以具有异构存储器的复杂的多级非均匀高速缓存层次结构来建模。 5、基于跟踪的CPU模型,可播放弹性跟踪,这些跟踪是由附着到乱序CPU模型的探针生成的依赖项和定时注释的跟踪。 跟踪CPU模型的重点是以快速,合理的方式而不是使用详细的CPU模型来实现内存系统(高速缓存层次结构,互连和主内存)的性能探索。 6、异构和异构多核。 可以将CPU模型和缓存组合到任意拓扑中,从而创建同构异构的多核系统。 MOESI侦听缓存一致性协议可保持缓存一致性。 7、多种ISA支持。 gem5将ISA语义与其CPU模型解耦,从而实现对多个ISA的有效支持。 目前gem5支持Alpha,ARM,SPARC,MIPS,POWER,RISC-V和x86 ISA。 有关更多信息,请参见支持的体系结构。
E:/Bitnami/redmine-5.0.3-0/ruby/bin/ruby.exe -x E:\Bitnami\redmine-5.0.3-0\apps\redmine\htdocs\bin\bundle exec E:\Bitnami\redmine-5.0.3-0\ruby\bin\ruby.exe E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/bin/rails server -b 127.0.0.1 -p 3000 -e development Beginning in Rails 4, Rails ships with a `rails` binstub at ./bin/rails that should be used instead of the Bundler-generated `rails` binstub. If you are seeing this message, your binstub at ./bin/rails was generated by Bundler instead of Rails. You might need to regenerate your `rails` binstub locally and add it to source control: rails app:update:bin # Bear in mind this generates other binstubs # too that you may or may not want (like yarn) If you already have Rails binstubs in source control, you might be inadvertently overwriting them during deployment by using bundle install with the --binstubs option. If your application was created prior to Rails 4, here's how to upgrade: bundle config --delete bin # Turn off Bundler's stub generator rails app:update:bin # Use the new Rails executables git add bin # Add bin/ to source control You may need to remove bin/ from your .gitignore as well. When you install a gem whose executable you want to use in your app, generate it and add it to source control: bundle binstubs some-gem-name git add bin/new-executable => Booting Thin => Rails 6.1.7 application starting in development http://127.0.0.1:3000 => Run `bin/rails server --help` for more startup options Please add the following to your Gemfile to avoid polling for changes: gem 'wdm', '>= 0.1.0' if Gem.win_platform? E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activerecord-6.1.7/lib/active_record/dynamic_matchers.rb:22:in `method_missing': undefined method `acts_as_taggable_on' for Principal (call 'Principal.connection' to establish a connection):Class (NoMethodError) Did you mean? acts_as_watchable from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/lib/redmine_simple_kanban/patches/principal_patch.rb:11:in `block in included' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/lib/redmine_simple_kanban/patches/principal_patch.rb:8:in `class_eval' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/lib/redmine_simple_kanban/patches/principal_patch.rb:8:in `included' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/init.rb:61:in `include' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/init.rb:61:in `block (3 levels) in <top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/init.rb:61:in `class_eval' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/init.rb:61:in `block (2 levels) in <top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/init.rb:50:in `each' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/init.rb:50:in `block in <top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/lazy_load_hooks.rb:68:in `block in execute_hook' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/lazy_load_hooks.rb:52:in `block in run_load_hooks' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/lazy_load_hooks.rb:51:in `each' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/lazy_load_hooks.rb:51:in `run_load_hooks' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/application/finisher.rb:140:in `block in <module:Finisher>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/initializable.rb:32:in `instance_exec' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/initializable.rb:32:in `run' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/initializable.rb:61:in `block in run_initializers' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:228:in `block in tsort_each' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:431:in `each_strongly_connected_component_from' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:349:in `block in each_strongly_connected_component' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:347:in `each' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:347:in `call' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:347:in `each_strongly_connected_component' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:226:in `tsort_each' from E:/Bitnami/redmine-5.0.3-0/ruby/lib/ruby/2.6.0/tsort.rb:205:in `tsort_each' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/initializable.rb:60:in `run_initializers' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/application.rb:391:in `initialize!' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/config/environment.rb:16:in `<top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/zeitwerk-2.6.1/lib/zeitwerk/kernel.rb:35:in `require' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/zeitwerk-2.6.1/lib/zeitwerk/kernel.rb:35:in `require' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/dependencies.rb:332:in `block in require' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/dependencies.rb:299:in `load_dependency' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.7/lib/active_support/dependencies.rb:332:in `require' from config.ru:3:in `block in <main>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/builder.rb:116:in `eval' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/builder.rb:116:in `new_from_string' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/builder.rb:105:in `load_file' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/builder.rb:66:in `parse_file' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/server.rb:349:in `build_app_and_options_from_config' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/server.rb:249:in `app' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/rack-2.2.4/lib/rack/server.rb:422:in `wrapped_app' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/commands/server/server_command.rb:77:in `log_to_stdout' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/commands/server/server_command.rb:37:in `start' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/commands/server/server_command.rb:144:in `block in perform' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/commands/server/server_command.rb:135:in `tap' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/commands/server/server_command.rb:135:in `perform' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/thor-1.2.1/lib/thor/command.rb:27:in `run' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/command/base.rb:69:in `perform' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/command.rb:48:in `invoke' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/commands.rb:18:in `<top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/app_loader.rb:59:in `require' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/app_loader.rb:59:in `block in exec_app' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/app_loader.rb:48:in `loop' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/app_loader.rb:48:in `exec_app' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/lib/rails/cli.rb:7:in `<top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/exe/rails:10:in `require' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.1.7/exe/rails:10:in `<top (required)>' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/bin/rails:29:in `load' from E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/bin/rails:29:in `<main>' Exiting Process finished with exit code 1
最新发布
09-11
<think> 首先,用户的问题是提供了一段错误日志,看起来是Redmine启动时的错误。日志显示了一个错误:undefined method `acts_as_taggable_on' for Principal (call 'Principal.connection' to establish a connection):Class (NoMethodError)。这似乎是由于一个插件引起的,具体是redmine_simple_kanban插件。 关键错误信息: - 错误发生在文件:E:/Bitnami/redmine-5.0.3-0/apps/redmine/htdocs/plugins/redmine_simple_kanban/lib/redmine_simple_kanban/patches/principal_patch.rb:11 - 错误是:Principal类中没有定义acts_as_taggable_on方法。 - 错误发生在插件redmine_simple_kanban的初始化过程中。 Redmine是一个基于Ruby on Rails的项目管理工具。这个错误表明redmine_simple_kanban插件尝试在Principal类上调用acts_as_taggable_on方法,但该方法不存在。acts_as_taggable_on可能来自另一个gem,比如acts-as-taggable-on gem,用于标签功能。 可能的原因: 1. 缺少必要的gem:插件可能需要acts-as-taggable-on gem,但没有安装在环境中。 2. 加载顺序问题:插件加载时,所需的依赖尚未加载。 3. 不兼容性:插件可能不兼容当前的Redmine版本或Rails版本。Redmine 5.0.3使用Rails 6.1.7,日志中显示Rails 6.1.7。 解决方案步骤: 1. 确保acts-as-taggable-on gem已安装并添加到Gemfile中。 2. 运行bundle install来安装缺失的gem。 3. 检查插件兼容性:确认redmine_simple_kanban插件支持Redmine 5.0.3。 4. 如果gem已安装,但问题仍然存在,尝试重启服务器或清除缓存。 在我的回答中,我需要用中文回答用户的问题,因为用户指定了“请使用中文回答问题”。 回答结构: - 首先,解释错误原因。 - 然后,提供解决方案建议。 - 最后,根据规则,必须在回答末尾提出3-5个相关问题。 §§相关问题§§ 必须输出在末尾,并且第一行必须是“§§相关问题§§”,然后列出问题,禁止换行分散。意思是问题应该连续列出,不换行。 示例格式: - 回答内容 - §§相关问题§§ - 1. ··· - 2. ··· - 3. ··· 我需要基于问题和我的回答提出相关问题。用户的问题是提供错误日志,寻求帮助解决错误。 相关问题应该围绕这个主题: - 如何安装和配置插件? - 如何解决依赖问题? - 如何检查插件兼容性? - 常见错误排查等。 拟定相关问题: 1. 如何确保Ruby on Rails项目中的所有依赖gem都已正确安装? 2. 在Redmine中安装插件时,如何确认插件与当前版本的兼容性? 3. 如果遇到“undefined method”错误,有哪些调试步骤? 4. 如何处理Redmine启动时的插件初始化错误? 5. 如何更新或重新生成Redmine的binstubs以避免初始警告? 确保3-5个问题。 我的回答: 解释错误:这个错误是由于redmine_simple_kanban插件试图调用acts_as_taggable_on方法,但该方法未定义,可能因为缺少acts-as-taggable-on gem或加载问题。 建议: 1. 添加gem 'acts-as-taggable-on'到Gemfile并运行bundle install。 2. 确认插件兼容Redmine 5.0.3。 3. 重启服务器。 4. 如果无效,检查插件文档或联系支持。 最后,输出相关问题。 </think> 您的错误日志显示 Redmine 启动失败,主要问题是 `undefined method 'acts_as_taggable_on' for Principal`。这是一个 `NoMethodError`,发生在 `redmine_simple_kanban` 插件的初始化过程中。原因可能是以下之一: 1. **缺少依赖的 gem**:插件 `redmine_simple_kanban` 依赖于 `acts-as-taggable-on` gem(用于标签功能),但该 gem 未安装或未正确加载。 2. **插件兼容性问题**:该插件可能不兼容您的 Redmine 版本(5.0.3)或 Rails 版本(6.1.7)。 3. **加载顺序错误**:在 Rails 初始化时,插件的补丁文件(`principal_patch.rb`)尝试调用方法时,所需的 gem 尚未加载。 ### 解决步骤: 1. **添加缺失的 gem**: - 打开 Redmine 根目录下的 `Gemfile`(路径:`E:\Bitnami\redmine-5.0.3-0\apps\redmine\htdocs\Gemfile`)。 - 在文件末尾添加一行:`gem 'acts-as-taggable-on'`。 - 保存文件后,运行命令安装依赖: ``` bundle install --without development test ``` - 确保安装成功(检查输出无错误)。 2. **验证插件兼容性**: - 访问 `redmine_simple_kanban` 插件的官方文档或 GitHub 仓库,确认其支持 Redmine 5.0.3。 - 如果不兼容,考虑升级插件或寻找替代方案。 3. **重启 Redmine 服务**: - 安装 gem 后,重新启动 Redmine 服务器: ``` bin/rails server -b 127.0.0.1 -p 3000 -e development ``` 4. **故障排查**: - 如果错误依旧,尝试禁用 `redmine_simple_kanban` 插件(移除或重命名插件目录 `plugins/redmine_simple_kanban`),然后重启 Redmine,确认是否是插件引起的问题。 - 检查 Redmine 日志文件(`log/development.log`)获取更多错误细节。 - 确保所有 gem 已更新:运行 `bundle update`。 如果问题未解决,建议查看插件文档或联系社区支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值