linux內存管理 (二) [硬件] 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

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讀

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