曹彥榮 張銳
摘 要 介紹了Cache技術的基本原理,分析了DMA傳輸過程中存在Cache一致性問題,并介紹了幾種解決Cache一致性問題方法,同時在實際應用中實現(xiàn)了安全的DMA傳輸設計。
關鍵詞 DMA;Cache;數(shù)據(jù)一致性
中圖分類號:TP3 文獻標識碼:A 文章編號:1671-7597(2014)08-0039-02
1 概述
在設計用于存儲嵌入式系統(tǒng)的程序和數(shù)據(jù)的存儲器時,常面臨一個很難的選擇,既希望有便宜而快速的存儲器,但編譯的存儲器速度一般較慢,而快速的存儲器一般不便宜。高速緩沖存儲器Cache最早由Wilkes于1951年構想出來,為了彌合處理器與存儲器之間速度差距而提出的。在計算機系統(tǒng)中,CPU執(zhí)行所需的指令和數(shù)據(jù)都是保存在內(nèi)存中的,但是CPU執(zhí)行指令的速度要明顯高于訪問內(nèi)存的速度。為了彌補主存速度的不足,在CPU和主存之間設置一個高速、小容量的緩沖存貯器(Cache),構成Cache—主存存貯層次。使之從CPU來看,速度接近于Cache的,容量卻是主存的,CPU盡量不直接訪問主存,只與高速Cache交換信息。
由于CPU訪存具有相對的局部性,即CPU從主存取指令或取數(shù)據(jù),在一定時間內(nèi),只是對主存局部地址區(qū)域的訪問,因此將部分內(nèi)存塊預先暫存在Cache中,等到CPU需要訪問時,大多時候直接訪問Cache即可取得指令和數(shù)據(jù),這樣就可以很好的解決CPU執(zhí)行速度和訪存速度的沖突。
2 Cache工作原理
Cache的基本結(jié)構如圖1所示,主要由Cache存儲體、地址映射變換機構、替換機構幾大模塊組成。
圖1 Cache的基本結(jié)構
2.1 Cache存儲體
Cache存儲體以塊(或行)為單位與主存交換信息,為加速Cache與主存之間的調(diào)動,主存大多采用多體結(jié)構,且Cache訪存的優(yōu)先級最高。Cache存儲體中的數(shù)據(jù)實際上是主存的一個副本。
2.2 地址映射變換機構
它將CPU送來的主存地址轉(zhuǎn)換為Cache地址。由于主存和Cache的塊大小相同,塊內(nèi)地址都是相對于塊的起始地址的偏移量,因此地址變換主要是主存的塊號。地址映射方法有很多,典型的方式有:全相聯(lián)映射、直接映射、組相聯(lián)映射和段相聯(lián)映射等。
如果轉(zhuǎn)換后的Cache塊已與CPU欲訪問的主存塊建立了對應關系,即已命中,則CPU可直接訪問Cache存儲體。如果轉(zhuǎn)換后的Cache塊與CPU欲訪問的主存塊未建立對應關系,即不命中。此刻CPU在訪問主存時,不僅將該字從主存取出,同時將它所在的主存塊一并調(diào)入Cache,供CPU使用。將主存塊調(diào)入Cache存儲體時,如果Cache已被裝滿,就得采用替換策略。
2.3 替換機構
當Cache內(nèi)容已滿,無法接受來自主存塊的信息時,就由Cache內(nèi)的替換機構按一定的替換算法來確定應從Cache內(nèi)移出哪個塊返回主存,而把新的主存塊調(diào)入Cache。常用的替換算法有RAND、FIFO、LFU、LRU和OPT等。
2.4 Cache的讀寫操作
Cache讀操作過程比較簡單,流程如圖2所示。
圖2 Cache讀操作過程
Cache寫操作比較復雜,因為對Cache塊內(nèi)寫入的信息,必須與被映射的主存塊內(nèi)的信息完全一致。當程序運行過程中需對某個單元進行寫操作時,會出現(xiàn)Cache一致性問題,即可能存在Cache中的數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)不一致的現(xiàn)象。一般的解決方法有兩種:寫直達法和寫回法。
寫直達法,每次向Cache寫入時,同時也向主存寫入。這樣會增加訪存次數(shù),但作為CPU的讀寫操作,Cache和內(nèi)存數(shù)據(jù)是一致的。
寫回法,數(shù)據(jù)每次只是暫時寫入Cache中,并用標志標明,直到該塊被替換出Cache時,才寫入主存,優(yōu)勢是速度快。
2.5 Cache的改進
Cache剛出現(xiàn)時,典型系統(tǒng)只有一個緩存,但為了進一步提高CPU讀寫效率,提出了分立Cache和多級Cache。
多級Cache,指CPU和內(nèi)存之間設置不止一級的Cache。Cache的目的是,為了給出逼近最快存儲器的速度,同時以較便宜的半導體存儲器的價格提供一個大的存儲器容量。多級Cache也就進一步加速了存儲器訪問速度。
分立Cache,指將指令和數(shù)據(jù)分開,分別存在指令Cache和數(shù)據(jù)Cache中。主要基于兩點考慮:一是指令和數(shù)據(jù)的特性不一樣,指令一般只需讀取,不需對其進行寫操作,而數(shù)據(jù)要進行讀和寫操作;二是為了指令執(zhí)行的控制,將指令和數(shù)據(jù)分開更易于實現(xiàn)超前控制或指令流水線控制。
3 DMA傳輸Cache一致性問題
DMA傳輸方式是一種高效的數(shù)據(jù)傳送方式,它采用專門的硬件(DMA控制器)來控制數(shù)據(jù)傳送,數(shù)據(jù)在外部設備(包括IO設備、硬盤等)和主存儲器之間、或者主存儲器與主存儲器之間直接進行傳送,無需經(jīng)過CPU,并且也不需要CPU的干預。這樣,外設通過DMA控制器可以直接訪問主存儲器,與此同時,CPU可以繼續(xù)執(zhí)行程序,從存儲器中讀取指令或讀寫數(shù)據(jù)。除了CPU寫操作時會遇到Cache數(shù)據(jù)和內(nèi)存數(shù)據(jù)不一致的情況,DMA傳輸同樣也帶來Cache數(shù)據(jù)和內(nèi)存數(shù)據(jù)不一致的問題。
在沒有DMA傳輸?shù)南到y(tǒng)中,只有CPU修改內(nèi)存數(shù)據(jù),采用寫直達法或?qū)懟胤ㄊ沟肅PU讀寫時Cache對于程序員是透明的,數(shù)據(jù)始終一致。但是加入DMA控制器之后情況就變得復雜了,如圖3所示,假設DMA控制器將IO設備中的數(shù)據(jù)傳送至內(nèi)存,這時內(nèi)存中變量A已經(jīng)更新,但Cache中變量A的值不變。將來的某個時刻,CPU要訪問變量A,明明A的值已經(jīng)更新,卻命中Cache獲取了舊值,發(fā)生了數(shù)據(jù)不一致現(xiàn)象。endprint
圖3 Cache一致性問題
解決數(shù)據(jù)傳輸時的Cache一致性主要有以下幾個方法。
1)采用按字傳輸。在內(nèi)存和外設之間傳輸數(shù)據(jù)時,不用DMA方式,采取按字傳輸,典型的做法就是調(diào)用memcpy()函數(shù)。配置好Cache模式(寫直達法或?qū)懟胤ǎ?,Cache對程序員來說是透明的,所有訪問也是安全的。該方案屬于PIO方式,缺點是,首先,傳輸?shù)男什蝗鏒MA方式快;其次,整個傳輸過程需要CPU全程參與,CPU無法執(zhí)行其它任務,對系統(tǒng)性能有很大影響。
2)關閉數(shù)據(jù)Cache。關閉系統(tǒng)的數(shù)據(jù)Cache,只使能指令Cache,這也是一種很有效的做法。CPU在讀寫數(shù)據(jù)時,都直接從內(nèi)存讀取或直接寫入內(nèi)存,數(shù)據(jù)不一致的現(xiàn)象自然也就消除了。由此帶來的缺點也顯而易見,CPU執(zhí)行指令的速度和訪存速度嚴重不匹配,導致系統(tǒng)性能很差勁。
3)不可Cache內(nèi)存的DMA傳輸。在操作系統(tǒng)啟動時,會將內(nèi)存配置成可Cache內(nèi)存和不可Cache內(nèi)存兩種。前者可以映射到Cache中,后者不可以。CPU每次讀寫不可Cache內(nèi)存時,都會發(fā)生Cache不命中,進而直接訪問內(nèi)存,當然這塊內(nèi)存也無法在Cache中形成副本。對于不可Cache內(nèi)存,在DMA傳輸前后不會出現(xiàn)Cache一致性問題,因此不可Cache內(nèi)存也被稱為Cache-safe內(nèi)存。VxWorks操作系統(tǒng)中可以使用cacheDmaMalloc()函數(shù)來分配不可Cache內(nèi)存。
4)可Cache內(nèi)存的DMA傳輸。使用可Cache內(nèi)存進行DMA傳輸之前,如果源地址是內(nèi)存地址,先調(diào)用cacheFlush()函數(shù)將Cache中的數(shù)據(jù)刷新到內(nèi)存中,保證DMA傳輸?shù)氖荂ache中的新值,而不是內(nèi)存中的舊值。DMA傳輸完畢之后,如果目的地址是內(nèi)存地址,需要調(diào)用cacheInvalidate()函數(shù)將Cache中的數(shù)據(jù)置為無效,保證將來CPU訪問數(shù)據(jù)時,獲取的是內(nèi)存中的新值,而不是Cache中的舊值。
4 安全的DMA傳輸設計
在CPU與外設通過PCI總線互聯(lián)的某存儲器模塊上,需要進行DMA傳輸設計,方法1和2的總體性能都不高,不宜采用。因為系統(tǒng)發(fā)起讀寫請求時,極可能使用不可Cache內(nèi)存作為數(shù)據(jù)緩沖區(qū),無法采用方法3,所以只能采用方法4。
對于Cache操作是以塊(Cache行)為單位的,盡管操作系統(tǒng)中提供了刷新Cache和Cache無效的程序,但還是存在邊界問題和對齊問題。如PowerPC處理器以32字節(jié)為一個Cache行,調(diào)用cacheFlush()和cacheInvalidate()函數(shù)只能保證按Cache行對齊時的數(shù)據(jù)一致性,與現(xiàn)實情況還有一定的差異。
安全的DMA傳輸通過以下幾個方面來保證。
1)DMA控制器要求進行DMA傳輸?shù)脑吹刂?、目的地址和傳送長度都必須按8字節(jié)對齊。所以硬件設計上,PCI(PCIe設備兼容PCI)空間的數(shù)據(jù)緩沖區(qū)起始地址按8字節(jié)對齊,同時設備支持8字節(jié)對齊的Burst訪問。
2)通過文件系統(tǒng)的配置修改,使得內(nèi)存中數(shù)據(jù)緩沖頁的起始地址按照8字節(jié)地址對齊。
3)在啟動DMA傳送前和結(jié)束DMA傳送后,對于內(nèi)存數(shù)據(jù)緩沖頁中32字節(jié)對齊部分調(diào)用cacheFlush()刷新或者調(diào)用cacheInvalidate()無效,并且對內(nèi)存數(shù)據(jù)緩沖頁前后非32字節(jié)對齊處做Cache一致性的保護處理,如圖4所示。
圖4 安全的DMA傳輸
參考文獻
[1]鄭緯民,湯志忠.計算機系統(tǒng)結(jié)構(第二版)[M].北京:清華大學出版社,1998.
[2]張晨曦,等.計算機體系結(jié)構[M].北京:高等教育出版社,2000.
[3]武楊.高速緩沖存儲器Cache設計的關鍵技術分析[J].中國科技信息,2006(7).
[4]胡彧,柴華.Cache一致性機制及其相關研究[J].科技情報開發(fā)與經(jīng)濟,2008(17).
作者簡介
曹彥榮(1983-),男,山西臨汾人,工程師,本科,研究方向:計算機硬件設計。endprint
圖3 Cache一致性問題
解決數(shù)據(jù)傳輸時的Cache一致性主要有以下幾個方法。
1)采用按字傳輸。在內(nèi)存和外設之間傳輸數(shù)據(jù)時,不用DMA方式,采取按字傳輸,典型的做法就是調(diào)用memcpy()函數(shù)。配置好Cache模式(寫直達法或?qū)懟胤ǎ?,Cache對程序員來說是透明的,所有訪問也是安全的。該方案屬于PIO方式,缺點是,首先,傳輸?shù)男什蝗鏒MA方式快;其次,整個傳輸過程需要CPU全程參與,CPU無法執(zhí)行其它任務,對系統(tǒng)性能有很大影響。
2)關閉數(shù)據(jù)Cache。關閉系統(tǒng)的數(shù)據(jù)Cache,只使能指令Cache,這也是一種很有效的做法。CPU在讀寫數(shù)據(jù)時,都直接從內(nèi)存讀取或直接寫入內(nèi)存,數(shù)據(jù)不一致的現(xiàn)象自然也就消除了。由此帶來的缺點也顯而易見,CPU執(zhí)行指令的速度和訪存速度嚴重不匹配,導致系統(tǒng)性能很差勁。
3)不可Cache內(nèi)存的DMA傳輸。在操作系統(tǒng)啟動時,會將內(nèi)存配置成可Cache內(nèi)存和不可Cache內(nèi)存兩種。前者可以映射到Cache中,后者不可以。CPU每次讀寫不可Cache內(nèi)存時,都會發(fā)生Cache不命中,進而直接訪問內(nèi)存,當然這塊內(nèi)存也無法在Cache中形成副本。對于不可Cache內(nèi)存,在DMA傳輸前后不會出現(xiàn)Cache一致性問題,因此不可Cache內(nèi)存也被稱為Cache-safe內(nèi)存。VxWorks操作系統(tǒng)中可以使用cacheDmaMalloc()函數(shù)來分配不可Cache內(nèi)存。
4)可Cache內(nèi)存的DMA傳輸。使用可Cache內(nèi)存進行DMA傳輸之前,如果源地址是內(nèi)存地址,先調(diào)用cacheFlush()函數(shù)將Cache中的數(shù)據(jù)刷新到內(nèi)存中,保證DMA傳輸?shù)氖荂ache中的新值,而不是內(nèi)存中的舊值。DMA傳輸完畢之后,如果目的地址是內(nèi)存地址,需要調(diào)用cacheInvalidate()函數(shù)將Cache中的數(shù)據(jù)置為無效,保證將來CPU訪問數(shù)據(jù)時,獲取的是內(nèi)存中的新值,而不是Cache中的舊值。
4 安全的DMA傳輸設計
在CPU與外設通過PCI總線互聯(lián)的某存儲器模塊上,需要進行DMA傳輸設計,方法1和2的總體性能都不高,不宜采用。因為系統(tǒng)發(fā)起讀寫請求時,極可能使用不可Cache內(nèi)存作為數(shù)據(jù)緩沖區(qū),無法采用方法3,所以只能采用方法4。
對于Cache操作是以塊(Cache行)為單位的,盡管操作系統(tǒng)中提供了刷新Cache和Cache無效的程序,但還是存在邊界問題和對齊問題。如PowerPC處理器以32字節(jié)為一個Cache行,調(diào)用cacheFlush()和cacheInvalidate()函數(shù)只能保證按Cache行對齊時的數(shù)據(jù)一致性,與現(xiàn)實情況還有一定的差異。
安全的DMA傳輸通過以下幾個方面來保證。
1)DMA控制器要求進行DMA傳輸?shù)脑吹刂?、目的地址和傳送長度都必須按8字節(jié)對齊。所以硬件設計上,PCI(PCIe設備兼容PCI)空間的數(shù)據(jù)緩沖區(qū)起始地址按8字節(jié)對齊,同時設備支持8字節(jié)對齊的Burst訪問。
2)通過文件系統(tǒng)的配置修改,使得內(nèi)存中數(shù)據(jù)緩沖頁的起始地址按照8字節(jié)地址對齊。
3)在啟動DMA傳送前和結(jié)束DMA傳送后,對于內(nèi)存數(shù)據(jù)緩沖頁中32字節(jié)對齊部分調(diào)用cacheFlush()刷新或者調(diào)用cacheInvalidate()無效,并且對內(nèi)存數(shù)據(jù)緩沖頁前后非32字節(jié)對齊處做Cache一致性的保護處理,如圖4所示。
圖4 安全的DMA傳輸
參考文獻
[1]鄭緯民,湯志忠.計算機系統(tǒng)結(jié)構(第二版)[M].北京:清華大學出版社,1998.
[2]張晨曦,等.計算機體系結(jié)構[M].北京:高等教育出版社,2000.
[3]武楊.高速緩沖存儲器Cache設計的關鍵技術分析[J].中國科技信息,2006(7).
[4]胡彧,柴華.Cache一致性機制及其相關研究[J].科技情報開發(fā)與經(jīng)濟,2008(17).
作者簡介
曹彥榮(1983-),男,山西臨汾人,工程師,本科,研究方向:計算機硬件設計。endprint
圖3 Cache一致性問題
解決數(shù)據(jù)傳輸時的Cache一致性主要有以下幾個方法。
1)采用按字傳輸。在內(nèi)存和外設之間傳輸數(shù)據(jù)時,不用DMA方式,采取按字傳輸,典型的做法就是調(diào)用memcpy()函數(shù)。配置好Cache模式(寫直達法或?qū)懟胤ǎ?,Cache對程序員來說是透明的,所有訪問也是安全的。該方案屬于PIO方式,缺點是,首先,傳輸?shù)男什蝗鏒MA方式快;其次,整個傳輸過程需要CPU全程參與,CPU無法執(zhí)行其它任務,對系統(tǒng)性能有很大影響。
2)關閉數(shù)據(jù)Cache。關閉系統(tǒng)的數(shù)據(jù)Cache,只使能指令Cache,這也是一種很有效的做法。CPU在讀寫數(shù)據(jù)時,都直接從內(nèi)存讀取或直接寫入內(nèi)存,數(shù)據(jù)不一致的現(xiàn)象自然也就消除了。由此帶來的缺點也顯而易見,CPU執(zhí)行指令的速度和訪存速度嚴重不匹配,導致系統(tǒng)性能很差勁。
3)不可Cache內(nèi)存的DMA傳輸。在操作系統(tǒng)啟動時,會將內(nèi)存配置成可Cache內(nèi)存和不可Cache內(nèi)存兩種。前者可以映射到Cache中,后者不可以。CPU每次讀寫不可Cache內(nèi)存時,都會發(fā)生Cache不命中,進而直接訪問內(nèi)存,當然這塊內(nèi)存也無法在Cache中形成副本。對于不可Cache內(nèi)存,在DMA傳輸前后不會出現(xiàn)Cache一致性問題,因此不可Cache內(nèi)存也被稱為Cache-safe內(nèi)存。VxWorks操作系統(tǒng)中可以使用cacheDmaMalloc()函數(shù)來分配不可Cache內(nèi)存。
4)可Cache內(nèi)存的DMA傳輸。使用可Cache內(nèi)存進行DMA傳輸之前,如果源地址是內(nèi)存地址,先調(diào)用cacheFlush()函數(shù)將Cache中的數(shù)據(jù)刷新到內(nèi)存中,保證DMA傳輸?shù)氖荂ache中的新值,而不是內(nèi)存中的舊值。DMA傳輸完畢之后,如果目的地址是內(nèi)存地址,需要調(diào)用cacheInvalidate()函數(shù)將Cache中的數(shù)據(jù)置為無效,保證將來CPU訪問數(shù)據(jù)時,獲取的是內(nèi)存中的新值,而不是Cache中的舊值。
4 安全的DMA傳輸設計
在CPU與外設通過PCI總線互聯(lián)的某存儲器模塊上,需要進行DMA傳輸設計,方法1和2的總體性能都不高,不宜采用。因為系統(tǒng)發(fā)起讀寫請求時,極可能使用不可Cache內(nèi)存作為數(shù)據(jù)緩沖區(qū),無法采用方法3,所以只能采用方法4。
對于Cache操作是以塊(Cache行)為單位的,盡管操作系統(tǒng)中提供了刷新Cache和Cache無效的程序,但還是存在邊界問題和對齊問題。如PowerPC處理器以32字節(jié)為一個Cache行,調(diào)用cacheFlush()和cacheInvalidate()函數(shù)只能保證按Cache行對齊時的數(shù)據(jù)一致性,與現(xiàn)實情況還有一定的差異。
安全的DMA傳輸通過以下幾個方面來保證。
1)DMA控制器要求進行DMA傳輸?shù)脑吹刂?、目的地址和傳送長度都必須按8字節(jié)對齊。所以硬件設計上,PCI(PCIe設備兼容PCI)空間的數(shù)據(jù)緩沖區(qū)起始地址按8字節(jié)對齊,同時設備支持8字節(jié)對齊的Burst訪問。
2)通過文件系統(tǒng)的配置修改,使得內(nèi)存中數(shù)據(jù)緩沖頁的起始地址按照8字節(jié)地址對齊。
3)在啟動DMA傳送前和結(jié)束DMA傳送后,對于內(nèi)存數(shù)據(jù)緩沖頁中32字節(jié)對齊部分調(diào)用cacheFlush()刷新或者調(diào)用cacheInvalidate()無效,并且對內(nèi)存數(shù)據(jù)緩沖頁前后非32字節(jié)對齊處做Cache一致性的保護處理,如圖4所示。
圖4 安全的DMA傳輸
參考文獻
[1]鄭緯民,湯志忠.計算機系統(tǒng)結(jié)構(第二版)[M].北京:清華大學出版社,1998.
[2]張晨曦,等.計算機體系結(jié)構[M].北京:高等教育出版社,2000.
[3]武楊.高速緩沖存儲器Cache設計的關鍵技術分析[J].中國科技信息,2006(7).
[4]胡彧,柴華.Cache一致性機制及其相關研究[J].科技情報開發(fā)與經(jīng)濟,2008(17).
作者簡介
曹彥榮(1983-),男,山西臨汾人,工程師,本科,研究方向:計算機硬件設計。endprint