是否将malloc内存页面属性设置为可缓存或不可缓存?

问题描述:

当我们使用malloc和访问内存时,为这个地址空间提供的物理页面具有什么样的页面属性,它们是可缓存的还是不可缓存的页面?是否将malloc内存页面属性设置为可缓存或不可缓存?

普通内存 - 无论是用户空间还是内核 - 几乎总是被标记为可缓存的。否则,使用该内存将会导致巨大的性能下降。

一般而言,您希望内存被标记为不可缓存的唯一时间是内存实际上是外部设备(即内存芯片之外的设备)的一部分:例如,使用的PCI设备BAR区域实现设备控制寄存器。

缓存对性能有好处,因为读取和写入缓存通常比读写底层RAM的速度快。高速缓存可以“捆绑”读取和写入,以便RAM芯片上的这些操作大大减少。缺点是通过使用它,您通常会放弃对RAM读写的精确控制。

主RAM通常在高速缓存控制器确定的“随机”时间读取和写入,并且它通常被读取和写入称为“高速缓存行”的大块 - 32,64或128块一次一个字节。当你向高速缓存的内存写入一个值时,该值可能不会写入实际的RAM芯片,直到稍后的某个时间不确定(如果有的话:它可能会在从缓存中传出之前被覆盖)。这当然会把你隐藏起来成为记忆的使用者 - 你通常甚至不需要意识到它。

但是,如果正在写入的内存是一个控制寄存器 - 例如设置某个设备的某种模式或特征 - 那么您希望该寄存器的值恰好在写入时设置,而不是不确定稍后的时间,并且您不希望写入该寄存器影响地址空间中可能位于其附近的任何其他寄存器。同样,如果你读取状态寄存器的值,它可能是“易失性”的:即它的值可能随着同一个寄存器的两次连续读取而改变,所以你不希望这个值被缓存。读取寄存器可能有副作用,所以你只需要显式读取来访问它。