C语言 在处理器流水线中读取时清除内存后的中断是否会导致在中断返回时重新读取内存?

uxh89sit  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(111)

我在代码中阅读了读时清除寄存器(Map到内存,而不是CPU的一部分),它可能会被中断,但中断总是会返回到相同的上下文。
我在想,如果CPU流水线读取读取时清除寄存器,但在执行指令之前,CPU将被中断,当它返回时,它将重新读取读取时清除寄存器,该寄存器由于先前的读取被中断而被清除。
这种情况是否有效?若有,应如何处理?

ilmyapht

ilmyapht1#

如果你有内存Map的I/O寄存器,阅读它们会有副作用(比如清零),那么你需要向CPU表明这个地址范围是“易失性的”。对这样的地址的访问不能被缓存、推测性地加载、重新排序而具有其他副作用等。
如何做到这一点取决于CPU。例如,在ARMv 8上,每个页表条目中有一个位可以被设置为将其指定为“设备”存储器,该存储器是未缓存的,等等。x86有page attribute tables,它取代了早期的memory type range registers功能。对于其他CPU,您需要参考供应商的文档。
一旦你这样做了,那么中断就不是问题了。当中断发生时,要么你的加载已经完成,在这种情况下,加载的值已经在目标CPU寄存器中,并且在处理中断后不会重复加载,要么它根本没有发生,并且将在中断处理程序返回后开始。

5kgi1eie

5kgi1eie2#

这个问题可以通过在流水线处理指令时显式地防止中断来解决:

DISABLE_INTERRUPTS
NOP
NOP
NOP
<Read the memory>
ENABLE_INTERRUPTS

字符串
这不是很好的解决方案,因为需要检测每个这样的寄存器读取并 Package 它,并且需要特权来禁用中断,但它是通用的解决方案。

相关问题