从内存读/写数据的x86指令如何与L1和L2缓存交互?

从内存读/写数据的x86指令如何与L1和L2缓存交互?,x86,cpu,cpu-cache,X86,Cpu,Cpu Cache,假设我在x86中有这样一条指令,它希望从内存中的地址读取数据 mov eax, word_123456 大概这将从内存中获取数据。现在让我们假设我存储它 mov word_123456, eax 我从CPU架构图中知道,在随机访问内存和CPU之间有缓存。如果我要求将寄存器的内容存储在内存中,它是否总是首先进入一级缓存?谁来决定它最终进入哪个缓存?另外,我很好奇您是否可以编写/提示x86命令,以指定移动操作是应该存储在缓存中还是将成为罕见的读/写操作,等等。默认情况下,所有内容都将同时进入一级

假设我在x86中有这样一条指令,它希望从内存中的地址读取数据

mov eax, word_123456
大概这将从内存中获取数据。现在让我们假设我存储它

mov word_123456, eax

我从CPU架构图中知道,在随机访问内存和CPU之间有缓存。如果我要求将寄存器的内容存储在内存中,它是否总是首先进入一级缓存?谁来决定它最终进入哪个缓存?另外,我很好奇您是否可以编写/提示x86命令,以指定移动操作是应该存储在缓存中还是将成为罕见的读/写操作,等等。

默认情况下,所有内容都将同时进入一级缓存和二级缓存。(我稍微简化了WRT原子访问,但如果你只是在做一个
mov
,那就是问题所在。)它并不是真的“先”进入一级缓存,而是一旦你将它读入寄存器,缓存线也会被缓存以备以后使用

(我在这里也得到了一些特定的架构。一些架构选择使两个缓存互斥,例如从二级缓存中删除二级缓存线以将其放入一级缓存。但这对代码性能没有太大影响,因为二级缓存比一级缓存大得多。这更像是一种簿记ng.)

二级缓存的目的是要比一级缓存大,这样,如果一级缓存中存在某个内容,但后来被逐出,希望它仍在二级缓存中,而不需要一直访问RAM


是的,您可以提示写操作绕过缓存。例如,
moventi
就是为了这个目的。不过,对于所有的纯写访问,不要费心手动使用
moventi
。实际的性能好处很小,即使您当前的函数没有从内存中读取,也有相当大的机会其他即将执行的代码将。

这在很大程度上取决于特定的系统细节,即使在x86行内,因为缓存体系结构已经改变并将继续这样做。一些缓存是回写还是直写。一些缓存是包含的还是独占的,分配的还是非分配的。缓存线替换算法不同,等等……简言之,如果没有一个非常具体的系统参考,这个问题没有一个答案。它主要由操作系统设置的页表和页属性表配置。您可以有具有不同内存类型的不同页--未缓存、强未缓存、回写、直写、写合并。请参阅