目录
- 原理示意图
- Cache(高速缓存)的详细介绍
- 写缓冲器的介绍
- 重要概念:主存(内存)中的数据除了可以被 CPU 修改,也可能被其他硬件或设备修改
- pgprot_* 系列函数的详细介绍
-
- **1. `pgprot_cached`**
- **2. `pgprot_noncached`**
- **3. `pgprot_writecombine`**
- **4. `pgprot_device`**
- **5. `pgprot_writethrough`**
- **6. `pgprot_writeback`**
- **7. `pgprot_none`**
- **8. `pgprot_exec`**
- **9. `pgprot_user`**
- **10. `pgprot_kernel`**
- **11. `pgprot_modify`**
- **12. `pgprot_val` 和 `__pgprot`**
- **总结:缓存模式与实时性对比**
- 非缓存模式和设备内存模式的区别
原理示意图
Cache 和 写缓冲器 是 CPU 的核心组成部分,属于 CPU 微架构设计的一部分。
下图是CPU核心、Cache(高速缓存)、写缓冲器、主存之间的关系。
Cache(高速缓存) 相当于是一块高速内存;写缓冲器相当于一个 FIFO,可以把多个写操作集合起来一次写入内存。
Cache(高速缓存)的详细介绍
Cache(高速缓存)的概要介绍
Cache 是 CPU 内部(或者在某些情况下,靠近 CPU 的芯片上)的一种高速存储器,用来存储近期访问的数据或指令的副本。
- 特性:
- Cache 通常分为多级(L1、L2、L3),L1 最靠近 CPU,速度最快,但容量最小。
- Cache 数据通常以缓存行(Cache Line)为单位存储和管理。
- 通过保持数据的局部性(时间局部性和空间局部性)来提高性能。
Cache(高速缓存)的读操作原理和流程
- 当 CPU 需要访问内存中的某块数据时,会首先检查 Cache 中是否有该数据(称为 Cache 命中)。
- 如果数据命中,则直接从 Cache 中读取,速度远高于从主内存读取。
- 如果数据未命中(Cache Miss),则需要从主存(RAM)中加载数据,同时可能更新 Cache。
Cache(高速缓存)的写操作原理和流程
在启用了 Cache 的情况下,写数据通常会遵循以下流程:数据优先写入 Cache,然后根据 Cache 的策略再写入主存(内存)。以下是主要的写策略策的工作原理。
1. Write-Through(写直达)
- 工作原理:
- 数据被写入 Cache 的同时,立即写入主存(内存)。
- Cache 和主存始终保持同步。
- 优点:
- 数据一致性较高,主存始终是最新的数据。
- 如果发生 Cache Miss,主存的数据仍然是有效的。
- 缺点:
- 写操作速度较慢,因为每次写入都需要同时更新主存,无法充分利用 Cache 的性能。
- 适用场景:
- 对数据一致性要求较高的场景。
2. Write-Back(写回)
- 工作原理:
- 数据只写入 Cache,并标记该 Cache Line 为“已修改”(Dirty)。
- 数据不会立即写入主存,只有在以下情况之一时才会写回主存:
- 该 Cache Line 被替换(即被新的数据占用时)。
- 主动使用指令或操作(如
flush
)将数据刷新到主存。
- 优点:
- 写操作效率更高,因为减少了对主存的直接写入次数。
- 对多个连续写操作,可以在 Cache 中合并,从而提高性能。
- 缺点:
- 数据一致性较难维护,主存中的数据可能是旧的。
- 如果系统崩溃或电源中断,可能会导致 Cache 中的数据丢失。
- 适用场景:
- 对性能要求高且能容忍一定数据一致性延迟的场景。
3. Write Combining(写合并)
- 工作原理:
- 对多个连续的写操作进行合并,在写缓冲器中批量写入主存。
- 通常用于图像处理、DMA 传输等场景。
- 优点:
- 减少主存写操作次数,提高总的写性能。
- 缺点:
- 数据一致性依赖于合并策略,可能会引入延迟。
- 适用场景:
- 高吞吐量、低数据一致性要求的场景,如硬件设备缓冲区。
写数据的典型流程(以 Write-Back 为例)
-
写入 Cache:
- CPU 通过 Cache Controller 将数据存储到 Cache 中。
- 如果目标地址的 Cache Line 已存在(命中),更新对应的数据。
- 如果未命中,先从主存加载目标地址的 Cache Line,再写入新的数据。
-
标记 Dirty:
- 更新 Cache Line 的标志位,标记为“已修改”(Dirty)。
-
延迟写回:
- 数据不会立即写入主存。
- 当 Cache Line 被替换或需要刷新的时候,Cache Controller 会将 Dirty 数据写回主存。
数据一致性问题
由于数据在 Cache 和主存之间可能存在延迟写入,所以可能会导致以下问题:
-
数据一致性问题:
- 如果 CPU 或设备访问的是主存而不是 Cache,可能读取到旧数据。
- 多核 CPU 或其他硬件设备共享同一内存区域时,需要特别处理一致性。
-
解决方法:
- 内存屏障(Memory Barrier):
- 强制确保在屏障之前的所有操作完成后,才执行屏障之后的操作。
- Cache 刷新(Cache Flush):
- 使用指令(如
clflush
)将 Cache 数据强制写回主存。
- 使用指令(如
- 禁止 Cache:
- 对某些关键内存区域(如设备寄存器),可以禁用 Cache 或使用 Non-Cached 模式。
- 内存屏障(Memory Barrier):
总结
启用 Cache 后,写数据是先写入 Cache,然后再根据策略写入主存。具体的写行为取决于 Cache 策略(Write-Through、Write-Back 或 Write Combining):
- Write-Through:实时同步到主存,数据一致性高,但效率较低。
- Write-Back:延迟写回主存,性能更高,但需要注意一致性问题。
- Write Combining:合并写入,适用于连续写操作,但一致性较弱。
写缓冲器的介绍
其实在看了上面的关于Cache(高速缓存)“写合并”策略,就知道了写缓冲器是怎么回事儿了。
重要概念:主存(内存)中的数据除了可以被 CPU 修改,也可能被其他硬件或设备修改
主存中的数据不仅可以被 CPU 修改,还可能通过以下途径被其他设备修改:
- DMA 设备(如硬盘、网卡、GPU 等)。
- 外设映射内存(Memory-Mapped I/O)。
- 多核 CPU。
- GPU。