【ARM】SMMU系统虚拟化整理

目录

1.MMU的基本介绍

1.1 特点梳理

2.功能

DVM interface 

PTW interface

2.1 操作流程

2.1.1 StreamID

2.1.2 安全状态:

2.1.3 HUM

2.1.4 可配置的操作特性

Outstanding transactions per TBU

QoS 仲裁

2.2 Cache结构

2.2.1 Micro TLB

2.2.2 Macro TLB


1.MMU的基本介绍

内部文档整理

MMU-500 是一个系统级的内存管理单元(Memory Management Unit, MMU),它负责将输入地址转换为输出地址,这一过程基于 MMU-500 内部寄存器和转换表中的地址映射和内存属性信息。MMU-500使用的是ARM SMMU架构v2,以下是 MMU-500 的主要功能和组件的详细解释:

  1. 地址转换阶段

    • 地址从输入地址转换到输出地址的过程被称为地址转换的一个阶段。
  2. 支持 ARM 架构

    • MMU-500 支持 ARMv7 和 ARMv8 架构定义的转换表格式。
  3. 转换类型

    • 第一阶段转换:将输入的虚拟地址(Virtual Address, VA)转换为输出的物理地址(Physical Address, PA)或中间物理地址(Intermediate Physical Address, IPA)。
    • 第二阶段转换:将输入的 IPA 转换为输出的 PA。
    • 组合阶段转换:将输入的 VA 转换为输出的 IPA,然后将该 IPA 转换为 PA。MMU-500 为每个转换阶段执行转换表遍历。
  4. 多级地址查找

    • 地址转换可以跨越两个阶段,即第一阶段和第二阶段。地址转换可能需要多次转换表查找,每次转换表查找被描述为地址查找的一个级别。每个第一阶段转换的级别可能需要额外的第二阶段转换。
  5. 内存属性定义

    • 除了将输入地址转换为输出地址外,地址转换的每个阶段还定义了输出地址的内存属性。在两阶段转换中,第二阶段转换可以修改第一阶段转换定义的属性。
  6. 转换阶段的禁用或旁路

    • 地址转换的一个阶段可以被禁用或旁路,MMU-500 可以为禁用和旁路的转换阶段定义内存属性。
  7. 上下文识别

    • MMU-500 使用请求主设备(requesting master)的输入来识别上下文。这个上下文告诉 MMU-500 用于转换的资源,包括要使用的转换表。
  8. 第一阶段转换

    • 通常与应用程序和操作系统级别的操作相关联,VA 范围可以被分割成两个子范围,由转换表基寄存器(Translation Table Base registers)TTBR0 和 TTBR1 转换,每个都有相关的转换表和控制寄存器。
  9. 支持的页面大小

    • ARMv7 架构:MMU-500 支持所有页面大小。
    • ARMv8 架构:除了 16KB 页面粒度外,MMU-500 支持所有页面大小。
  10. 安全和非安全转换上下文

    • 第一阶段转换支持安全和非安全转换上下文。通常,适当的操作系统:
      • 定义内存中的第一阶段转换的转换表,用于其安全状态。
      • 配置 MMU-500 以配置第一阶段转换,然后启用转换。
  11. 第二阶段转换

    • 仅支持非安全(Non-secure)转换上下文。典型的两级地址转换使用模型如下:
      • 非安全操作系统定义第一阶段地址转换,用于应用程序级和操作系统级操作。它假设自己是从处理器使用的 VAs 映射到物理内存系统中的 PAs,但实际上它将 VAs 映射到 IPAs。这个mapping的含义是 OS使用的translation table中的address是处于IPA address空间的,然后需要stage2来将IPA转换成PA。
      • 管理程序(hypervisor)定义第二阶段地址转换,将 IPAs 映射到 PAs。这是其虚拟化一个或多个非安全客户操作系统的一部分。
  12. 转换后备缓冲器(TLB)

    • MMU-500 可以在 TLB 中缓存转换表查找的结果,这意味着 MMU-500 也支持 TLB 维护操作。
  13. 参考文档

    • 有关 MMU-500 支持的架构特性的更多信息,请参阅 ARM® 系统内存管理架构规范。
    • 有关地址转换(包括转换表格式和 TLB 维护操作)的更多信息,请参阅:
      • ARM® 架构参考手册,ARMv7-A 和 ARMv7-R 版。
      • ARM® 架构参考手册,ARMv8,针对 ARMv8-A 架构配置。
  14. MMU-500 的关键组件

    • 转换缓冲单元(Translation Buffer Unit, TBU):包含一个 TLB,用于缓存页表。MMU-500 为每个连接的主设备实现一个 TBU,设计为靠近主设备本地。
    • 转换控制单元(Translation Control Unit, TCU):控制和管理地址转换。MMU-500 实现一个单一的 TCU。
    • 互连:将多个 TBU 连接到 TCU。

下图给出一个系统中SMMU集成的例子:

1.1 特点梳理
  1. 地址虚拟化

    • 为基于 ARM 处理器的系统和其他总线主设备提供地址虚拟化。
  2. 支持的转换

    • 第一阶段转换(Stage 1)。
    • 第二阶段转换(Stage 2)。
    • 第一阶段后跟第二阶段转换(Stage 1 followed by Stage 2)。
  3. 可编程服务质量(QoS)

    • 允许根据服务质量对请求进行仲裁。
  4. 分布式转换支持

    • 支持多达 32 个 TBUs(Translation Buffer Units)的分布式转换。
  5. 转换支持的地址范围

    • 支持 32 位到 49 位的虚拟地址范围和 48 位的物理地址范围。
  6. 多事务上下文

    • 支持多达 128 个可配置的上下文和可编程页面大小。MMU-500 使用主设备输入流 ID 来映射每个上下文。
  7. 转换支持

    • 支持 ARMv7 VMSA 的第一阶段转换。
    • 支持 ARMv8 AArch32 的第一阶段和第二阶段转换。
    • 支持 ARMv8 AArch64 的第一阶段和第二阶段转换,包括 4KB 和 64KB 粒度。
    • 支持第一阶段后跟第二阶段的转换。
  8. 页面大小限制

    • 除了 ARMv8 架构定义的 16KB 页面粒度外,支持所有页面大小。
  9. PTW 请求的仲裁

    • 使用已编程的 QoS 值对来自不同 TBUs 的 PTW(Page Table Walk)请求进行仲裁。
  10. 页面表遍历的缓存

    • 存储中间页面表遍历数据。
  11. TLB 中的页面表项缓存

    • 在 TLB 中缓存页面表项,以提高地址转换的效率。
  12. TLB 命中下未命中(HUM)支持

    • 支持在 TLB 命中时处理未命中的情况。
  13. 可配置的 PTW 深度

    • 使用并行 PTWs 配置 PTW 深度。
  14. TLB 失效

    • 通过 AMBA 4 DVM 信号或寄存器编程进行 TLB 失效。
  15. 转换和保护检查支持

    • 包括 TrustZone® 扩展支持。
  16. 故障处理、记录和信号

    • 包括需求分页和对暂停模型的支持。
  17. AMBA 从属接口

    • 每个 TBU 支持一个 ACE-Lite 从属接口,用于连接需要地址转换的总线主设备。
  18. AMBA 主接口

    • 支持 ACE-Lite 和 DVM 的主设备事务或 PTWs。
  19. AXI4 接口

    • 用于编程的 AXI4 接口。
  20. TLB 缓存的两个级别

    • 宏 TLB(Macro TLB)。
    • 微 TLB(Micro TLB)。
  21. 错误检测和失效

    • TLB 和遍历缓存 RAM 支持单比特错误检测和错误检测后的失效。上下文消歧多 FIFO(MFIFO)RAM 支持单比特错误检测和校正。
  22. 调试和性能监控事件

    • 提供调试和性能监控功能。
  23. TCU 核心时钟速度

    • TCU 核心可以在 TCU 外部接口时钟速度的一半运行。
  24. 预取缓冲器

    • 预取下一个 4K 或 64K leaf page entry,以减少延迟。
  25. IPA2PA 缓存

    • 加速第一阶段后跟第二阶段的转换。
  26. 支持每个 TBU 主接口的未完成事务

    • 支持每个 TBU 主接口多达 256 个未完成事务。
  27. 服务质量方案中优先级提升支持

    • 作为 QoS 方案的一部分,支持优先级提升。

2.功能

DVM interface 

MMU-500 的 ACE-Lite 接口的 AC 信道连接到由 CCI 驱动的 AC 信道或支持 DVM 消息的 ACE 兼容的从属接口。ARM 建议使用 DVM 信道进行 TLB 维护操作。如果系统无法访问 DVM 信道,则必须将 acvalid 信号连接到低电平,并且可以使用编程接口进行 TLB 维护操作。

当您将 MMU-500 配置为提供专用的 AXI 信道以执行 PTW 时,AC 信道必须是 PTW 信道的一部分。

注意:

  • 如果没有配置专用信道,请使用 TBU0 AXI 接口后缀,并确保它连接到 TCU。
  • 此接口支持以下内容:
    • AC 信道(地址信道)
      • 44 位宽的 AC 信道连接到 TCU。
    • 注意:CD 信道(数据信道)没有连接到 MMU-500。
PTW interface

在 MMU-500 中,可以有一个专用接口提供对内存的访问以进行页表遍历(PTWs)。

如果 MMU-500 配置为支持 PTWs 的专用接口,您必须将与 PTWs 相关联的从属接口的读地址和读数据信道连接到 MMU-500 PTW 信道。在这种配置中,PTW 信道包含 "_ptw" 后缀。例如,araddr_ptw 和 acaddr_ptw。

注意:

  • 专用 PTW 接口上的写接口不使用。
  • 如果 MMU-500 配置为不支持 PTWs 的专用接口,PTWs 将在连接到 TBU0 的 ACE-Lite 接口上执行。

MMU-500的Clock和power domain

        当TBU0与TCU sharing相同的clock或power domain时。

2.1 操作流程

MMU-500 通过以下逻辑处理步骤路由每个地址转换:

  1. 安全状态确定。
  2. 上下文确定。
  3. 如果转换未缓存在 TLB 中,则进行页表遍历。
  4. 保护检查。
  5. 根据编程生成或合并属性。

您可以配置 MMU-500 绕过事务处理过程的事务,或者无论转换状态如何都使事务发生故障。

MMU-500 的主要功能是根据存储在转换表中的地址映射和内存属性信息,提供地址和内存属性转换。MMU-500 执行以下步骤以实现此目的:

  1. 接收地址事务,以及安全和流信息。
  2. 使用接收到的安全信息以及事务来确定事务的附加处理步骤。接收到的安全信息是事务发起者的安全状态。根据发起者的安全状态是安全还是非安全,MMU-500 分别使用安全或非安全的寄存器集合进行事务的附加处理。见第 2-14 页上的“安全确定”。
  3. 使用 (S)CR0.CLIENTPD 确定是否需要流匹配。如果 CLIENTPD 被禁用,则绕过事务。
  4. 使用接收到的流信息以及事务来确定要应用于事务的转换机制。转换机制可以是绕过、第一阶段转换、第二阶段转换,或第一阶段后跟第二阶段转换。
  5. 如果在上下文映射之前转换过程中识别出故障,则将故障信息添加到全局故障状态寄存器。如果故障是在上下文映射之后识别出的,则 MMU-500 将故障信息添加到上下文银行的故障状态寄存器中。 当启用中断报告时,故障会触发中断。您可以通过清除故障状态寄存器来清除中断。

注意: MMU-500 不支持配置错误。它将全局故障状态寄存器中的 CAF 位视为 RAZ(保留未用)。

2.1.1 StreamID

2.1.2 安全状态:

在确定了 SSD 索引之后,SSD 表包含从 0 到 2^SSD 索引信号宽度 - 1 的位。 您必须按照以下方式确定位的状态:

  • SSD 索引可以是可编程的或不可编程的,并且可以处于安全或非安全状态。默认情况下,SSD 索引处于不可编程的非安全状态。
  • 非可编程索引列表
    • 对于这些索引,主设备的安全状态是定义好的,不会改变。
    • 您必须指定那些安全状态始终为安全的主设备的索引。
  • 可编程索引列表
    • 您可以编程可编程索引的安全状态。
    • 您必须确定那些安全状态可编程的每个主设备的默认状态。

注意:

  • 一个条目不能在多个列表中重复。
  • 您必须为每个配置至少指定一个可编程或固定的非安全条目。
  • 索引的数量由配置的 SSD 索引信号宽度决定。例如,如果 SSD 索引信号宽度为 6 位,则有 64 个索引,范围是 0-63。您必须将索引编程为以下之一:
    • 可编程安全。
    • 可编程非安全。
    • 非可编程安全。
  • 未编程的索引默认为不可编程非安全。

MMU-500 支持可以访问安全和非安全 TLB 的安全调试 TLB 访问。 SSD 表最多有 32Kb 的空间,该空间被分成 32 个部分,每个 TBU 分配 1Kb。 例如,TBU0 空间是从 0-1Kb,TBU1 空间是从 1-2Kb,TBU2 空间是从 2-3Kb。 每个 TBU 生成的 SSD 索引最多为 10 位,被索引到分配给 TBU 的 1Kb 空间中。 您必须使用这些信息来编程 SSD 表。

注意:

  • 当 integ_sec_override 信号被设置为零时,安全确定描述才有效。
  • 所有实现和集成寄存器都可以通过非安全访问来访问。这包括以下全局空间 0 寄存器:
    • 辅助配置寄存器(ACR)。
    • 调试寄存器。
  • 您不能访问任何安全寄存器。
  • 所有事务都被视为来自非安全主设备
2.1.3 HUM

Hit-Under-Miss (HUM) 是一种特性,它可以翻译 TLB 失效事务,并将事务传递给下游从属设备,如果翻译后的 TLB 失效事务结果为 TLB 命中。HUM 允许在 MMU-500 为先前发生 TLB 失效的事务执行翻译时,对于随后的事务如果出现 TLB 命中,可以响应主设备。以下是 HUM 对读写事务的特性:

  • 如果事务是读访问,HUM 将自动启用。
  • 如果事务是写操作,HUM 的启用或禁用基于写缓冲区的深度。您可以在配置期间指定写缓冲区的深度。
    • 如果写缓冲区的深度为零,则 HUM 自动禁用。
    • 如果写缓冲区的深度非零,只有当来自失效事务的写数据可以适应写缓冲区时,写命中事务才会被翻译。
  • 未完成的失效事务的数量由写缓冲区的深度决定。例如,如果缓冲区的深度为四,则它可以容纳两个长度为二的事务。每个缓冲区条目仅保存事务的一个节拍,即使它是窄宽度的。

HUM 特性提高了系统处理连续内存访问的效率,尤其是在有大量 TLB 失效和命中混合的情况下。

2.1.4 可配置的操作特性
Outstanding transactions per TBU

未完成事务定义为:

  • 生成物理地址访问并被从属设备接受的事务。
  • 写入或读取响应被暂停的事务。 对于每个 TBU,MMU-500 支持每个写入和读取访问各 256 个未完成事务。

MMU-500 在主设备的访问导致 TLB 失效时生成 PTW。然而,根据配置,MMU-500 支持每个 TBU 同时进行 8 或 16 个这样的并行 PTW。如果有超过 8 或 16 个 PTW 挂起,通道上的 TLB 失效表明 MMU-500 不能在接受写入或读取通道上的额外事务。

QoS 仲裁

PTW 由 TCU 为多个 TBU 发起。因此,当 TCU 中有多个未完成事务时,最高质量的 TBU 会被赋予优先权。MMU-500 重用为 PTWs 编程的 QoS 值。

arqosarb 信号,从 MMU-500 到 CCI 的边带信号,在 TCU 中所有 PTW 读取事务中具有最高的 QoS 值。

在地址转换中,MMU-500 使用已编程的服务质量(Quality of Service, QoS)值。

对于个别的预取访问,MMU-500 使用命中事务的 QoS 值。

对于具有相同 QoS 值的事务,MMU-500 采用先到先服务(First-Come, First-Served, FCFS)模型进行处理。这意味着在相同优先级级别上,事务将按照它们到达的顺序被处理。

地址宽度

进入的地址宽度固定为49位,其中 A[48] 指定虚拟地址子范围。您必须将所有未使用的位连接到零。输出地址宽度为48位,AC地址总线的宽度为48位。

注意 MMU-500不支持地址宽度大于49位的外设。

2.2 Cache结构
2.2.1 Micro TLB

2.2.2 Macro TLB

预取缓冲区 MMU-500

会提前提取 4KB 和 64KB 大小的页面到预取缓冲区中。这减少了未来 PTWs(页表步进走)的延迟。您可以配置预取缓冲区的深度。 预取缓冲区是一个单一的四路组相联缓存,您可以根据上下文启用或禁用它。预取缓冲区与宏观 TLB 缓存共享 RAM。

Page walk缓存

MMU-500 缓存部分 PTWs 以减少 TLB 失效时的 PTW 数量。PTW 缓存存在于 TCU 中,第一阶段和第二阶段的第二级 PTWs 被缓存在 PTW 缓存中。

IPA 到 PA 缓存

MMU-500 实现了一个从 IPA(中间物理地址)到 PA(物理地址)的缓存,用于第一阶段后跟第二阶段的转换。 IPA 到 PA 缓存是一个单一的四路组相联缓存,您可以根据上下文启用或禁用它。IPA 到 PA 缓存与 PTW 缓存共享 RAM。

来个赞兄弟姐妹们~

下期预告:SMMU集成指导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四周:机器学习笔记

第四周学习周报 摘要Abstract机器学习任务攻略1.loss on training data1.1 training data的loss过大怎么办?1.2 training data的loss小,但是testing data loss大怎么办? 2. 如何选择一个中最好的模型?2.1 Cross Validation&#x…

知名在线市场 Etsy 允许在其平台上销售 AI 艺术品,但有条件限制|TodayAI

近日,以手工和复古商品著称的在线市场 Etsy 宣布,将允许在其平台上销售 AI 生成的艺术品。这一举措引发了广泛关注和争议。尽管 Etsy 正在接受 AI 艺术的潮流,但平台对这一类商品的销售设置了一些限制。 根据 Etsy 新发布的政策,…

mysql存储引擎和备份

索引 事务 存储引擎 概念:存储引擎,就是一种数据库存储数据的机制,索引的技巧,锁定水平。 存储引擎。存储的方式和存储的格式。 存储引擎也属于mysql当中的组件,实际上操作的,执行的就是数据的读写I/O。…

华为OD机试2024年C卷D卷 - 构成指定长度字符串的个数/字符串拼接(Java)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录 题目描述&#xff1a;构成指定长度字符串的个数 (本题分值200) 给定 M&#xff08;0 < M ≤ 30&#xff09;个字符&#xff08;a-z&#xff09;&#xff0c;从中取出任意字符&#xff08;每个字符只能用一次&#x…

科普文:银行信贷系统概叙

信贷业务流程 资金需求者提交申请&#xff1a;资金需求者通过不同渠道&#xff08;如APP、网站、门店等&#xff09;提交贷款申请。 系统交互完成审批&#xff1a;系统通过自动化和人工相结合的方式&#xff0c;对贷款申请进行初步筛选和审批。 系统交互完成策略判断&#xf…

rsync文件远程同步

目录 一、什么是rsync远程同步 二、实操rsync远程文件同步 1、配置rsync同步源 2、客户端部署 3、增量备份​编辑 4、删除文件 5、如何实现免交互登录 6、crontab rsync 实现定时同步 7、使用ssh实现rsync数据同步【☆】 如何使用ssh免交互实现数据同步&#xff1f;…

Golang | Leetcode Golang题解之第260题只出现一次的数字III

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) []int {xorSum : 0for _, num : range nums {xorSum ^ num}lsb : xorSum & -xorSumtype1, type2 : 0, 0for _, num : range nums {if num&lsb > 0 {type1 ^ num} else {type2 ^ num}}return []in…

【深度学习入门篇 ⑨】循环神经网络实战

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

【一刷《剑指Offer》】面试题 48:不能被继承的类

《剑指Offer》对应内容&#xff1a; 可参考&#xff1a; 【C】继承 -- 详解_c,两个派生类继承一个基类,声明对象的时候用基类的对象。-CSDN博客

每日OJ_牛客_WY33 计算糖果

目录 牛客_WY33 计算糖果 解析代码 牛客_WY33 计算糖果 计算糖果_牛客题霸_牛客网 解析代码 A - B aB - C bA B cB C d 这道题目的实质是&#xff1a;判断三元一次方程组是否有解及求解&#xff0c; 13可以得到A(ac)/2&#xff1b;4-2可以得到C(d-b)/2; 24可以得到B2…

WebGSI地图切片|栅格地图切片原理|地图矢量切片原理

介绍 图栅格切片是WebGIS中使用的一种新技术&#xff0c;通过地图栅格切片可以有效缩短服务器的地图生成时间和地图传输时间&#xff0c;提高系统的响应速度。 地图切片是在多个比例尺下配置地图&#xff0c;预先将每个比例尺下的地图绘制成小图片&#xff0c;保存到服务器上一…

Python 爬虫实战----3(实力展现)

实战&#xff1a;获取豆瓣电影top250的电影名字 1.获取url&#xff1a;打开网站按发f12&#xff0c;点击网络&#xff0c;刷新找到第一个截取url和User-Agent。 2.请求爬取数据 mport requests import fake_useragent from lxml import etree import re #UA head {"User…

Android AutoSize屏幕适配:适配不同屏幕大小的尺寸,让我们无需去建立多个尺寸资源文件

目录 AutoSize是什么 AutoSize如何使用 一、AndroidautoSize是什么 在开发产品的时候&#xff0c;我们会遇到各种各样尺寸的屏幕&#xff0c;如果只使用一种尺寸去定义控件、文字的大小&#xff0c;那么到时候改起来就头皮发麻。以前使用dime的各种类库&#xff0c;文件太多…

Spark调优特殊case- Task倾斜

首先我们观察下上面的stage5, Task MaxTime2.4Min, 但是stage5的整体耗时竟然可以达到55Min, 其实分区1000&#xff0c; 300个executor&#xff0c; 按照最大的TaskTime2.4Min来估算所有Task运行完成时间, 那么时间应该是- 2.4Min * 3 2.4Min 9.6Min 也就是最慢也就跑10分钟就…

C++ | Leetcode C++题解之第274题H指数

题目&#xff1a; 题解&#xff1a; class Solution { public:int hIndex(vector<int>& citations) {int left0,rightcitations.size();int mid0,cnt0;while(left<right){// 1 防止死循环mid(leftright1)>>1;cnt0;for(int i0;i<citations.size();i){if(…

Kubernetes集群安装步骤

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、安装要求 在开始之前&#xff0c;部署Kubernetes集群集群需要满足以下几个条件&#xff1a; 一台多多台机器&#xff0c;操作系统CentOS.x-86_x…

数据结构——栈(顺序结构)

一、栈的定义 栈是一种数据结构&#xff0c;它是一种只能在一端进行插入和删除操作的特殊线性表。这一端被称为栈顶&#xff0c;另一端被称为栈底。栈按照后进先出&#xff08;LIFO&#xff09;的原则进行操作&#xff08;类似与手枪装弹后射出子弹的顺序&#xff09;。在计算…

服务攻防-应用协议cve

Cve-2015-3306 背景&#xff1a; ProFTPD 1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和site cpto命令读取和写入任意文件。 任何未经身份验证的客户端都可以利用这些命令将文件从文件系统的任何部分复制到选定的目标。 复制命令使用ProFTPD服务的权限执行&#xff0c;…

配置web服务器

当访问网站www.haha.com时显示&#xff1a;haha&#xff1b;当访问网站www.xixi.com/secret/显示&#xff1a;this is secret 第一步&#xff0c;配置一个新的IP 确认后 esc返回 第二步&#xff1a;重启ens160 第三步&#xff1a;创建目录&#xff0c;并且在文件内写入内容 第…

【b站/哔哩哔哩/bilibili】视频缓冲慢的解决方法

最近我的b站视频缓冲很慢&#xff0c;加载速度只有100多kb/s。这导致视频加载非常慢&#xff0c;看几秒就卡很久&#xff0c;有时候甚至黑屏。 据某些b站网友研究&#xff0c;b站存在如下问题&#xff1a;相关动态 “2.更改网络协议。是的&#xff0c;你没看错&#xff0c;转了…