1

long pointer假设我的程序的物理内存中的内存位置有 8 个字节。我的程序很小,可以完全放入缓存中。程序很简单。它只是映射(通过 mmap() 调用)从物理内存 in 的任意内存位置/dev/mem,通过该 8 字节长的指针读取和写入该位置。但是,该位置离我的程序在物理内存中的位置非常远,因此,L1/L2 缓存无法覆盖该地址。

根据文章 Getting Physical With Memory(由 Gustavo Duarte 撰写,我无法链接),仅当具有该内存位置的缓存线准备好写入 RAM 时才会发生内存写入:

通常,内核将所有 RAM 内存视为回写,这会产生最佳性能。在回写模式下,内存访问的单位是高速缓存行,在核心 2 中为 64 字节。如果程序读取内存中的单个字节,处理器会将包含该字节的整个高速缓存行加载到 L2 和 L1 高速缓存中。当程序写入内存时,处理器只修改缓存中的行,而不更新主存。稍后,当需要将修改后的行发布到总线时,会立即写入整个缓存行

但是如果目标内存位置不在缓存中(如上所述),它会立即被写入吗?

4

1 回答 1

1

您引用的参考资料解释了在这种情况下会发生什么 - 如果内存地址最近没有被访问,并且尚未加载到缓存行中,那么您对该位置的读取将导致该内存位置的内容 - 并且可能周围的位置 - 被读入高速缓存行。一旦在缓存中写入相关的内存地址,就会发生在这个缓存行中,直到某个时候主内存被修改后的缓存行更新。

于 2013-02-27T08:42:29.030 回答