s3c2410 MMU詳解

http://bbs.21ic.com/icview-127516-1-1.html

許多年以前,當人們還在使用DOS或是更古老的操作系統的時候,計算機的內存還非常小,一般都是以K爲單位進行計算,相應的,當時的程序規模也不大,所以內存容量雖然小,但還是可以容納當時的程序。但隨着圖形界面的興起還用用戶需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題出現在程序員的面前,那就是應用程序太大以至於內存容納不下該程序,通常解決的辦法是把程序分割成許多稱爲覆蓋塊(overlay)的片段。覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程序員把程序先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory).虛擬存儲器的基本思想是程序,數據,堆棧的總的大小可以超過物理存儲器的大小,操作系統把當前使用的部分保留在內存中,而把其他未被使用的部分保存在磁盤上。比 如對一個16MB的程序和一個內存只有4MB的機器,OS通過選擇,可以決定各個時刻將哪4M的內容保留在內存中,並在需要時在內存和磁盤間交換程序片 段,這樣就可以把這個16M的程序運行在一個只具有4M內存機器上了。而這個16M的程序在運行前不必由程序員進行分割。

任何時候,計算機上都存在一個程序能夠產生的地址集合,我們稱之爲地址範圍這個範圍的大小由CPU的位數決定,例如一個32位的CPU,它的地址範圍是0~0xFFFFFFFF (4G),而對於一個64位的CPU,它的地址範圍爲0~0xFFFFFFFFFFFFFFFF (64T).這個範圍就是我們的程序能夠產生的地址範圍,我們把這個地址範圍稱爲虛擬地址空間,該空間中的某一個地址我們稱之爲虛擬地址。與虛擬地址空間和虛擬地址相對應的則是物理地址空間物理地址,大多數時候我們的系統所具備的物理地址空間只是虛擬地址空間的一個子集,這裏舉一個最簡單的例子直觀地說明這兩者,對於一臺內存爲256MB的32bit x86主機來說,它的虛擬地址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x000000000~0x0FFFFFFF(256MB)。
在沒有使用虛擬存儲器的機器上,虛擬地址被直接送到內存總線上,使具有相同地址的物理存儲器被讀寫。而在使用了虛擬存儲器的情況下,虛擬地址不是被直接送到內存地址總線上,而是送到內存管理單元——MMU(主角終於出現了:])。他由一個或一組芯片組成,一般存在與協處理器中,其功能是把虛擬地址映射爲物理地址。

大多數使用虛擬存儲器的系統都使用一種稱爲分頁(paging)。虛擬地址空間劃分成稱爲頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。接下來配合圖片我以一個例子說明頁與頁框之間在MMU的調度下是如何進行映射的
mmu1.gif (5.3 KB)
2007-3-23 21:19


在這個例子中我們有一臺可以生成16位地址的機器,它的虛擬地址範圍從0x0000~0xFFFF(64K),而這臺機器只有32K的物理地址,因此他可以運行64K的程序,但該程序不能一次性調入內存運行。這臺機器必須有一個達到可以存放64K程序的外部存儲器(例如磁盤或是FLASH),以保證程序片段在需要時可以被調用。在這個例子中,頁的大小爲4K,頁框大小與頁相同(這點是必須保證的,內存和外圍存儲器之間的傳輸總是以頁爲單位的),對應64K的虛擬地址和32K的物理存儲器,他們分別包含了16個頁和8個頁框。

我們先根據上圖解釋一下分頁後要用到的幾個術語,在上面我們已經接觸了頁框,上圖中綠色部分是物理空間,其中每一格表示一個物理頁框。橘本人

2樓: 到一個頁中的所有地址),8196的二進制碼如下圖所示:
mmu2.jpg (15.79 KB)
2007-3-23 21:19


該地址的頁號索引爲0010(二進制碼),既索引的頁爲頁2,第二部分爲000000000100(二進制),偏移量爲 4。頁2中的頁框號爲6(頁2映射在頁框6,見上圖),我們看到頁框6的物理地址是24~28K。於是MMU計算出虛擬地址8196應該被映射成物理地址 24580(頁框首地址+偏移量=24576+4=24580)。同樣的,若我們對虛擬地址1026進行讀取,1026的二進制碼爲 0000010000000010,page index=0000=0,offset=010000000010=1026。頁號爲0,該頁映射的頁框號爲2,頁框2的物理地址範圍是 8192~12287,故MMU將虛擬地址1026映射爲物理地址9218(頁框首地址+偏移量=8192+1026=9218)
以上就是MMU的工作過程。
下面我們針對s3c2410的MMU(注1)進行講解。
S3c2410總共有4種內存映射方式,分別是:
1.Fault (無映射)
2.Coarse Page (粗表)
3.Section (段)
4.Fine Page (細表)
我們以Section(段)進行說明。

ARM920T是一個32bit的CPU,它的虛擬地址空間爲2^32=4G。而在Section模式,這4G的虛擬空間被分成一個一個稱爲段(Section)的 單位(與我們上面講的頁在本質上其實是一致的),每個段的長度是1M (而我們之前所使用的頁的長度是4K)。4G的虛擬內存總共可以被分成4096個段(1M*4096=4G),因此我們必須用4096個描述符來對這組段 進行描述,每個描述符佔用4個Byte,故這組描述符的大小爲16KB (4K*4096),這4096個描述符構爲一個表格,我們稱其爲Tralaton Table.
clip_image002.jpg (8.57 KB)
2007-3-23 21:29


上圖是描述符的結構
Section base address:段基地址(相當於頁框號首地址)
AP: 訪問控制位Access Permission
Domain: 訪問控制寄存器的索引。Domain與AP配合使用,對訪問權限進行檢查
C:當C被置1時爲write-through (WT)模式
B: 當B被置1時爲write-back (WB)模式
(C,B兩個位在同一時刻只能有一個被置1)

下面是s3c2410內存映射後的一個示意圖:
clip_image001.jpg (55.08 KB)
2007-3-23 21:29


我的s3c2410上配置的SDRSAM大小爲64M,該SDRAM的物理地址範圍是0x3000 0000~0x33FF FFFF(屬於Bank 6),由於1個Section的大小是1M,所以該物理空間可以被分成64個物理段(頁框).
在Section模式下,送進MMU的虛擬地址(注1)被分爲兩部分(這點和我們上面舉的例子是一樣的),這兩部分爲 Descriptor Index(相當於上面例子的Page Index)和 Offset,descript index長度爲12bit(2^12=4096,從這個關係式你能看出什麼?:) ),Offset長度爲20bit(2^20=1M,你又能看出什麼?:)).觀察一下一個描述符(Descriptor)中的Section Base Address部分,它長度爲12 bit,裏面的值是該虛擬段(頁)映射成的物理段(頁框)的物理地址前12bit,由於每一個物理段的長度都是1M,所以物理段首地址的後20bit總是爲0x00000(每個Section都是以1M對齊),確定一個物理地址的方法是 物理頁框基地址+虛擬地址中的偏移部分=Section Base Address<<20+Offset ,呵呵,可能你有點糊塗了,還是舉一個實際例子說明吧。假設現在執行指令
MOV REG, 0x30000012
虛擬地址的二進制碼爲00110000 00000000 00000000 00010010
前12位是Descriptor Index= 00110000 0000=768,故在Translation Table裏面找到第768號描述符,該描述的Section Base Address=0x0300,也就是說描述符所描述的虛擬段(頁)所映射的物理段(頁框)的首地址爲0x3000 0000(物理段(頁框)的基地址=Section Base Address左移20bit=0x0300<<20=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬地址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁框基地址+虛擬地址中的偏移)。你可能會問怎麼這個虛擬地址和映射後的物理地址一樣?這是由我們定義的映射規則所決定的。在這個例子中我們定義的映射規則是把虛擬地址映射成和他相等的物理地址。我們這樣書寫映射關係的代碼:
void mem_mapping_linear(void)
{
    unsigned long descriptor_index, section_base, sdram_base, sdram_size;
    sdram_base=0x30000000;
    sdram_size=0x 4000000;
    for (section _base= sdram_base,descriptor_index = section _base>>20;
         section _base < sdram_base+ sdram_size;
         descriptor_index+=1;section _base +=0x100000)
    {
         *(mmu_tlb_base + (descriptor_index)) = (section _base>>20) | MMU_OTHER_SECDESC;
    }
}

上面的這段段代碼把虛擬空間0x3000 0000~0x33FF FFFF映射到物理空間0x3000 0000~0x33FF FFFF,由於虛擬空間與物理空間空間相吻合,所以虛擬地址與他們各自對應的物理地址在值上是一致的。當初始完Translation Table之後,記得要把Translation Table的首地址(第0號描述符的地址)加載進協處理器CP15的Control Register2(2號控制寄存器)中,該控制寄存器的名稱叫做Translation table base (TTB) register。
以上討論的是descriptor中的Section Base Address以及虛擬地址和物理地址的映射關係,然而MMU還有一個重要的功能,那就是訪問控制機制(Access Permission )。

簡單說訪問控制機制就是CPU通過某種方法判斷當前程序對內存的訪問是否合法(是否有權限對該內存進行訪問),如果當前的程序並沒有權限對即將訪問的內存區域進行操作,則CPU將引發一個異常,s3c2410稱該異常爲Permission fault,x86架構則把這種異常稱之爲通用保護異常(General Protection),什麼情況會引起Permission fault呢?比如處於User級別的程序要對一個System級別的內存區域進行寫操作,這種操作是越權的,應該引起一個Permission fault,搞過x86架構的朋友應該聽過保護模式(Protection Mode),保護模式就是基於這種思想進行工作的,於是我們也可以這麼說:s3c2410的訪問控制機制其實就是一種保護機制。那s3c2410的訪問控制機制到底是由什麼元素去參與完成的呢?它們間是怎麼協調工作的呢?這些元素總共有:
1.協處理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER
2.段描述符中的AP位和Domain位
3.協處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit
4.協處理器CP15中Control Register5(控制寄存器5)
5.協處理器CP15中Control Register6(控制寄存器6)

DOMAIN ACCESS CONTROL REGISTER 訪問控制寄存器,該寄存器有效位爲32,被分成16個區域,每個區域由兩個位組成,他們說明了當前內存的訪問權限檢查的級別,如下圖所示:
mmu5.jpg (16 KB)
2007-3-23 21:19


每區域可以填寫的值有4個,分別爲00,01,10,11(二進制),他們的意義如下所示:
mmu6.jpg (32.18 KB)
2007-3-23 21:19
3樓:
00:當前級別下,該內存區域不允許被訪問,任何的訪問都會引起一個domain fault
01:當前級別下,該內存區域的訪問必須配合該內存區域的段描述符中AP位進行權檢查
10:保留狀態(我們最好不要填寫該值,以免引起不能確定的問題)
11:當前級別下,對該內存區域的訪問都不進行權限檢查。
我們再來看看discriptor中的Domain區域,該區域總共有4個bit,裏面的值是對DOMAIN ACCESS CONTROL REGISTER中16個區域的索引.而AP位配合S bitA bit對當前描述符描述的內存區域被訪問權限的說明,他們的配合關係如下圖所示:

AP位也是有四個值,我結合實例對其進行說明.
在下面的例子中,我們的DOMAIN ACCESS CONTROL REGISTER都被初始化成0xFFFF BDCF,如下圖所示:
mmu7.jpg (23.15 KB)
2007-3-23 21:19


例1:
Discriptor 中的domain=4,AP=10(這種情況下S bit ,A bit 被忽略)
假設現在我要對該描述符描述的內存區域進行訪問:
由於domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。
假設當前CPU處於Supervisor模式下,則程序可以對該描述符描述的內存區域進行讀寫操作。
假設當前CPU處於User模式下,則程序可以對該描述符描述的內存進行讀訪問,若對其進行寫操作則引起一個permission fault.

例2:
Discriptor 中的domain=0,AP=10(這種情況下S bit ,A bit 被忽略)
domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系統對任何內存區域的訪問都不進行訪問權限的檢查。
由於統對任何內存區域的訪問都不進行訪問權限的檢查,所以無論CPU處於合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都可以順利地進行讀寫操作

例3:Discriptor 中的domain=4,AP=11(這種情況下S bit ,A bit 被忽略)
由於domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。
由於AP=11,所以無論CPU處於合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都可以順利地進行讀寫操作

例4:
Discriptor 中的domain=4,AP=00, S bit=0,A bit=0
由於domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。
由於AP=00,S bit=0,A bit=0,所以無論CPU處於合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都只能進行讀操作,否則引起permission fault.
通過以上4個例子我們得出兩個結論:
1.對某個內存區域的訪問是否需要進行權限檢查是由該內存區域的描述符中的Domain域決定的。
2.某個內存區域的訪問權限是由該內存區域的描述符中的AP位和協處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所決定的。

關於訪問控制機制我們就講到這裏.

注1:對於s3c2410來說,MMU是以Modify Visual Address(MVA)進行尋址的,這個地址是Virtual Address的一個變換,我將在以後談論到進程切換的時候中向大家介紹MVA
5樓:
以下內容轉載自中計報
Cache的工作原理
  Cache的工作原理是基於程序訪問的局部性。
對大量典型程序運行情況的分析結果表明,在一個較短的時間間隔內,由程序產生的地址往往集中在存儲器邏輯地址空間的很小範圍內。指令地址的分佈本來就是連續的,再加上循環程序段和子程序段要重複執行多次。因此,對這些地址的訪問就自然地具有時間上集中分佈的傾向。
數據分佈的這種集中傾向不如指令明顯,但對數組的存儲和訪問以及工作單元的選擇都可以使存儲器地址相對集中。這種對局部範圍的存儲器地址頻繁訪問,而對此範圍以外的地址則訪問甚少的現象,就稱爲程序訪問的局部性。
根據程序的局部性原理,可以在主存和CPU通用寄存器之間設置一個高速的容量相對較小的存儲器,把正在執行的指令地址附近的一部分指令或數據從主存調入這 個存儲器,供CPU在一段時間內使用。這對提高程序的運行速度有很大的作用。這個介於主存和CPU之間的高速小容量存儲器稱作高速緩衝存儲器 (Cache)。
系統正是依據此原理,不斷地將與當前指令集相關聯的一個不太大的後繼指令集從內存讀到Cache,然後再與CPU高速傳送,從而達到速度匹配。
CPU對存儲器進行數據請求時,通常先訪問Cache。由於局部性原理不能保證所請求的數據百分之百地在Cache中,這裏便存在一個命中率。即CPU在任一時刻從Cache中可靠獲取數據的機率。
命中率越高,正確獲取數據的可靠性就越大。一般來說,Cache的存儲容量比主存的容量小得多,但不能太小,太小會使命中率太低;也沒有必要過大,過大不僅會增加成本,而且當容量超過一定值後,命中率隨容量的增加將不會有明顯地增長。
只要Cache的空間與主存空間在一定範圍內保持適當比例的映射關係,Cache的命中率還是相當高的。
一般規定Cache與內存的空間比爲4:1000,即128kB Cache可映射32MB內存;256kB Cache可映射64MB內存。在這種情況下,命中率都在90%以上。至於沒有命中的數據,CPU只好直接從內存獲取。獲取的同時,也把它拷進 Cache,以備下次訪問。
Cache的基本結構
Cache通常由相聯存儲器實現。相聯存儲器的每一個存儲塊都具有額外的存儲信息,稱爲標籤(Tag)。當訪問相聯存儲器時,將地址和每一個標籤同時進行比較,從而對標籤相同的存儲塊進行訪問。Cache的3種基本結構如下:
全相聯Cache
在全相聯Cache中,存儲的塊與塊之間,以及存儲順序或保存的存儲器地址之間沒有直接的關係。程序可以訪問很多的子程序、堆棧和段,而它們是位於主存儲器的不同部位上。
因此,Cache保存着很多互不相關的數據塊,Cache必須對每個塊和塊自身的地址加以存儲。當請求數據時,Cache控制器要把請求地址同所有地址加以比較,進行確認。
這種Cache結構的主要優點是,它能夠在給定的時間內去存儲主存器中的不同的塊,命中率高;缺點是每一次請求數據同Cache中的地址進行比較需要相當的時間,速度較慢。
直接映像Cache
直接映像Cache不同於全相聯Cache,地址僅需比較一次。
在直接映像Cache中,由於每個主存儲器的塊在Cache中僅存在一個位置,因而把地址的比較次數減少爲一次。其做法是,爲Cache中的每個塊位置分配一個索引字段,用Tag字段區分存放在Cache位置上的不同的塊。
單路直接映像把主存儲器分成若干頁,主存儲器的每一頁與Cache存儲器的大小相同,匹配的主存儲器的偏移量可以直接映像爲Cache偏移量。Cache的Tag存儲器(偏移量)保存着主存儲器的頁地址(頁號)。
以上可以看出,直接映像Cache優於全相聯Cache,能進行快速查找,其缺點是當主存儲器的組之間做頻繁調用時,Cache控制器必須做多次轉換。
組相聯Cache
組相聯Cache是介於全相聯Cache和直接映像Cache之間的一種結構。這種類型的Cache使用了幾組直接映像的塊,對於某一個給定的索引號,可以允許有幾個塊位置,因而可以增加命中率和系統效率。
Cache與DRAM存取的一致性
在CPU與主存之間增加了Cache之後,便存在數據在CPU和Cache及主存之間如何存取的問題。讀寫各有2種方式。
貫穿讀出式(Look Through)
該方式將Cache隔在CPU與主存之間,CPU對主存的所有數據請求都首先送到Cache,由Cache自行在自身查找。如果命中,則切斷CPU對主存的請求,並將數據送出;不命中,則將數據請求傳給主存。
該方法的優點是降低了CPU對主存的請求次數,缺點是延遲了CPU對主存的訪問時間。
旁路讀出式(Look Aside)
在這種方式中,CPU發出數據請求時,並不是單通道地穿過Cache,而是向Cache和主存同時發出請求。由於Cache速度更快,如果命中,則 Cache在將數據回送給CPU的同時,還來得及中斷CPU對主存的請求;不命中,則Cache不做任何動作,由CPU直接訪問主存。
它的優點是沒有時間延遲,缺點是每次CPU對主存的訪問都存在,這樣,就佔用了一部分總線時間。
寫穿式(Write Through)
任一從CPU發出的寫信號送到Cache的同時,也寫入主存,以保證主存的數據能同步地更新。
它的優點是操作簡單,但由於主存的慢速,降低了系統的寫速度並佔用了總線的時間。
回寫式(Copy Back)
爲了克服貫穿式中每次數據寫入時都要訪問主存,從而導致系統寫速度降低並佔用總線時間的弊病,儘量減少對主存的訪問次數,又有了回寫式。
它是這樣工作的:數據一般只寫到Cache,這樣有可能出現Cache中的數據得到更新而主存中的數據不變(數據陳舊)的情況。但此時可在Cache 中設一標誌地址及數據陳舊的信息,只有當Cache中的數據被再次更改時,纔將原更新的數據寫入主存相應的單元中,然後再接受再次更新的數據。這樣保證了 Cache和主存中的數據不致產生衝突。

…..
你可以通過http://www.chinaunix.net/jh/45/180390.html閱讀完全文


s3c2410 內置了指令緩存(ICaches),數據緩存(DCaches),寫緩存(write buffer) , 物理地址標誌讀寫區 (Physical Address TAG RAM),CPU將通過它們來提高內存訪問效率。
我們先討論指令緩存(ICaches)。
ICaches使用的是虛擬地址,它的大小是16KB,它被分成512行(entry),每行8個字(8 words,32Bits)。
ICaches.jpg (19.94 KB)
2007-3-26 15:41
 
   
6樓:
當系統上電或重起(Reset)的時候,ICaches功能是被關閉的,我們必須往lcr bit置1去開啓它,lcr bit在CP15協處理器中控制寄存器1的第12位(關閉ICaches功能則是往該位置0)。ICaches功能一般是在MMU開啓之後被使用的(爲了降低MMU查錶帶來的開銷),但有一點需要注意,並不是說MMU被開啓了ICaches纔會被開啓,正如本段剛開始講的,ICaches的開啓與關閉是由lcr bit所決定的,無論MMU是否被開啓,只要lcr bit被置1了,ICaches就會發揮它的作用。
大家是否還記得discriptor(描述符)中有一個C bit我們稱之爲Ctt,它是指明該描述符描述的內存區域內的內容(可以是指令也可以是數據)是否可以被Cache,若Ctt=1,則允許Cache,否則不允許被Cache。於是CPU讀取指令出現了下面這些情況:
1.如果CPU從Caches中讀取到所要的一條指令(cache hit)且這條指令所在的內存區域是Cacheble的(該區域
     所屬描述符中Ctt=1),則CPU執行這條指令並從Caches中返回(不需要從內存中讀取)。
2.若CPU從Caches中讀取不到所要的指令(cache miss)而這條指令所在的內存區域是Cacheble的(同第1點),則CPU將從內存中
     讀取這條指令,同時,一個稱爲“8-word linefill”的動作將發生,這個動作是把該指令所處區域的8個word寫進
     ICaches的某個entry中
,這個entry必須是沒有被鎖定的(對鎖定這個操作感興趣的朋友可以找相關的資料進行了解)
3.若CPU從Caches中讀取不到所要的指令(cache miss)而這條指令所在的內存區域是UnCacheble的(該區域所屬描
     述符中Ctt=0),則CPU將從內存讀取這條指令並執行後返回(不發生linefill)

通過以上的說明,我們可以瞭解到CPU是怎麼通過ICaches執行指令的。你可能會有這個疑問,ICaches總共只有512個條目(entry),當 512個條目都被填充完之後,CPU要把新讀取近來的指令放到哪個條目上呢?答案是CPU會把新讀取近來的8個word從512個條目中選擇一個對其進行 寫入,那CPU是怎麼選出一個條目來的呢?這就關係到ICaches的替換法則(replacemnet algorithm)了。ICaches的replacemnet algorithm有兩種,一種是Random模式另一種Round-Robin模式, 我們可以通過CP15協處理器中寄存器1的RR bit對其進行指定(0 = Random replacement 1 = Round robin replacement),如果有需要你還可以進行指令鎖定(INSTRUCTION CACHE LOCKDOWN)。
關於替換法則和指令鎖定我就不做詳細的講解,感興趣的朋友可以找相關的資料進行了解。

接下來我們談數據緩存(DCaches)寫緩存(write buffer)
DCaches使用的是虛擬地址,它的大小是16KB,它被分成512行(entry),每行8個字(8 words,32Bits)。每行有兩個修改標誌位(dirty bits),第一個標誌位標識前4個字,第二個標誌位標識後4個字,同時每行中還有一個TAG 地址(標籤地址)和一個valid bit。
與ICaches一樣,系統上電或重起(Reset)的時候,DCaches功能是被關閉的,我們必須往Ccr bit置1去開啓它,Ccr bit在CP15協處理器中控制寄存器1的第2位(關閉DCaches功能則是往該位置0)。與ICaches不同,DCaches功能是必須在MMU開啓之後才能被使用的。
我們現在討論的都是DCaches,你可能會問那Write Buffer呢?他和DCaches區別是什麼呢? 其實DCachesWrite Buffer兩 者間的操作有着非常緊密的聯繫,很抱歉,到目前爲止我無法說出他們之間有什麼根本上的區別(-_-!!!),但我能告訴你什麼時候使用的是 DCaches,什麼時候使用的是Write Buffer.系統可以通過Ccr bit對Dcaches的功能進行開啓與關閉的設定,但是在s3c2410中卻沒有確定的某個bit可以來開啓或關閉Write Buffer…你可能有點懵…我們還是來看一張表吧,這張表說明了DCaches,Write Buffer和CCr,Ctt (descriptor中的C bit),Btt(descriptor中的B bit)之間的關係,其中“Ctt and Ccr”一項裏面的值是 Ctt與Ccr進行邏輯與之後的值(Ctt&&Ccr).
DCaches.jpg (114.94 KB)
2007-3-26 15:41


從上面的表格中我們可以清楚的知道系統什麼時候使用的是DCaches,什麼時候使用的是Write Buffer,我們也可以看到DCaches的寫回方式是怎麼決定的(write-back or write-througth)。
在這裏我要對Ctt and Ccr=0進行說明,能夠使Ctt and Ccr=0的共有三種情況,分別是
Ctt =0, Ccr=0
Ctt =1, Ccr=0
Ctt =0, Ccr=1
我們分別對其進行說明。
情況1(Ctt =0, Ccr=0):這種情況下CPU的DCaches功能是關閉的(Ccr=0),所以CPU存取數據的時候不會從DCaches裏進行數據地查詢,CPU直接去內存存取數據。
情況2(Ctt =1, Ccr=0):與情況1相同。
情況3(Ctt =0, Ccr=1):這種情況下DCaches功能是開啓的,CPU讀取數據的時候會先從DCaches裏進行數據地查詢,若DCaches中沒有合適的數據,則CPU會去內存進行讀取,但此時由於Ctt =0(Ctt 是descriptor中的C bit,該bit決定該descriptor所描述的內存區域是否可以被Cache),所以CPU不會把讀取到的數據Cache到DCaches(不發生linefill).

到此爲止我們用兩句話總結一下DCaches與Write Buffer的開啓和使用:
1.DCaches與Write Buffer的開啓由Ccr決定。
2.DCaches與Write Buffer的使用規則由Ctt和Btt決定。


DCachesICaches有一個最大的不同,ICaches存放的是指令,DCaches存放的是數據。程序在運行期間指令的內容是不會改變的,所以ICaches中指令所對應的內存空間中的內容不需要更新。但是數據是隨着程序的運行而改變的,所以DCaches中數據必須被及時的更新到內存(這也是爲什麼ICaches沒有寫回操作而DCaches提供了寫回操作的原因)。提到寫回操作,就不得不提到PA TAG 地址(物理標籤地址)這個固件,它也是整個Caches模塊的重要組成部分。
簡單說PA TAG 地址(物理標籤地址)的功能是指明瞭寫回操作必須把DCaches中待寫回內容寫到物理內存的哪個位置。不知道你還記不記得,DCaches中每個entry中都有一個PA TAG 地址(物理標籤地址),當一個linefill發生時,被Cache的內容被寫進了DCaches,同時被Cache的物理地址則被寫入了PA TAG 地址(物理標籤地址)。除了TAG 地址(標籤地址),還有兩個稱爲dirty bit(修改標誌位)的 位出現在DCaches的每一個entry中,它們指明瞭當前entry中的數據是否已經發生了改變(發生改變簡稱爲變“髒”,所以叫dirty bit,老外取名稱可真有意思 -_-!!!)。如果某個entry中的dirty bit置位了,說明該entry已經變髒,於是一個寫回操作將被執行,寫回操作的目的地址則是由PA TAG 地址(物理標籤地址)索引到的物理地址。

關於Caches,Write Buffer更詳細的內容請大家閱讀s3c2410的操作手冊:]
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章