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