我尝试清除指令行的 ARM v7 处理器缓存并使之无效,因为指令代码在执行中可能会发生变化。
为了达到效果,我尝试了两种变体。他们来了:
我用过海湾合作委员会__清除缓存()函数,但没有给出所需的结果。缓存中的指令代码没有改变。
-
我寻找了 GCC 的源代码并找到了uclinux-eabi.h 文件我在其中找到了下一个清除缓存的代码:
/* Clear the instruction cache from `beg' to `end'. This makes an
inline system call to SYS_cacheflush. */
#undef CLEAR_INSN_CACHE
#define CLEAR_INSN_CACHE(BEG, END) \
{ \
register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \
register unsigned long _end __asm ("a2") = (unsigned long) (END); \
register unsigned long _flg __asm ("a3") = 0; \
register unsigned long _scno __asm ("r7") = 0xf0002; \
__asm __volatile \
( \
"swi 0x0 @ sys_cacheflush" \
: "=r" (_beg) \
: "0" (_beg), "r" (_end), "r" (_flg), "r" (_scno)); \
}
这个变体也没有给出结果。
也许有人知道我做错了什么?
我自己也有类似的问题。 __clear_cache() 有效,但前提是相关内存区域是使用 mmap() 并设置了 PROT_EXEC 来分配的。如果您向 Linux 提供来自常规 malloc()ed 内存的内存范围,Linux 将不会刷新指令缓存,即使处理器似乎很乐意从 malloc()ed 内存中执行代码。
See https://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code https://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code例如有关如何执行此操作的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)