2013-02-27 42 views
0

假设我有一个8字节的long pointer到我的程序物理内存中的内存位置。我的程序很小,完全可以放入缓存中。该计划很简单。它简单地通过mmap()调用映射/dev/mem中的物理内存中的任意内存位置,通过该8字节长指针读取并写回该位置。但是,该位置离我的程序驻留在物理内存中的位置很远,因此,L1/L2缓存无法覆盖该地址。当CPU写入不在缓存中的内存位置时,CPU会做什么?

根据文章获得物理与存储(由古斯塔沃·杜阿尔特写的,我不能链接),存储器写入时有一个存储单元中的缓存行已准备好被写入RAM只发生

通常,内核将所有RAM存储器视为回写,这会产生最佳性能 。在回写模式下,内存访问单元为高速缓存行 ,Core 2中有64个字节。如果程序在内存中读取单个字节 ,则处理器会将包含该字节的整个高速缓存行加载到L2中,并且L1缓存。当程序写入内存时, 处理器仅修改缓存中的行,但不更新主内存。后来,当有必要发布修改后的 线公交车,整个高速缓存行是在一次

书面但如果作为目标的存储器位置不在缓存中(正如我上面所描述的)东西,将它立即写入?

回答

1

您引用的参考文献解释了在这种情况下会发生什么 - 如果内存地址最近未被访问,并且尚未加载到高速缓存行中,则您读到该位置将导致该内存中的内容位置 - 以及可能的周边位置 - 被读入缓存行。一旦进入高速缓存,写入相关存储器地址将发生到该高速缓存行,直到在某个时刻主存储器被更新的高速缓存行更新为止。

+0

谢谢。那么还有没有其他方式可以让内存写入不通过缓存?例如,我想从地址A写入一个字节到地址B.字节A是否必须到达缓存,并且其内容被检索并写入地址B?是否有任何内存读取/写入操作不通过缓存? – Amumu 2013-02-27 08:54:14

+0

这是一个非常系统(处理器/操作系统)的依赖..例如,在x86/x64架构中['Memory type range registers'](http://en.wikipedia.org/wiki/Memory_type_range_register)和['Page属性表](http://en.wikipedia.org/wiki/Page_attribute_table)允许将某些内存区域设置为未缓存。我相信不同的操作系统以不同的方式揭示这一点。 – Michael 2013-02-27 09:39:18