linux内存管理 (二) [硬件1] MMU及其运行过程 关键过程三 cache

===========================================
虚拟地址和物理地址的转换 关键过程3 根据物理地址pa从cache中获取value
	缓存中的基本存储单元是缓存线。
	缓存线包含缓存数据或指令时称为有效,不包含缓存数据或指令时称为无效。
	重置时,缓存中的所有缓存线都将失效。当数据或指令从内存加载到缓存线时,缓存线将变为有效。
	当缓存线有效时,它包含连续主存位置块的最新值。
	缓存线的长度总是2的幂,通常在1664字节的范围内。
	如果缓存线长度为2L字节,则主内存位置块总是2L字节对齐。
	
	由于这种对齐要求,虚拟地址位[31:L]对于缓存线中的所有字节都是相同的。
	当ARM处理器提供的地址的位[31:L]与有效缓存线关联的地址的位匹配时,就会发生缓存命中。
	传统上这是一个虚拟地址匹配。但是,从ARMv6开始,指定的行为与物理寻址缓存对齐。

cache 是什么

https://blog.csdn.net/l471094842/article/details/105599876/
问题及cache的引出
	Cache的功能是用来存放那些近期需要运行的指令与数据
	目的是提高CPU对存储器的访问速度。

位置
	高速缓冲存储器是存在于主存与CPU之间的一级存储器
物理组成
	由静态存储芯片(SRAM)组成
	主要由三大部分组成:
        Cache存储体:存放由主存调入的指令与数据块。
        地址转换部件:建立目录表以实现主存地址到缓存地址的转换。
        替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。
容量
	容量比较小
速度
	速度比主存高得多,接近于CPU的速度。


cache 主要技术问题

  • 一是主存地址与缓存地址的映象及转换

Cache的容量很小,它保存的内容只是主存内容的一个子集,且Cache与主存的数据交换是以块(cache line)为单位的。
为了把信息放到Cache中,必须应用某种函数把主存地址定位到Cache中,这称为地址映射。

在信息按这种映射关系装入Cache后,CPU执行程序时,会将程序中的主存地址变换成Cache地址,这个变换过程叫做地址变换。

地址映象是指某一数据在内存中的地址与在缓冲中的地址,两者之间的对应关系。
下面介绍三种地址映象的方式。
	1.全相联方式
	2.直接相联方式
	3.组相联映象方式
  • 二是按一定原则对Cache的内容进行替换
// cache 的大小是一定的
当cache 满的时候, 总会有新的热内存 不在 cache 里面, 那么就需要
	1.选择要清空的 cache 的空间(例如0-511 cache line)
	2.将 对应的cache line 中的 512 cache 内容清空
	3.将热内存数据 往 0-512 cache line  里面送

选择要清空的 cache 的空间 就涉及到算法
	随机
	先进先出
	后进先出
	LRU(近期最少使用)
		

  • 如何提高cache性能
减少命中时间
减少未命中率
减少未命中惩罚
  • cache 的操作过程及cache一致性
https://blog.csdn.net/qq_21792169/article/details/81873254

在多核CPU中每个核拥有独立的L1和L2两级cache
L1 Cache一般把指令和数据分布存放,数据Cache用来存储数据,而指令Cache用于存放指令
从过程来讲,对cache 的操作分为三个过程
	1.从内存读数据到cache
	2.写cache // 读cache没有什么技术性问题需要讨论,忽略
	3.将cache内容写回内存,同时disable掉 对应的cache line.

1.从内存读数据到cache 

2. 写cache
	2.1.写cache 并做核间cache同步(cpu执行Cache一致性算法) // MESI
		为了保证所有的核看到正确的内存数据
			一个核在写入L1 cache后
			CPU会执行Cache一致性算法(Cache一致性算法在本文不涉及)把对应的cacheline(cache line是cache与内存数据交换的最小单位,如图3所示)同步到其他核
			
		这个过程并不很快,是微秒级的,相比之下写入L1 cache只需要若干纳秒。
		当很多线程在频繁修改某个字段时,这个字段所在的cache line被不停地同步到不同的核上,就像在核间弹来弹去,这个现象就叫做cache bouncing。
		至于要不要写回内存,要看对应的写策略

	2.2.写cache并做cache/内存同步 //将cache内容写回内存 // 此时是不是要把cache line disable掉?
		内存的数据被加载到Cache后,在某个时刻其要被写回内存
		写内存有如下5种策略:
			写通(write-through)//http://blog.sina.com.cn/s/blog_928198ff01010xuh.html
			写回(write-back)
			写一次(write-once)
			WC(write-combining)
			UC(uncacheable)。

3. 将cache 写入内存
	参考2.2

cache 的OPS

在ARMv6中,高速缓存的类型可以由系统协处理器寄存器0确定,并通过寄存器179控制。

// 在ARMv6中,高速缓存的类型可以由系统协处理器寄存器0确定,并通过寄存器1、7和9控制。

http://blog.chinaunix.net/uid-26833883-id-3348379.html
只有开关吗? MESI
void icache_enable()
{
    unsigned int temp = 1 << 12;

    asm(
        "mrc p15,0,r0,c1,c0,0\n"
        "orr r0,r0,%0\n"
        "mcr p15,0,r0,c1,c0,0\n"
        :
        :"r"(temp)
        :"r0"
    );

    return;
}

void icache_disable()
{
    unsigned int temp = 1 << 12;

    asm(
        "mrc p15,0,r0,c1,c0,0\n"
        "bic r0,r0,%0\n"
        "mcr p15,0,r0,c1,c0,0\n"
        :
        :"r"(temp)
        :"r0"
    );

    return;
}
L1cache一级缓存

armv4v5
	ARM缓存通常被实现为虚地址缓存,虚拟索引和虚拟地址标签。
	在这个模型中,物理页面只映射到一个虚拟页面,否则结果是不可预测的。
	这些实现没有在单个物理页的多个虚拟副本之间提供一致性。
ARMv6
	指定了一个缓存体系结构,其中预期的行为通常与物理标记的缓存关联。
	ARMv6 L1缓存体系结构的设计目的是减少上下文开关上的缓存清除和/或失效要求,并支持到特定内存位置的多个虚拟地址别名。
	在协处理器系统控制寄存器(CP15)中提供了该子系统内高速缓存的大小、关联性或组织的灵活性。

缓存分类(指令缓存和数据缓存)
	可以是具有单个统一缓存的von Neumann体系结构。
	也可以是具有单独指令和数据缓存的哈佛体系结构.在哈佛体系结构中,
		实现不需要包括硬件支持,以实现指令和数据缓存之间的一致性。
		如果需要这种支持,例如,在自我修改代码的情况下,软件必须使用缓存清理指令来避免此类问题。


ARMv6一级缓存必须在软件中显示为以下行为:
	•对于不同的虚拟到物理映射,缓存中的条目不需要由软件清除和/或失效
	•在相同的物理地址别名可能存在于页表中描述为可缓存的内存区域中,受BK-11页上页表映射限制的4KB小页限制的限制。


缓存可以通过 满足这些行为要求的 虚拟或物理寻址(包括索引) 来实现。
ARMv6 L1缓存管理使用虚拟地址,这与早期的体系结构指导原则和实现是一致的。

L2cache
一级缓存始终与核心紧密耦合,但二级缓存可以是:
	•与核心紧密耦合
	•在系统总线上实现为内存映射外设。

二级缓存的管理
	一个推荐的最小 二级缓存命令集 被定义用来 配置和控制。
	
	紧密耦合的二级缓存必须通过系统控制协处理器进行管理。
		实现定义了它们是使用虚拟地址还是物理地址来实现控制功能。
	
	内存映射的二级缓存必须使用基于物理地址的控件。

L3缓存的管理
	可能有更高级别(L3)的缓存,但在ARMv6中不强制要求对其进行控制,除非它们必须符合:
		•B4-11页内存区域属性中描述的内部和外部属性模型。
		•通过系统控制协处理器接口管理多级缓存相关的一致性需求,请参见第B6-12页的附加缓存级别注意事项。


cache 与 write buffer

cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到**加快访问速度**的作用。


而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以**减少响应次数**(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了)。



1、Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。

2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。

3、假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。

4、TLB(Translation Lookaside Buffer,翻译后备缓冲器)名字起错了,其实它是一个cache.


----------------------------------

buffer : 流量整形,缓和冲击
cache  : 加快速度,

拿cache做buffer用行不行?当然行,只要能控制cache淘汰逻辑就没有任何问题。
拿buffer做cache用呢?貌似在很特殊的情况下,能确定访问顺序的时候,也是可以的.

TLB 属于 cache

https://www.zhihu.com/question/26190832
https://blog.csdn.net/weibo1230123/article/details/83443326


write buffer 
	流量整形
	cpu写,刷新到外存

read cache
	加快读写
	cpu写,cpu读

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章