通过虚拟地址刷新/无效范围; ARMv8;缓存;

2024-01-27

我正在为 32 位模式下运行的 ARMv8 (Cortex-A53) 实现缓存维护功能。 当我尝试使用虚拟地址(VA)刷新内存区域时出现问题。DCacheFlushByRange看起来像这样

// some init.
// kDCacheL1 = 0; kDCacheL2 = 2;
while (alignedVirtAddr < endAddr)
{
    // Flushing L1
    asm volatile("mcr   p15, 2, %0,  c0,  c0,  0" : : "r"(kDCacheL1) :);        // select cache
    isb();
    asm volatile("mcr   p15, 0, %0,  c7, c14,  1" : : "r"(alignedVirtAddr) :);  // clean & invalidate
    dsb();

    // Flushing L2
    asm volatile("mcr   p15, 2, %0,  c0,  c0,  0" : : "r"(kDCacheL2) :);        // select cache
    isb();
    asm volatile("mcr   p15, 0, %0,  c7, c14,  1" : : "r"(alignedVirtAddr) :);  // clean & invalidate
    dsb();

    alignedVirtAddr += lineSize;
}

DMA 用于验证功能。 DMA 将一个缓冲区复制到另一个缓冲区。源缓冲区在 DMA 之前刷新,目标缓冲区在 DMA 完成后失效。缓冲区是 64 字节对齐的。测试

for (uint32_t i = 0; i < kBufSize; i++)
    buf1[i] = 0;
for (uint32_t i = 0; i < kBufSize; i++)
    buf0[i] = kRefValue;

DCacheFlushByRange(buf0, sizeof(buf0));

// run DMA
while (1) // wait DMA completion;

DCacheInvalidateByRange(buf1, sizeof(buf1));
compare(buf0, buf1);

在转储中我可以看到buf1仍然只包含零。当缓存关闭时,结果是正确的,因此 DMA 本身可以正常工作。

另一点是当整个 D-cache 被 set/way 结果刷新/无效时结果是正确的。

// loops th/ way & set for L1 & L2
asm volatile("mcr   p15, 0, %0,  c7, c14,  2" : : "r"(setway) :)

这么快按设置/方式刷新/无效工作正常。使用 VA 进行闪烁/失效同样不会。可能有什么问题?

PS: kBufSize=4096;,总缓冲区大小为4096 * sizeof(uint32_t) == 16KB


函数本身没有问题,而不是 Cortex-A53 缓存实现功能有问题。

来自 Cortex-A53 TRM

AArch32 中的 DCIMVAC 操作和 AArch64 中的 DC IVAC 指令执行目标地址的无效操作。如果集群内的数据是脏的,那么clean 在 invalidate 之前执行.


所以没有实际的无效,有清理和失效

正常(至少对我来说)顺序是

flush(src);
dma(); // copy src -> dst
invalidate(dst);

但由于 invalidate() 会刷新,因此在 DMA 传输后,缓存(dst 区域)中的旧数据将写入内存中的数据之上。


解决方案/解决方法是

flush(src);
invalidate(dst);
dma(); // copy src -> dst
invalidate(dst); // again, that's right*.


* 来自“dst”内存区域的数据可以提前提取到缓存中。如果这种情况发生在 DMA 将数据放入内存之前,则将使用缓存中的旧数据。第二次无效是可以的,因为数据没有被标记为“脏”,所以它将被执行为“纯无效”。在这种情况下不进行清洁/冲洗。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过虚拟地址刷新/无效范围; ARMv8;缓存; 的相关文章

  • CPU缓存性能。存储未命中与加载未命中

    我使用 perf 作为基本事件计数器 我正在开发一个遭受数据缓存存储未命中的程序 其中比例高达80 我知道缓存原则上是如何工作的 它会在各种未命中情况下从内存加载 并在需要时从缓存中删除数据 我不明白的是 存储未命中和加载未命中之间有什么区
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 现代缓存中的方式预测

    我们知道 就缓存命中时间而言 直接映射缓存优于集合关联缓存 因为不涉及特定标签的搜索 另一方面 组关联缓存通常比直接映射缓存具有更好的命中率 我读到 现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点 他们预测给定集合中最有可能发
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 软件预取手动指令合理的场景

    我读过有关 x86 和 x86 64 Intel 的内容gcc提供特殊的预取指令 include
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 缓存一致性是否始终可以防止读取过时的值?失效队列允许吗?

    在 MESI 协议中 仅当将缓存行保持在独占 修改状态时才写入缓存行 要获取独占状态 您可以向持有同一高速缓存行的所有核心发送无效请求 但是是否存在一种微架构 其中某些内核会在实际使缓存线无效之前做出确认响应 如果确实如此 那不是违反了缓存
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • 无法使用 linux perf 对硬件缓存事件进行采样

    由于某种原因 我无法采样 perf record 硬件缓存事件 perf record e L1 dcache stores a c 100 sleep 5 perf record Woken up 1 times to write dat
  • 使用arm-linux-gnueabi-gcc为Android交叉编译静态C hello world

    我想使用 arm linux gnueabi gcc 从 C 构建静态 hello world 而不是使用 NDK 独立工具链或 Codesourcery 在Ubuntu中 我做了以下事情 sudo apt get install gcc
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一

随机推荐

  • 录制的声音文件(ala google now,google keep)-RecognizerIntent/Listener

    我一直在开发一个使用 recognizerIntent 来获取语音输入的应用程序 然而 自从 jelly bean 推出以来 我一直无法从我的语音输入中获取实际的声音文件 在识别监听器中 http developer android com
  • 您不能对同一个动态路径 Nextjs 使用不同的 slug 名称

    我在我的项目中使用基于文件夹结构的 nextjs 默认动态路由技术 我有一条路线是 pages language location location id 现在我遇到一个用例 除了最后一个参数之外 我需要与上面的路由完全相同 locatio
  • C#:从正文和文件中将模型发布为 MultipartFormDataContent

    我正在寻找一种在一个请求中发送模型和图像的方法 我尝试从正文发送我的模型 但我不知道如何发送文件 除了在不同的文件中发送图像和模型之外 还有其他方法吗 这是我的 API 中的 POST 方法 HttpPost Route UploadNew
  • 如何使用 Python 从 Firebase 存储中检索图像?

    我已经将图像存储到 Firebase Storage 我需要使用 Python 代码将其取出 我可以使用任何 URL 检索图像吗 或者有什么办法可以找回来吗 以下是我如何将其存储在 Firebase Storage 中的图像 这就是我用的
  • 使用 Vaadin 从菜单栏打开 pdf 文件

    我的 vaadin 应用程序中有一个菜单栏 并且想要添加一个项目来打开 pdf 文件 这是浏览器的新选项卡 我找到了一些使用按钮打开文件的解决方案 但我必须使用 MenuItem MenuBar Command commandHandler
  • 如何从 ASP.NET 5 MVC 6 控制器操作返回 XML

    如何从控制器操作返回 XML 即使我添加标题Accept application xml它返回一个 JSON 对象 MVC 5 中的 WebApi 控制器支持这一点 我需要做什么才能使其在 MVC 6 中工作 Microsoft 删除了 X
  • 在 iPad 中重新定向期间在视图中定位对象

    iPad 专家 苹果希望我们支持所有方向 我认为这意味着特定的布局应该旋转 以便所有对象的位置相对相同 或者 如果看起来不太好 那么它们应该重新定位 或者应该设计和构建两个视图 如果我依赖内置的旋转机制 对象要么会调整大小 要么以一个方向或
  • 如何在 extjs 网格(单元格编辑)中显示完整列可编辑?

    我正在使用单元格编辑插件来编辑单元格 但这就像当我们单击该列时 它将进入编辑模式 我想显示带有可编辑文本框的完整列 目前我正在使用以下代码使其可编辑 selType cellmodel plugins Ext create Ext grid
  • Gradle 禁用所有增量编译和并行构建

    在一小部分 sbt 项目中 我们需要 protobuf grpc 编译 并且因为只有 Gradle 对此有正常支持 所以我们用它来执行 protobuf 相关任务 有时它会随机失败编译相同的东西 但重试时会成功 我们确定这是因为增量 Jav
  • Firestore:多个条件 where 子句

    例如 我的图书列表有动态过滤器 我可以在其中设置特定的颜色 作者和类别 该过滤器可以一次设置多种颜色和多个类别 Book gt Red Blue gt Adventure Detective 如何有条件地添加 where firebase
  • 使用 PHP 获取 DOM 元素

    我正在努力理解如何在 PHP 中使用 DOMElement 对象 我找到了这段代码 但我不确定它是否适用于我 dom new DOMDocument dom gt loadHTML index php div dom gt getEleme
  • 查看已完成的 Elasticsearch 任务

    我正在尝试使用 Elasticsearch 的更新查询 API 来运行日常任务 我可以找到当前正在运行的任务 但需要一种方法来查看所有任务 包括已完成的任务 我已经查看了 Update By Query API 的 ES 文档 https
  • 在 BeautifulSoup 中使用多个条件

    我们使用此代码查找包含文本 Fiscal 的标签 soup find class label text re compile Fiscal 我如何在这里放置多个条件 假设标签都包含 财政 和 年度 或者包含 财政 而不是 年份 的标签 如果
  • Android 如何在安排后更改 TimerTask 间隔?

    timerUploadTime new Timer timerUploadTimeTask new TimerTask Override public void run mHandler post new Runnable Override
  • Google 测试输出报告附加

    我在 VC 中使用 GTest 进行单元测试 我有5套测试服 我想生成 Google 测试返回的结果的测试报告 我在 InitGoogleTest 方法之前使用了 testing GTEST FLAGS output xml filenam
  • Sailsjs 套接字 IO

    我是 SailsJs 和 Socket IO 的新手 我想在 Sailsjs 中执行下面的 Socket IO 示例 在服务器端 我需要执行以下代码 但我不知道该代码放在哪里 var io require socket io listen
  • 我已抑制 knit 输出中的警告,但警告并未按预期显示在 Rmarkdown 控制台中。我该如何看待这些?

    我正在使用 Knit 和 rmarkdown 我在 pdf 输出中抑制了警告 然后通常警告会在 rmarkdown 控制台中列出 然而 在一份特定报告的情况下 我没有得到 rmarkdown 控制台中列出的警告 而是收到以下消息 有 15
  • 具有紧轴和匹配纵横比的散景图像图

    我在 Django 应用程序中使用 bokeh 1 0 1 版本 我想将微观表面图像显示为具有颜色编码高度和颜色条的可缩放图像图 原则上这是可行的 但我在获取具有正确纵横比的绘图时遇到问题 仅显示图像而周围没有空间 这是我想要实现的示例 结
  • 什么是服务总线?我什么时候需要服务总线?

    我听说过关于N服务总线 http particular net nservicebus 但我还没有真正理解它是什么 他们声称自己是 最流行的 net 开源服务总线 什么是服务总线 我什么时候需要服务总线 您可以将服务总线视为 SOA 面向服
  • 通过虚拟地址刷新/无效范围; ARMv8;缓存;

    我正在为 32 位模式下运行的 ARMv8 Cortex A53 实现缓存维护功能 当我尝试使用虚拟地址 VA 刷新内存区域时出现问题 DCacheFlushByRange看起来像这样 some init kDCacheL1 0 kDCac