例如,假设我有一个PageTable
的值,并用CR3寄存器注册它的物理地址.
#![no_std]
use {
spinning_top::{const_spinlock, Spinlock},
x86_64::structures::paging::PageTable,
};
// The physical address of `PML4` is registered with CR3 register.
static PML4: Spinlock<PageTable> = const_spinlock(PageTable::new());
如果一个页面被访问,处理器将更改条目PML4
的访问位.我担心优化后的代码可能会使用存储在CPU寄存器或堆栈中的缓存值,而不是内存中的实际值,从而导致使用位的旧值.
在这种情况下,影响应该很小,我不在乎访问的位.但是,一般来说,处理器可能意外更改的值(如MMIO和DMA缓冲区)或对该值的引用是否安全?或者我应该每次通过read_volatile
和write_volatile
的原始指针执行读-修改-写循环吗?