1. 处理器缓存(缓存和内存之间的区别)
? ? ? ? 缓存是静态随机访问存储器(SRAM),访问速度接近于处理器的速度,但是集成度低,和内存相比,在容量相同的情况下体积大。内存是动态随机访问存储器(DARM),访问速度慢,但是集成度高,和缓存相比,在容量相同的情况下体积小。
? ? ? ? 平时我们讲多级缓存:一级缓存(集成在处理器内部,离处理器最近,容量小,访问时间是1个时钟周期);二级缓存(可能在处理器内部或者外部,容量更大,访问时间是大约10个时钟周期);高端处理器有三级甚至四级缓存。在SMP系统中,处理器每个核都有独立一级缓存,所有核共享二级缓存。
2.缓存结构
? ? ? ? 我们平时所看到32KB四路组相连缓存(32K-4-way set associative cache),缓存结构如下:
? ? ? ? ? 32KB-4路组相连缓存:缓存由4个子缓存并联组成,四路并联,四路容量和32KB,每路容量是8KB。
缓存行的标签通常是从物理地址生成的,索引可能从物理地址或虚拟生成,根据索引的生成方式把缓存分为两类:
? ? ? ? a. 把从物理地址生成索引和标签的缓存称为物理索引物理标签缓存(PIPT,Physcally Indexed Physically Tagged)。
? ? ? ? b. 把 从虚拟地址生成索引、从物理地址生成标签的缓存称之为虚拟索引物理标签缓存(VIPT,Virtually Indexed Physically Tagged)。
? ? ? ? 比如2个进程共享一物理页,一个物理地址被映射到两虚拟地址。假设页长度为4KB,缓存中每路容量为8KB,缓存行长度为32字节。
? ? ? ? ?缓存行的字节偏移是虚拟地址的第0-4位,索引是虚拟地址的第5-12位。当缓存中每路的容量大于页长度的时候,会出现缓存别名问题。如果缓存中每路的容量小于或等于页长度,那么不会出现缓存别名问题。
? ? ? ? 对于可写的数据,缓存别名问题的危害性:如果修改一个缓存行中的数据,但另一个缓存行的数据依然是旧的,将导致两个虚拟地址读到数据不同,对于指令和只读数据,缓存别名问题没有危害。
? ? ? ? 软件可以规避缓存别名问题,把共享内存映射到进程的虚拟空间的时候,如果分配虚拟内存区域的起始地址是缓存中每路容量的整数倍,就可以规避缓存别名问题。
ARM64处理器架构的指令缓存有三种类型:PIPT缓存、VPIPT和VIPT
3.缓存策略(缓存分配策略) ?
a.写分配(weite allocation):假设处理器写数据的时候没有命中缓存行,那么分配一个缓存行,然后读取数据并填充缓存行,接着把数据写到缓存行。
b.读分配(read allocation):如果处理器读数据的时候没有命中缓存行,那么分配一个缓存行。
缓存更新有2种策略:
a.写回(write-back):处理器写数据的时候,只更新新缓存,把缓存行标记为脏,只在缓存行被替换或被程序清理时候更新内存。
b.写透(write-through):处理器写数据的时候,同时更新缓存和内存,但不会把缓存行标记为脏。
集成在处理器内部缓存使用内存属性,外部缓存使用外部属性,具体使用如下:
4.内核在什么环境下才需要维护缓存?
a.内核修改或者删除也表的时候,需要冲刷缓存;
b.内核使用内核虚拟地址修改进程的物理页,为路避免产生内核虚拟地址和用户虚拟地址之间的缓存别名问题,需要冲刷缓存。
c.和外围设备交互时,处理器写数据到DMA区域的内存块,然后通过设备外围设计的控制器上的控制寄存器发生命令,外围设备通过DMA控制器从物理内存读取数据。
5.ARM64处理器支持3种缓存操作
a.使缓存失效:清除缓存行的有效位。
b.清理缓存行:首先把标记为脏的缓存行里面的数据写到下一级缓存或内存,然后清楚缓存行的有效位。只适用于使用写回策略的数据缓存。
c.清零:把缓存里面的一个内存块清零,不需要先从内存读取数据到缓存,只适用数据缓存。
6.ARM64系统架构的内存如何flush_icache_range,此函数从指令缓存冲刷一个虚拟地址范围。
|