c - 为什么 ARMv7-A 在从缓存中刷新堆栈指针时会崩溃

标签 c linux-kernel arm cpu-cache

我正在尝试逐出 ARM Cortex-A8 处理器中堆栈指针指向的内存地址。我正在尝试使用以下代码来做到这一点:

cpy r3, sp
mcr p15, 0x0, r3, cr7, cr6, 0x1

我已在可加载内核模块中运行上述代码。在内核中运行上述代码后,操作系统崩溃并需要重新启动。但上面的指令可以很好地从缓存中刷新变量。

有人可以给我任何解决问题的建议吗?

最佳答案

由于无艺术的噪音,实际上 ARM cortex-a8 有 3 种基于修改虚拟地址的缓存操作命令:

Invalidate (C6, 1) (just invalidate the cache line)
Clean (C10, 1) (Update memory if the cache line is dirty)
Clean & Invalidate (C14, 1) (Update memory then invalidate cache line)

正如您在问题中看到的那样,我使用了 Invalidate 指令,它导致该内存的堆栈数据无效。但使用 Clean&Invalidate 指令后问题就解决了。所以最终的代码如下:

cpy r3, sp
mcr p15, 0x0, r3, cr7, cr14, 0x1
DSB SY

关于c - 为什么 ARMv7-A 在从缓存中刷新堆栈指针时会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57191062/

相关文章:

linux - Linux中套接字的内存消耗和压缩行为

linux - 网络系统调用在 x86 上多路复用,但在 x64 上没有

arm - 执行预装在闪存 NOR 中的代码

c++ - 在 C 中使用 printf 等效于 C++ std::setprecision(20)

c - Linux, C : terminate multple threads after some seconds (timer? )

c++ - 如何在 Linux/POSIX 中获取任意时区的信息?

assembly - ARM NEON : Which pairs of instructions have to wait for write back?

python - 为什么在通过 Python 的 C API 调用 pyplot.draw() 时重新播种 rand()?

Android 7.1.1内核编译错误(工具链)

c - malloc 何时在裸机环境中返回 NULL?