【发布时间】:2017-08-11 14:44:01
【问题描述】:
当我们使用malloc和访问内存时,给这个地址空间的物理页面有什么样的页面属性,是可缓存的还是不可缓存的页面?
【问题讨论】:
标签: memory-management linux-kernel linux-device-driver
当我们使用malloc和访问内存时,给这个地址空间的物理页面有什么样的页面属性,是可缓存的还是不可缓存的页面?
【问题讨论】:
标签: memory-management linux-kernel linux-device-driver
普通内存——无论是用户空间还是内核——几乎总是被标记为可缓存的。否则,使用该内存将导致巨大的性能损失。
一般来说,您希望内存被标记为不可缓存的唯一时间是内存实际上是外部设备的一部分(即内存芯片以外的设备):例如,用于存储的 PCI 设备 BAR 区域实现设备控制寄存器。
缓存对性能有好处,因为读取和写入缓存通常比读取和写入底层 RAM 快很多。并且缓存可以“捆绑”读取和写入,从而显着减少 RAM 芯片上的这些操作。不利的一面是,通过使用它,您通常会放弃对 RAM 读写的精确控制。
主 RAM 通常在由缓存控制器确定的“随机”时间读取和写入,并且它通常以称为“缓存线”的大块(32、64 或 128-块)进行读取和写入一次字节。当您将一个值写入缓存内存时,该值可能不会被写入实际的 RAM 芯片,直到某个不确定的稍后时间(如果有的话:它可能会在它被传输出缓存之前被覆盖)。当然,作为记忆的使用者,这一切都隐藏了——你通常甚至不需要意识到它。
但是,如果要写入的内存是控制寄存器——例如设置设备的某种模式或特性——那么你希望在写入时准确设置该寄存器的值,而不是在以后不确定的时候时间,并且您不希望对该寄存器的写入影响地址空间中可能位于它附近的任何其他寄存器。
同样,如果您读取状态寄存器的值,它可能是“易失性的”:即它的值可能会随着对同一寄存器的两次连续读取而改变,因此您不希望缓存该值。并且读取寄存器可能会产生副作用,因此您只希望显式读取来访问它。
【讨论】: